传输层TCP三次握手四次挥手-tcpdump抓包ftp应用
通过tcpdump抓包ftp应用(port 21),我们来了解下传输层TCP的三次握手和四次挥手,数据包是什么样的。
准备工作
机器上未安装tcpdump的,先安装下:
$ yum install -y tcpdump
- client_ip 111.199.9.245
- server_ip 115.159.105.52
TCP连接的建立和终止
TCP的三次握手
服务端 (hansongda.host)
tcpdump抓包tcp层,指定端口如下:
$ sudo tcpdump -S tcp port 21
- -S 表示使用绝对tcp序列编号,而非相对的。默认相对,比如ack是1,表示+1。
客户端 (111.199.9.245)
$ ftp work@115.159.105.5
三次握手
-
客户端发送seq 113210771
-
服务端收到发送确认帧 seq 2856439938,ack 113210771+1
-
客户端收到发送确认帧 ack 2856439938+1
TCP的四次挥手
利用ftp 执行关闭close 查看TCP四次挥手。
服务端 (hansongda.host)
$ sudo tcpdump -S tcp port 21
客户端(111.199.9.245)
close 操作
$ ftp> close
注意看 ftp中执行close的这7行,
- 第一行:客户端发送给ftp服务端,告诉server端,我要QUIT了。
- 第二行:server端发送给客户端,Goodbye了。
这两行实际上是消息数据的传递,不属于挥手的过程。从flags是push类型,或者length不是0都能看出来(握手和挥手是不需要数据部分)。
- 第三行:server端紧接着又发送给客户端,注意flags是finish了,这就是四次挥手的第一次。
值得说的是,虽然应用层上看客户端ftp操作的close 主动断开的,但实际上这里的第一次挥手是server端先断开的。
- 第四行:这行注意,它也并不属于四次挥手。注意到它的ack是232565193,这是客户端对第二行的回复确认。
- 第五行:这行才是四次挥手的第二步,客户端对server端finish的确认ack。ack是232565193+1
- 第六行:四次挥手的第三步,客户端接着向server端发送finish帧。
- 第七行:四次挥手最后一次,server端的ack,4039201985+1。挥手结束。
以上通过tcpdump抓包ftp应用,看到了tcp建立连接的三次握手和断开连接的四次挥手。