tcp
TCP 可靠性
- 重传机制
- 超时重传
- 快速重传
- SACK
- D-SACK
- 滑动窗口
- 发送窗口
- 接收窗口
- 流量控制
- 控制窗口大小
- 拥塞控制
- 慢启动
- 拥塞避免
- 拥塞发生
- 快恢复
为什么TCP是三次握手?不是两次、四次?
TCP 使用三次握手建立连接的最主要原因是防止历史连接初始化了连接
三次握手才可以阻止重复历史连接的初始化(主要原因)
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费
不使用「两次握手」和「四次握手」的原因:
- 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列
号; - 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
- 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列
为什么TCP挥手需要四次?
- 双方发 FIN 包
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务器收到客户端的FIN报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都 会分开发送,从而比三次握手导致多了一次
TIME_WAIT 需要确保 服务器 收到 最后一次 ACK 的响应
在 Linux 系统里 2MSL 默认是 60 秒