2

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

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

例如:

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

这会比说效率低吗

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

3 回答 3

3

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

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

于 2011-02-14T02:31:05.810 回答
1

添加到约翰的答案中,您可以禁用 Nagle 算法(通过TCP_NODELAY),然后第一个版本会变慢。

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

于 2011-02-14T02:36:39.790 回答
0

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

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

于 2011-02-14T02:37:29.600 回答