前言
通过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请求,响应等一系列操作
- 其中只有第一次SYN时可以不设置ACK位为1,其余所有报文都需要设置ACK,并有相应的非0 Acknowledge number.
- 报文基本都要设置ACK,是因为TCP要确保对方收到了相应的数据包,防止IP传输过程造成的数据丢失。
- ISN是在连接初始生成的动态伪随机数,其值范围为0-2^32之间。为了提高安全性,可通过一些算法生成真随机数以及通过PRNG对随机数进行验证。
- SN用于已记录传输的数据长度,若没有数据发送,将保持与之前的一致。
*注:确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
以下通过Wireshark分析一个client从server请求一个图片的过程进行分析,HTTP请求及响应结果如下。
TCP传输过程如下:
-
Client发送一个TCP session, 其Header中有source port, destination port以及动态随机产生的初始Sequence number(ISN)
-
Server 回复自己的SN,并将ISN+1作为Ack number, SYN, ACK位设置为1.
-
Client回应Server, 确认收到Server回复,将Ack number设置为SN+1。
为什么要有三次握手:
可根据SN判断不同的连接,防止已失效的连接请求报文段又传送到了服务端。
四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭.
其中ACK与FIN可一起,表示没有数据要再发送。