tcp

TCP 可靠性

  • 重传机制
    • 超时重传
    • 快速重传
    • SACK
    • D-SACK
  • 滑动窗口
    • 发送窗口
    • 接收窗口
  • 流量控制
    • 控制窗口大小
  • 拥塞控制
    • 慢启动
    • 拥塞避免
    • 拥塞发生
    • 快恢复

为什么TCP是三次握手?不是两次、四次?

TCP 使用三次握手建立连接的最主要原因是防止历史连接初始化了连接

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)

  • 三次握手才可以同步双方的初始序列号

  • 三次握手才可以避免资源浪费

  • 不使用「两次握手」和「四次握手」的原因:

    • 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列
      号;
    • 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

为什么TCP挥手需要四次?

  • 双方发 FIN 包
  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务器收到客户端的FIN报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都 会分开发送,从而比三次握手导致多了一次

TIME_WAIT 需要确保 服务器 收到 最后一次 ACK 的响应

在 Linux 系统里 2MSL 默认是 60 秒