2009年(41)
分类: LINUX
2009-04-15 11:00:38
共有两个TCP socket选项,对应的level是IPPROTO_TCP。
·TCP_MAXSEG
利用这个选项,可以获取/设置某个TCP连接的MSS。一般来说MSS是远程主机提供的,因此,如果在一个socket连接建立之前,使用该选项取得的值是系统默认值,连接之后则是双方商议的结果。关于设置MSS,并不是所有的系统都支持,有的系统仅仅允许用户设置一个更小的MSS,而不允许增加。若不是有特殊需要,建议不要设置,而留给TCP管理。
·TCP_NODELAY
在某些应用中,这个选项很重要(对效率影响)。若将此选项打开,则禁止TCP使用Nagle algorithm,默认情况下,TCP是使用Nagle algorithm的。
Nagle algorithm的目的是减少WAN中的“small packets”。使用Nagle algorithm的时候,如果某个TCP连接有未收到ACK的数据包,则直到收到ACK前,不允许该TCP连接发送“small packets”。所谓的“small packets”一般指的是大小小于MSS的数据包。
这种机制使得某些应用,比如telnet,效率会下降。这些应用一般不断的发送长度很小的数据包。
另一个更形象的例子是:客户端和服务器采用一些“逻辑”进行通信。比如每次传送数据时,客户端先发送一个数值(4byte)给服务器,该数值表示客户端即将发送的数据的类型。若客户端这样调用:
|
那么,客户端在收到第一个write的ACK之前,第二个write是不会成功的。要解决这个例子的问题,有3种方法:
1、使用TCP_NODELAY屏蔽Nagle algorithm;
2、分配一个4+data_len大小的缓存,将data_len和data填入,然后调用write;
3、使用writev代替write,一次把data_len和data发送出去。