如果我使用 write() 逐字节写入套接字文件描述符,
- 现在每个字节都是一个数据包吗?
- 套接字会将 TCP/IP 标头添加到每个字节吗?
- 或者它是否有缓冲机制(我个人对此表示怀疑,因为我没有明确刷新)。
例如:
write(fd, 'a', 1);
write(fd, 'b', 1);
write(fd, 'c', 1);
这会比说效率低吗
write (fd, 'abc', 3);
- 我必须在这里问这个问题,因为我没有监控流量中的 TCP/IP 标头的专业知识。谢谢。
不,不是每个字节都会变成一个数据包。由于 Nagle 算法和其他因素,一些可能会合并。每个数据包将有一个 TCP 标头,而不是每个字节。
也就是说,您应该避免逐字节调用 write/send,因为每个都是系统调用,这很昂贵(在本地机器上,而不是它在网络上的最终结果)。
添加到约翰的答案中,您可以禁用 Nagle 算法(通过TCP_NODELAY
),然后第一个版本会变慢。
相反,您可以调用writev()
而不是write()
,这将导致第一个版本与第二个版本完全相同。
这实际上取决于 TCP/IP 堆栈的实现。这实际上取决于操作系统中实现的分段。大多数操作系统已经内置了很多优化。
如果您正在查看最坏的情况,TCP 标头是 20 字节,IP 标头是 20 字节,并且帧标头的大小(取决于您使用的协议,可能是以太网),所以您可以预期加上你的有效载荷。话虽如此,互联网上的大部分流量都由 ACK 主导,但是,您的网络堆栈应该结合有效负载。