UDP特性
- 无需连接: 即刻传输数据.
- 尽力而为: 有消息边界, 但可能丢包、乱序.
TCP特性
- 面向连接: 建立连接、断开连接.
- 字节流: 无消息边界, 特殊字符定义消息边界.
建立连接
第一次握手:客户端发送网络包,服务端收到了。服务端得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。客户端得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。服务端得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号
不使用「两次握手」和「四次握手」的原因:
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号; 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
断开连接
服务端在收到FIN时, 接受缓冲区末尾会插入EOF; 等到服务端数据发送完毕, 调用关闭连接的函数时, 才会发送FIN.
可靠传输
- 超时重传: Smoothed RTT, RTT Variation.
- 快速重传: 收到重复ACK.
高速传输
- 滑动窗口: 累积确认.
- 窗口关闭: 接收方停止接受新的数据, 带窗口大小改变时通知发送方, 发送方定期探测.
拥塞控制
原因
Retransmission: finite buffer, timeout.
Upstream transmission capacity wasted for packets lost downstream.
实现
- 慢启动: 受到ACK时, 拥塞窗口递增.
- 拥塞避免: 到达上一轮拥塞窗口大小一半时, 拥塞窗口随时间线性增加.
- 重复ACK: 拥塞窗口减半, 进入用赛避免状态.
- 超时: 重新进入满启动阶段.