找到了,贴出来给大家看看: 为减少网络通信的开销,提升性能以及吞吐速度,系统默认采用N a g l e 算法。若应用程序请求发送一批数据(量较大),那么系统在接收了那些数据之后,可能会稍候一段时间,等其他数据累积进来,最后统一发送出去。但假如在一段规定的时间内,并无新数据加入,那么原先那些数据当然也会不管三七二十一地发送出去。这样造成的一个好结果便是:在单独一个T C P 包内,数据量增大了。与之相反的则是:使用多个T C P 包,但每个包携带的数据量比较少。如果是后一种情况,那么必然会涉及的一项“开销”在于,对每个包来说,其T C P 头都必须占据2 0 个字节的长度。例如,假定在此只发送2 个字节,那么2 0 个字节的头便显得有点儿多余。因此,在采用了N a g l e 算法后,可以更有效地利用数据包的可用空间。该算法的另一个功能是收到确认消息的延迟发送。系统收到T C P 数据之后,必须向对方反馈回一条A C K (收到确认)消息。但采用了该算法后,主机会暂时等待一段时间,看看是否有需要发给对方的数据,以便能随那些数据一道,将A C K 消息反馈回去,从而节省一个数据包的通信量(这又是一项开销)。 本选项的目的便是禁止采用N a g l e 算法,因为在某些情况下,它的行为反而会产生不利的影响。若网络应用通常只需发送数量相当少的数据,同时要求能得到极其迅速的响应,那么再使用这种算法,反而会影响性能。Te l n e t 便是这样的一个典型例子。Te l n e t 的本质是一种“交互式”或“互动式”应用,用户可通过它登录至一台远程机器,然后向其传送命令。通常,用户每秒钟只会进行少量的键击。若N a g l e 在此仍要不知好歹地“发挥作用”,便会造成响应的迟钝,甚至造成对方主机不予应答的错觉。
Sconnect = ::socket(AF_INET,
SOCK_STREAM,
IPPROTO_TCP);
int bNodelay = 1;
int err;
err = setsockopt (sConnect,
IPPROTO_TCP,
TCP_NODELAY,
(char *)&bNodelay,
sizoeof (bNodelay));//不采用延时算法
if (err != NO_ERROR)
TRACE("setsockopt failed for some reason\n");
《Windows网络编程技术》上面说得很清楚。(第九章)
刚看到的,呵呵!
本选项的目的便是禁止采用N a g l e 算法,因为在某些情况下,它的行为反而会产生不利的影响。若网络应用通常只需发送数量相当少的数据,同时要求能得到极其迅速的响应,那么再使用这种算法,反而会影响性能。Te l n e t 便是这样的一个典型例子。Te l n e t 的本质是一种“交互式”或“互动式”应用,用户可通过它登录至一台远程机器,然后向其传送命令。通常,用户每秒钟只会进行少量的键击。若N a g l e 在此仍要不知好歹地“发挥作用”,便会造成响应的迟钝,甚至造成对方主机不予应答的错觉。