三次握手 & 四次挥手

前言

通过Wireshark实际分析TCP连接及断开过程。

Client ------SYN-----> Server
Client <---ACK/SYN---- Server
Client ------ACK-----> Server

Client ------FIN-----> Server
Client <-----ACK------ Server
Client <-----FIN------ Server
Client ------ACK-----> Server

三次握手

首先Client向Server发同步请求,动态随机产生初始序列号ISN并将SYN位设置为1,然后Server回复自己的序列号Sn以及Acknowledge编号(ISN+1), 并将SYN+ACK设置为1,最后Client确认,其序列号自增1 (ISN+1), Acknowledge编号为Sn+1,ACK位设置为1。连接建立成功,后续可进行发送HTTP请求,响应等一系列操作

  1. 其中只有第一次SYN时可以不设置ACK位为1,其余所有报文都需要设置ACK,并有相应的非0 Acknowledge number.
  2. 报文基本都要设置ACK,是因为TCP要确保对方收到了相应的数据包,防止IP传输过程造成的数据丢失。
  3. ISN是在连接初始生成的动态伪随机数,其值范围为0-2^32之间。为了提高安全性,可通过一些算法生成真随机数以及通过PRNG对随机数进行验证。
  4. SN用于已记录传输的数据长度,若没有数据发送,将保持与之前的一致。
TCP报文格式.png

*注:确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

以下通过Wireshark分析一个client从server请求一个图片的过程进行分析,HTTP请求及响应结果如下。


Session.png

TCP传输过程如下:


TCP_Session.png
  1. Client发送一个TCP session, 其Header中有source port, destination port以及动态随机产生的初始Sequence number(ISN)


    TCP_1.png
  2. Server 回复自己的SN,并将ISN+1作为Ack number, SYN, ACK位设置为1.


    TCP_2.png
  3. Client回应Server, 确认收到Server回复,将Ack number设置为SN+1。


    TCP_3.png

为什么要有三次握手
可根据SN判断不同的连接,防止已失效的连接请求报文段又传送到了服务端。

四次挥手

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭.


TCP_Disconnect.png

其中ACK与FIN可一起,表示没有数据要再发送。


TCP_Disconnect_Wireshark.png
总结
TCP_Client.png
TCP_Server.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容