在局域网中测试发现,几十字节的数据通过TCP在2台机器来回传送也需要600多毫秒。
如果在同一台机器上同时用Server和Client则只有十几毫秒。
研究了一下,原来是有个 叫 Nagle 的算法在起作用。
当发送数据量小于MTU或SO_SNDBUF的时候,系统会暂缓实际的发送,直到200毫秒或数据足够多才一块儿发。MTU(Maximum Transmission Unit )在以太网是1460 bytes,SO_SNDBUF默认为8K.
这样的好处是在频繁发送小数据的时候可以提高发送的效率,因为每次发送一个包都有TCP头,合并在一块儿发可以省啊。
不过如果我们小数据的发送间隔大于200毫秒,带来的缺点就是每次都要等200毫秒才能发出去。那只好关了他了。方法很简单:
BOOL bNodelay = 1;
int err = setsockopt(m_hSocket, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizeof(bNodelay));
效果很明显,终于局域网内也达到了十几毫秒的延时效果。
参考资料:Sending small data segments over TCP with Winsock