OSI 七层网络协议

经典协议与数据包

以太网标头主要包含MAC地址信息
IP标头主要包含IP信息
TCP标头包含TCP类型和数据包长度

TCP三次握手、四次挥手
三次握手主要目的是保证连接是双工的,可靠性则更多用过重传机制来保证。
time_wait 需要等待 2MSL 的原因
- 保证 TCP 协议的全双工连接能够可靠关闭(防止客户端最后一个ACK丢失导致服务端无法关闭连接)
- 保证本次连接的重复数据段从网络中消失
TCP 流量控制
- 由于通信双方网速不同,任一方发送过快都会导致对方消息处理不过来,因此需要把数据放到缓冲区中
- 如果缓冲区满了,发送方继续发送,接收方会丢弃数据包。因此需要控制发送速率
- 缓冲区大小称为接收窗口
TCP 拥塞控制
- 拥塞控制是调节网络的负载
- 接收方网络资源繁忙,因未能及时响应 ACK 导致发送方重传大量数据,会导致网络更加拥堵
- 拥塞控制是动态调整 win 的大小,不只是依赖缓冲区大小确定窗口大小
1. 慢开始和拥塞避免

2. 快速重传和快速恢复

粘包和拆包
- 应用程序写入的数据大于套接字缓冲区大小,将会发生拆包
- 应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,将会发生粘包
- 进行 MSS (最大报文长度)大小的 TCP 分段,当 TCP 报文长度 – TCP 头部长度 > MSS 的时候将发生拆包
- 接收方不及时读取套接字缓冲区数据,也将发生粘包