前言
中午闲来无事,想通过抓包来看下TCP三次握手和四次挥手,然后通过数据来描述出来。说干就干~用工具就算了,虽说猿类最擅长的就是使用工具—命令行抓包。

TCPDump
tcpdump是Unix/Linux 下的抓包工具,在Mac os上也有实现,我这电脑也许之前安装了,也许自带的,如果没有实现的可以通过brew安装。tcpdump很灵活,可以指定网卡,端口,协议进行抓包。

WGet
喜欢敲命令的大佬们,对这个一定不会陌生,下载文件必不可少的命令wget,也可以通过brew安装。

Tcpdump简单介绍
* -A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: 即Handy for capturing web pages).
* -c count tcpdump将在接受到count个数据包后退出
* -i 指定tcpdump需要监听的接口
* -n 不对地址(比如, 主机地址, 端口号)进行数字表示到名字表示的转换.
* -D 获取适配器列表

会遇见的FLAG:
S SYN 同步信号
A ACK 已经同步
F FIN 发送方完成数据发送
P PSH 尽可能快的将数据送往接收进程
R RST 复位连接
. 将以上比特标志设置为0
命令:

sudo tcpdump host www.baidu.com

需要用到管理员权限,所以用sudo执行。
新开另一个命令窗口

wget www.baidu.com

控制台输出信息

tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes
^[15:21:09.526821 IP 192.168.255.10.53361 > 110.242.68.3.http: Flags [S], seq 3980398384, win 65535, options [mss 16344,nop,wscale 6,nop,nop,TS val 1000787153 ecr 0,sackOK,eol], length 0
15:21:09.527134 IP 110.242.68.3.http > 192.168.255.10.53361: Flags [S.], seq 3229019121, ack 3980398385, win 65535, options [mss 16344,nop,nop,TS val 3629702232 ecr 1000787153,nop,wscale 5], length 0
15:21:09.527157 IP 192.168.255.10.53361 > 110.242.68.3.http: Flags [.], ack 1, win 6379, options [nop,nop,TS val 1000787153 ecr 3629702232], length 0
15:21:09.527323 IP 192.168.255.10.53361 > 110.242.68.3.http: Flags [P.], seq 1:129, ack 1, win 6379, options [nop,nop,TS val 1000787153 ecr 3629702232], length 128: HTTP: GET / HTTP/1.1
15:21:09.527579 IP 110.242.68.3.http > 192.168.255.10.53361: Flags [.], ack 129, win 32764, options [nop,nop,TS val 3629702232 ecr 1000787153], length 0
15:21:10.915077 IP 110.242.68.3.http > 192.168.255.10.53361: Flags [P.], seq 1:2580, ack 129, win 32768, options [nop,nop,TS val 3629703619 ecr 1000787153], length 2579: HTTP: HTTP/1.1 200 OK
15:21:10.915165 IP 192.168.255.10.53361 > 110.242.68.3.http: Flags [.], ack 2580, win 6339, options [nop,nop,TS val 1000788516 ecr 3629703619], length 0
15:21:10.919356 IP 192.168.255.10.53361 > 110.242.68.3.http: Flags [F.], seq 129, ack 2580, win 6339, options [nop,nop,TS val 1000788519 ecr 3629703619], length 0
15:21:10.919731 IP 110.242.68.3.http > 192.168.255.10.53361: Flags [.], ack 130, win 32768, options [nop,nop,TS val 3629703624 ecr 1000788516], length 0
15:21:10.919897 IP 110.242.68.3.http > 192.168.255.10.53361: Flags [F.], seq 2580, ack 130, win 32768, options [nop,nop,TS val 3629703624 ecr 1000788519], length 0
15:21:10.919960 IP 192.168.255.10.53361 > 110.242.68.3.http: Flags [.], ack 2581, win 6339, options [nop,nop,TS val 1000788519 ecr 3629703624], length 0

what 。。。。怎么这么多次,怎么跟看过的博客不一样。。。这都是什么
可以看出这里完整表现了三个阶段:
1.tcp三次握手
2.数据传输
3.tcp四次挥手

主要细节没有写,抓个包,画个图,加深下印象。
不要问我为什么会是四次挥手,而不是三次?
为什么不在第二次挥手后就给client说我也要关闭了。
因为第一次挥手是client端主动发送,server端被动收到,第二次挥手是server端主动发送,说我收到了你的关闭信息。此时server端还是有可能会发送数据,所以不能关闭。还要进行三次、四次挥手。

发表评论

邮箱地址不会被公开。