tcpdump
tcpdump 是一款经典的网络抓包工具。常用选项:
- -n 使用 IP 地址而不使用主机名
- -i 指定要监听的网卡接口
- port 指定要监听的端口号
环境准备
两个 ubuntu 系统
192.168.8.103
作为服务端,起了一个 redis
进程,监听 3306
端口。
192.168.8.103
为客户端,用 telnet
连接服务端3306端口。
三次握手与四次挥手的逻辑
使用 tcpdump 观察三次握手和四次挥手
在服务端运行如下命令:
sudo tcpdump -i ens33 port 6379 -n
客户端运行命令:
当客户端刚连上时,服务端会打印出前三条信息,即为tcp的三次握手。
当在客户端输入 quit
后,主动断开连接,服务端会打印后面三条信息,即为tcp的四次挥手。
如下为服务端打印出的信息:
// 三次握手
12:32:16.894061 IP 192.168.8.102.58072 > 192.168.8.103.6379: Flags [S], seq 656925447, win 29200, options [mss 1460,sackOK,TS val 1768639089 ecr 0,nop,wscale 7], length 0
12:32:16.894104 IP 192.168.8.103.6379 > 192.168.8.102.58072: Flags [S.], seq 220558515, ack 656925448, win 28960, options [mss 1460,sackOK,TS val 1549994474 ecr 1768639089,nop,wscale 7], length 0
12:32:16.894702 IP 192.168.8.102.58072 > 192.168.8.103.6379: Flags [.], ack 1, win 229, options [nop,nop,TS val 1768639090 ecr 1549994474], length 0
// 四次挥手
12:32:20.190935 IP 192.168.8.102.58072 > 192.168.8.103.6379: Flags [F.], seq 1, ack 1, win 229, options [nop,nop,TS val 1768642385 ecr 1549994474], length 0
12:32:20.191577 IP 192.168.8.103.6379 > 192.168.8.102.58072: Flags [F.], seq 1, ack 2, win 227, options [nop,nop,TS val 1549997770 ecr 1768642385], length 0
12:32:20.192604 IP 192.168.8.102.58072 > 192.168.8.103.6379: Flags [.], ack 2, win 229, options [nop,nop,TS val 1768642387 ecr 1549997770], length 0
三次握手:
- 首先是客户端(
192.168.8.102.58072
)向服务端(192.168.8.103.6379
)发送了一个包,Flags [S]
,即SYN
,即第一行 - 在第二行,服务端返回一个
Flags [S .]
,即SYN
和ACK
- 第三行,客户端发送一个确认包,
Flags[ . ]
,即ACK
当连接建立后,在客户端输入 quit
,关闭连接,查看四次挥手的情况。
四次挥手:
- 第四行,第一次挥手。客户端主动发送
Flags [F . ]
包,即ACK
和FIN
- 第五行,第二次和第三次挥手。当客户端主动断开时,服务端可以将第二次挥手省略,只发送一个
Flags [ F .]
包,即ACK
和FIN
- 第六行,第四次挥手。客户端确认连接断开,发送
Flags [ . ]
,即ACK