- 论坛徽章:
- 1
|
tcp/ip通讯问题
原帖由 "yuxh" 发表:
在长连接中发送报文时要先发送一个长度,为了统一起见,写一个库函数供调用。原型:
int PutMessage(int nSock, char *strBuff, int nLen);
strBuff为要发送的数据,不带长度。所以发送就会成为这样:
sprintf(temp, "%05d", nLen);
write(nSock, temp, 5);
write(nSock, strBuff, nLen);
就会有连续两次的写操作。
现在只能改成这样
char *temp;
temp = (char *)malloc(nLen+6);
sprintf(temp, "%05d", nLen);
memcpy(temp+5, strBuff, nLen);
write(nSock, temp, nLen+5);
感觉很不爽!
哈哈哈!
真的被我说中了……
- write(nSock, temp, 5);
- write(nSock, strBuff, nLen);
复制代码
和
- write(nSock, temp, nLen+5);
复制代码
的效果是一样的!
没错,
的确会被延迟发送,
可是你要知道:
1,延迟的原因是什么?
是因为 Nagle 算法优化的结果。
2,Nagle 算法优化的目的是什么?
是为了防止小数据量传送时造成的网络带宽的浪费。(注一)
3,Nagle 算法实现了一个什么效果?
Nagle 算法可以延迟发送太小的报文,直到:(1),所有已发送的小分组都已被确认;(2),所有待发送的数据累计起来以后,已经不再是一个“小分组”了。
总结:
的确可能被延迟了,
可是因为你紧接着又有一个
- write(nSock, strBuff, nLen);
复制代码
所以,TCP 最终会把这两个 write 调用提供的数据打在一个 TCP 分组中发送出去!
也就是说,和你
- write(nSock, temp, nLen+5);
复制代码
的效果几乎是完全相同的!
注一:
因为一个 TCP 报文的报头部分再加上 IP 报头一共有近百个字节,
因此,仅仅只发送象 5 个字节这样的小分组显然是浪费了很多带宽。 |
|