三次握手过程理解

  1. 第一次握手; 建立连接时, 客户端发送syn包(同步序列编号[Synchronize Sequence Numbers])到服务器,并进入SYN_SENT状态,等待服务器确认;
  2. 第二次握手; 服务器收到syn包,必须确认客户的ACK, 同时自己也发送一个SYN包,此时服务器进入SYN_RECV状态;
  3. 第三次握手;客户端收到服务器的SYN包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手过程理解

  1. 客户端发送fin,请求关闭连接(fin类似连接时候的syn)
  2. 服务器收到fin, 回发一个ack确认
  3. 如果服务器也想断开连接,发送fin给客户端
  4. 客户端收到fin一样用ack作为应答

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

  1. 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认
  2. 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤

为什么是4次挥手?

  1. 关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

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

  1. TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。



文章参考