TCP时延问题

Q:TCP时延问题是由什么原因产生?

A:TCP延时确认(Delayed Ack)机制导致的。


Q:TCP延时确认机制作用?

A:TCP在处理交互数据流(即Interactive Data Flow,区别于Bulk Data Flow,即成块数据流,典型的交互数据流如telnet、rlogin等)时,采用了Delayed Ack机制以及Nagle算法来减少小分组数目。 


Q:TCP延时确认机制工作原理?

A:TCP延时确认时间通常为几百毫秒,如果在延迟时间内有报文段要发送的话,ack附加到数据报文段一起发送如果没有,那么当延迟时间到时,就单独发送ACK。


Q:为什么TCP延时确认机制会导致TCP时延?

A: 仅仅有TCP的延迟确认机制,并不会导致请求延时的(因为并不是必须等待ACK包发出 去,recv系统调用才能返回,但是必须等待前一个数据包的ACK,send系统调用才能发送成功)。一般来说,只有当该机制与Nagle算法或拥塞控制(慢启动或拥塞避免)混合作用时,才可能会导致时耗增长。

   Nagle算法可以参考本博客另一篇“Nagle算法”。

   链接为http://blog.csdn.net/cylan_jia/article/details/7976051


Q:有什么办法解决TCP时延确认机制?

A:TCP中,每次recv到数据后,调用一次setsockopt函数,设置TCP_QUICKACK。
   例如: setsockopt(fd, IPPROTO_TCP, TCP_QUICKACK, (int*)1, sizeof(int)); 


Q:为什么TCP_QUICKACK需要在每次recv后重新设置?
A:因为TCP_QUICKACK不是永久的,所以在每次recv数据后,应该重新设置。 

   具体原因为:当TCP链接在要发送一个数据包时会进行比较当前时间与最近一次接数据包的时间间隔是否小于计算的延迟确认超时时间,则重新进入交互数据流模式。

   也可以这么理解:延迟确认机制被确认有效,会自动进入交互式。 

你可能感兴趣的:(TCP时延问题)