三次握手 & 四次挥手

前言

通过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

你可能感兴趣的:(三次握手 & 四次挥手)