1.趣谈TCP四次挥手
老样子,在开始正式的讲解TCP四次挥手之前,先来一段小对话来帮助大家更好的理解。
下面展示 对话情景
。
----------------------------------------------------------------------
对话介绍:
角色:祖安人,萌新
背景:经过了三次对话之后,祖安人和小朋友进入了选择英雄界面。祖安人面带微笑
的让小萌新选择了一个“扫把头”的英雄,而祖安人选择了“鲶鱼”来辅助萌新。
进入游戏界面后,祖安人开始了和萌新友好的互动 ......
----------------------------------------------------------------------
游戏结束,祖安人和萌新各回各家。
对话结束,下面正式的开始介绍TCP四次挥手连接。
2.断开TCP连接:TCP四次挥手
看完上面那个小对话,下面开始正式的来看TCP四次挥手:
这里再复习一下seq,FIN,ACK:
1.序号seq:
占32比特,也就是4个字节。一个报文段的序号是该报文段首字节的字节流编号。
2.确认号ack:
占4个字节。确认号就是主机正在等待的数据的下一个字节序号。
例如:客户发送的第一个报文段的序号 seq = 99;那么服务器发送的报文段的
确认号: ACK= 100
3.终止FIN
FIN=1时,表示数据已全部传输完成,发送方不会再传输数据,并且要求释放当前
连接。
FIN=0,正常传输数据。
①为什么需要断开TCP连接?
因为在建立TCP连接(三次握手),连接后的数据传输中,客户和服务器都会为该TCP连接分配TCP缓存和变量。(在分配TCP缓存和变量中,会使得TCP容易收到SYN洪泛的拒绝服务攻击)。所以在连接结束后(TCP四次挥手),客户和服务器中的资源(即缓存和变量)都应该被释放。
②为什么需要四次挥手断开TCP连接?
因为TCP是全双工的通信机制(全双工通信信道:双方都可以同时发送和接收),每个方向必须单独进行关闭,并且客户和服务器任何一个都可以选择关闭该TCP连接。
分析四次挥手:断开连接
-
客户端首先发出一个关闭连接命令(FIN = 1),也就是向服务器端发送一个首部带有FIN比特标志位的TCP报文段,此时客户端不会再向服务器发送数据,并且会等待服务器返回确认报文段(ACK报文)。
-
服务器端接收到了该报文段后,就向客户端发送回一个确认报文段(ACK = 1);但是服务器端此时还没有进入关闭状态,会把剩下没有发送的数据继续发给客户端。
-
服务器端发送完剩下未发送的数据之后,同样也会向客户端发送一个首部带有FIN比特标志位的TCP报文段,此时服务器端不会再向客户端发送数据,同样会等待客户端返回确认报文段。
-
客户端收到该报文段后,客户TCP会对该报文段进行确认,并且会进入定时等待状态,因为假若ACK丢失,该状态会让TCP客户端重新发送最后的确认报文ACK。经过该状态之后,TCP连接就正式关闭了,客户端所有的资源(变量,缓存包括端口号)将会被释放。
定时等待状态:TIME_WAIT,所消耗的时间有30秒、1分钟或者2分钟,一般为2分钟
(MSL)。
总结
TCP四次挥手关闭连接的规则如下:
- 当一端(可以是客户端或者服务器端)发送一个FIN报文段来关闭这一端的数据发送,需要收到另一端的确认报文段。
- 又因为TCP是全双工的通信机制(全双工通信信道:双方都可以同时发送和接收),每个方向必须单独进行关闭,所以需要四次挥手关闭连接。
3.小知识:SYN洪泛攻击
SYN洪泛攻击也叫DoS攻击,利用了TCP三次握手建立连接的特点。攻击者发送大量的伪造TCP SYN报文段,而不完成去第三次握手的步骤,导致服务器不断为这些半开连接分配资源(缓存,变量),导致了服务器的连接资源被消耗殆尽。