路径MTU发现
如果一个IP数据报被设置DF位,而其长度又超过了MTU,路由将返回“ICMP不可达”差错
被TCP发送的IP数据报都将被设置DF位,如果收到这个ICMP差错,TCP就减少段大小并重传
当由这个差错引起重传时,拥塞窗口不变,但需要进入慢启动
由于路由可以动态变化,因此最后一次减少MTU后,隔一段时间可以尝试较大的值(RFC推荐10分钟)
长肥管道
管道可被水平拉长(一个长的RTT),也可以被垂直拉高(较高的带宽),或者两个方向同时拉伸,结果导致宽带时延乘积(管道容量)变大;
长肥管道会遇到一些问题:
- 需要更大的窗口保证吞吐量;TCP首部窗口大小为16位(64K),使用窗口扩大选项可以增大窗口;
- RTT测量频率相对降低(窗口增大导致每个ACK对应的分组增多);时间间戳选项可解决
- 32位(4G)序号回绕导致的重传包和正常包序号碰撞;利用时间间戳选项可解决
窗口扩大选项
移位数取值为0~14,新窗口为原窗口大小移位后的值;
窗口扩大选项只能出现在SYN报文中,连接建立后,每个方向的扩大因子固定(但取值可以不同)
时间戳选项
发送方在每个报文中放置时间戳值,接收方在ACK中返回该值,因为接收方的时间戳值单调递增,计算差值即可,不需双方时钟同步;
因为一个ACK对应多个报文,当窗口增大时对应的分组增多,RTT相对采样速率降低,对拥塞反应速度也就降低
一个ACK既然对应多个分组,那么到应该底返回哪个分组的时间戳?(原则:RTT估计过高比估计过低要好)
- 接收顺序:1、2
- ACK顺序:2(1的时间戳)
- 接收顺序:1、3、4、5、2
- ACK顺序:1、1、1、1、5(2的时间戳)
PAWS
按照上图所示,如果B丢失后重发,并在E后、F之前到达,这是序号发生回绕,B会取代F被接收造成错误;
解决办法就是通过收到分组的时间戳,因为时间戳是递增的,所以B的时间戳小于E,不被接收;
TCP性能
不能比最慢的链路运行的更快
不能比最慢的机器的内存运行的更快
TCP速度的理论值受限于TCP的窗口大小和光速,实际性能受具体实现的缺陷的影响,而非协议本身