write()和TCP / IP开销

时间:2011-02-14 02:27:44

标签: c sockets tcp unistd.h

如果我使用write()字节逐字节写入套接字文件描述符,

  • 现在每个字节都是数据包吗?
  • 套接字会将TCP / IP头添加到每个字节吗?
  • 或者它是否有缓冲机制(我个人对此表示怀疑,因为我没有明确刷新)。

例如:

write(fd, 'a', 1);
write(fd, 'b', 1);
write(fd, 'c', 1);

这会不如说

write (fd, 'abc', 3);
  • 我必须在此问这个问题,因为我没有专业知识来监控流量中的TCP / IP标头。感谢。

3 个答案:

答案 0 :(得分:3)

不,并非每个字节都会成为数据包。由于Nagle算法和其他因素,有些可能会合并。每个数据包将有一个TCP标头,而不是每个字节。

那就是说,你应该避免逐字节地调用write / send,因为每一个都是一个系统调用,这很昂贵(在本地机器上,而不是它最终在网络上的方式)。

答案 1 :(得分:1)

根据John的回答,您可以禁用Nagle的算法(通过TCP_NODELAY),然后第一个版本将变慢。

相反,您可以拨打writev()而不是write(),这将导致第一个版本与第二个版本完全相同。

答案 2 :(得分:0)

这实际上取决于TCP / IP堆栈的实现。它实际上取决于操作系统中实现的分段。大多数操作系统已经内置了很多优化。

如果您正在查看最糟糕的情况,TCP标头是20个字节,IP标头是20个字节和帧标头的大小(取决于您使用的协议,可能是以太网),所以你可以期待加上你的有效载荷。话虽如此,互联网上的大部分流量都由ACK主导,但是,您的网络堆栈应该结合有效载荷。