Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121987
  • 博文数量: 41
  • 博客积分: 2564
  • 博客等级: 少校
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-20 19:17
文章分类

全部博文(41)

文章存档

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(sockfd, data_len, 4);
write(sockfd, data, data_len);
...

那么,客户端在收到第一个write的ACK之前,第二个write是不会成功的。要解决这个例子的问题,有3种方法:

1、使用TCP_NODELAY屏蔽Nagle algorithm;

2、分配一个4+data_len大小的缓存,将data_len和data填入,然后调用write;

3、使用writev代替write,一次把data_len和data发送出去。

阅读(1516) | 评论(0) | 转发(0) |
0

上一篇:I/O复用

下一篇:高级I/O函数

给主人留下些什么吧!~~