TCP协议中的三次握手和四次挥手

马谦马谦马谦 2018年4月9日11:11:04 发表评论
文章最后编辑于:2018-5-4 23:03:36

TCP协议的三次握手和四次挥手分别表示了TCP连接的建立和释放过程,在整个TCP协议是一个很重要的内容,同时也是面试时的常见考点。

趁着找工作的劲,使用socket+tcpdump分析了一下工作流程,socket客户端代可以在socket介绍及函数原语找到。服务端的代码可以在socket的select模型找到。

socket中各函数对应的TCP状态演示图:

TCP协议中的三次握手和四次挥手

一、三次握手

三次握手的流程可以形容为(摘取自《TCP/IP协议:卷一》):

图片流程:

TCP协议中的三次握手和四次挥手

测试

开始tcpdump开始抓包:

开启另外一个终端打开服务端:

再开启一个终端开启客户端:

此时tcpdump的输出为:

这三个数据包验证了三次握手的流程:

第一个可以看出是客户端33632发给服务端9999的数据包,是一个SYN数据包,seq2197027846

第二个数据包为服务端返回的ACK数据包,ack=2197027847,等于上一个数据包中客户端的seq+1

第三个数据包是客户端给服务端的,它也带了ack,并且等于上一个数据包中服务端发过来的seq+1

此时客户端和服务端的连接状态都到达了ESTABLISHED

二、四次挥手

四次挥手是由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端几经终止了那个方向的数据传送。发送FIN通常是应用层进行关闭的结果。

收到一个FIN只意味着在这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的TCP应用程序这样做。

通过快捷键CTRL+C或者在客户端界面输入exit即可退出客户端,退出后的tcpdump输出:

四次挥手分析:

第一行客户端发给服务端,是一个FIN数据包,表示客户端要结束发送数据。

第二行是服务端的对上一条的响应,ack(3554397809)=seq(3554397808)+1

服务端在收到客户端的关闭消息后也关闭了连接,也发了一个FIN数据包,seq=2489855325

客户端收到服务端的关闭消息后也回了一个ack数据包,ack(2489855326)=seq(2489855325)+1

三、2MSL状态

//todo

本文共执行43次查询,耗时0.294秒!
马谦马谦马谦

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: