EchoDemo's Blogs

计算机网络问题整理

1、TCP连接时,为什么要进行三次握手

client发出的一个连接请求报文段在某个网络节点长时间滞留,以致于延误到连接释放以后才到达server。本来是一个早已失效的报文段,但server误认为是client发出的新的连接请求。于是就向client发送确认报文段,同意建立连接。如果不采取三次握手,那么只要server发出确认,新的连接就建立了。但由于client实际上并没有发出连接请求,因此不予理睬server的确认,也不会向server发送确认。但server却认为连接已经建立,并一直等待client发来数据。造成server资源的浪费。

A:“喂,你听得到吗?”。

B:“我听得到呀,你听得到我吗?”(应答和请求同时发出)。

C:我能听得到你,balabala...”。

2、为什么需要四次挥手

(1)当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口,就会发FIN给主机B。

(2)当主机B收到A发送的FIN,表示收到了,就会发送ACK回复A。

(3)但此时B可能还在发送数据,没有想要关闭数据口,所以B的FIN和回复A的ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。

(4)A收到B发来的FIN,知道B的数据也发送完了,回复ACK。A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭连接,B也关闭了连接。

A:“喂,我不说了”。

B:“我知道了。等一下,我还没说完。Balabala...”。

B:“好了,我说完了,我也不说了”。

A:“我知道了”。

client发出最后的ACK回复可能会丢失。server如果没有收到ACK,将不断重复发送FIN片段。所以client不能立即关闭,他必须确认server收到了该ACK。client会在发出ACK之后进入到TIME_Wait状态。同时设置一个计时器,等待2MSL(MSL指一个片段在网络中最大的存活时间)的时间。如果在该段时间内收到FIN,那么需要重发ACK。如果没有再次收到ACK,client就认为server已经收到ACK,结束TCP连接。

3、

🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------