tcp三次握手与四次挥手深入浅出
看过网上很多关于TCP的文章,大部分都以“三次最为稳定可靠”为观点进行解释,但均未真正深入
到代码的实现细节、硬件等方面去做解释。
TCP是传输层上的全双工的通信协议(全双工的支持在硬件层面完成的)。
这里“全双工”、“单工”、“半双工”等硬件概念不再赘述,如想深入了解,可自行百度,比较好懂。
- 三次握手
服务发起方称为client,服务接收方称为server
client发起要开启上行通道的请求,server接收到请求,同时,server回应client,接收到请求,并附加开启下行通道的请求,client接收到回应&请求,开启上行通道,并回应server开启下行通道的请求,服务器接收到之后开启下行通道。对于client来说,第三次时便可以进行数据传输,因为此时上行通道已打开。
client简称c,server简称s:
1)c发送,SYN=1,seq=j
2)s发送,SYN=1,seq=k;ACK=1,ack=j+1
3)c发送,ACK=1,ack=k+1 - 四次挥手
关闭方称为client,被关闭方称为server
client发起要关闭上行通道的请求,server接收到请求,回应client,可以关闭,client接收到之后,关闭上行通道。等待一段时间后,server发送关闭下行通道的请求,client接收到请求,回应server,可以关闭,server接收到之后,关闭下行通道,至此,一次tcp连接关闭完成。
思考总结:
从全双工角度进行考虑,tcp的建立或关闭,都是分为上行通道和下行通道的开启/关闭为主要目的,每一次往返代表一个通道的开启/关闭。
这样考虑,很容易想清楚四次挥手,两个通道关闭便是2*2=4次,但是建立为何是三次,因为建立时,中间两次合二为一,回复可以和请求一起,节省一次ttl,再反观四次挥手,为何挥手就不能合二为一,因为,关闭是有一方主动进行,被关闭方接收到请求后,仍有一部分数据待发送,因此,下行通道不能立即请求关闭,通知对应cgi不做处理,同时将已处理完但未发送的数据发送完毕后,再进行下行通道的关闭请求。