TCP 连接与释放相关的核心问题

2022-01-27  本文已影响0人  Gakki0725
作者:Gakki

TCP 为什么要三次握手?

  1. 确认双方的收发能力
    • 第一次握手:客户端发送网络包,服务端收到了。服务端得出结论是:客户端的发送能力、服务端的接收能力是正常的。
    • 第二次握手:服务端发包,客户端收到了。客户端得出的结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。但此时服务器并不能确认客户端的接收能力是否正常。
    • 第三次握手:客户端发包,服务端收到了。服务端得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力正常。
  1. 序列号可靠同步

    • 如果是两次握手,服务端无法确认客户端是否已经接收到了自己发送的初始序列号,如果第二次握手报文丢失,那么客户端就无法知道服务端的初始序列号,那 TCP 的可靠性就无从谈起。
  2. 阻止重复历史连接的初始化

    • 客户端由于某种原因发送了两个不同序号的 SYN 包,我们知道网络环境是复杂的,旧的数据包有可能先到达服务器。如果是两次握手,服务器收到旧的 SYN 就会立刻建立连接,那么会造成网络异常。
    • 如果是三次握手,服务器需要回复 SYN + ACK 包,客户端会对比应答的序号,如果发现是旧的报文,就会给服务器发 RST 报文,直到正常的 SYN 到达服务器后才正常建立连接。
    • 所以,三次握手才有足够的上下文信息判断当前连接是否是历史连接。
  3. 安全问题

    • TCP 新建连接时,内核会为连接分配一系列的内存资源,如果采用两次握手就建立连接,那会放大 DDOS 攻击的。
    • TCP 作为一种可靠传输控制协议,既要保证数据可靠传输,又要提高传输的效率。所以三次握手就刚好满足上面2个需求。

三次握手可以携带数据吗?

为什么建立连接握手三次,关闭连接时需要是四次呢?

为什么TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSE 状态?

不足之处,欢迎留言补充!!!

TCP/IP 三次握手四次分离

上一篇 下一篇

猜你喜欢

热点阅读