之前学习了TCP首部、TCP连接的建立、TCP连接的终结。我们知道TCP报文段中的数据字段是可选的,同时一般网络数据传输中,可能会出现要传输大块数据或小块数据,一般它们的比例是9:1。对于只携带小块数据的TCP报文段,如果出现在局域网中,对网络的影响比较少。如果出现在广域网中,就有可能出现网络拥塞,会降低网络的数据传输性能。为了解决这一问题,就提出了Nagle算法。
1. 时延ACK
通常来说,接收端收到数据后,不会立即发送ACK确认报文,而是会等待一段时间,看是否接收端有需要沿着与ACK报文同一方向传递的数据,如果有就将这些数据与ACK一起传递。这里等待的一段时间就是ACK时延的时间,一般是200ms。也就是说接收端接收到数据后,会等待200ms,等待那些需要沿着同一方向传递的数据,然后将他们一起打包传递。这样做可以减少网络中的小段数据报文数量,减少网络拥塞。
ACK时延定时器和超时重发定时器:超时重发定时器,一般500ms,检测发送端发送一个报文后,是否在500ms内收到了ACK确认报文,没有会重发。而ACK时延定时器,一般200ms,用于接收端接收到数据后,延迟发送ACK确认报文,以等待接收端需要沿着和ACK同样方向传递的数据,组装为携带数据的ACK发送。
2. Nagle算法
Nagle算法要求在网络中只能存在唯一的没有被确认的小段报文段。这就是说,如果已经发送了一个小报文段,在没有收到接收端对它的确认报文前,不能发送其他的小分组或小报文段。也就是说网路中某一个时刻只存在一个报文数据在传递。同时,发送端也会继续收集这些小分组,等收到上一个确认报文后,再将收集到的小分组组装成一个分组发送出去。这样做能减少网络中小分组数量,较少网络拥塞。并且接收端发送确认报文速度越快,接收端发送下个分组也越快。相比禁用Nagle算法的连接,启用Nagle算法的连接发送报文数量少,但总通信时间更长。
缺点:对于实时性要求很高的系统,Nagle算法不适合。因为Nagle算法在某一个时刻只有一个报文在传输,会导致数据传递的不够及时。