TCP连接

作者: 吕建雄 | 来源:发表于2020-12-21 17:49 被阅读0次

TCP三次握手:

3次握手(图片来自网络)

TCP四次挥手:

四次挥手(图片来自网络)

1、为什么连接的时候是三次握手,而关闭的时候却是四次呢?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文;其中ACK是用来应答的,SYN报文是用来同步的;

但是关闭连接时,当Server收到Client的FIN报文时,很可能并不会立即关闭SOCKET,所以只会先回复一个ACK报文,告诉Client端“你发的FIN报文收到了”。只有等到Server所有的报文都发送完毕,才能发送FIN报文,因此不能一起发送。故需要四步握手

2、为什么不能用两次握手进行连接?

答:三次握手完成两个重要的功能 即要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认

如果三次握手改为两次握手,那么Server无法确定Server的信息Client是否能收到,所以如果Server先发消息,可能Client都收不到,会出现问题;另外,如果三次握手修改为两次,那么可能形成死锁,假设Client给Server发送一个连接请求,Server收到了这个请求,并发送了确认应答。按照两次握手的协定,Server认为连接已经成功的建立,可以开始发送数据啦。可是Client在Server的应答在传输中被丢失的情况下,将不知道Server是否已经准备好,同时也不知道Server建立什么样的序列号,Client甚至开始怀疑Server是否已经收到自己的连接请求。这种情况下,Client将认为连接还为建立成功,将忽略Server发来的任何数据,只等待应答。而Server在出的数据超时候,重复发送同样的信息,这样就形成了死锁。

3、如果已经建立了连接,但是客户端突然故障了怎么办?

答:TCP有一个保活计时器,客户端出现故障后,服务端不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后,都会重置该计时器。若2个小时都没收到客户端的请求,那么服务端会发送测试行的报文,没隔75秒发送一次,如果发送10次还没有反应,服务器就认为客户端出了故障,接着就关闭连接

相关文章

网友评论

      本文标题:TCP连接

      本文链接:https://www.haomeiwen.com/subject/drxdnktx.html