swoole( 网络IO 七)

为什么连接的时候是三次握手,关闭的时候却是四次握手

    因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。

    其中ACK报文是用来应答的,SYN报文是用来同步的。

    但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。

    只有等到服务端所有的报文都发送完了才能发送FIN报文,因此不能一起发送。故需要四步握手。

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

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

     现在把三次握手改成仅需要两次握手,死锁是可能发生的。

     作为例子,考虑计算机S和C之间的通信,假定客户端给服务端发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。

     按照两次握手的协定,服务端认为连接成功建立了,可以开始发送数据分组。

     可是,客户端在服务端的应答分组在传输中被丢失的情况下,将不知道服务端是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。

     在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
 

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

     TCP还设有一个保活计时器

     服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

切换调度

我在向一个人发送信息,这时再去看另一个人的信息,这个过程称之为切换调度,由系统的内核处理

发布了66 篇原创文章 · 获赞 2 · 访问量 4650

猜你喜欢

转载自blog.csdn.net/converoscar/article/details/104275489