write()和TCP/IP开销
如果使用write()逐字节写入套接字文件描述符write()和TCP/IP开销,c,sockets,tcp,unistd.h,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头。谢谢 不,不是每个字节都会成为一个数据包
- 现在每个字节都是一个数据包吗
- 套接字会将TCP/IP头添加到每个字节吗李>
- 或者它是否有缓冲机制(我个人对此表示怀疑,因为我没有显式刷新)
write(fd, 'a', 1);
write(fd, 'b', 1);
write(fd, 'c', 1);
这会比我们说的效率低吗
write (fd, 'abc', 3);
- 我不得不在这里问这个问题,因为我没有专业知识来监控流量中的TCP/IP头。谢谢
也就是说,您应该避免逐字节调用write/send,因为每一个都是一个系统调用,这非常昂贵(在本地计算机上,而不是在网络上)。除了John的答案之外,您还可以禁用Nagle的算法(通过
TCP\u NODELAY
),然后第一个版本会变慢
相反,您可以调用
writev()
而不是write()
,这将导致第一个版本与第二个版本完全相同。这实际上取决于TCP/IP堆栈的实现。这实际上取决于操作系统中实现的分段。大多数操作系统都内置了很多优化功能
如果您考虑的是最坏的情况,TCP报头是20字节,IP报头是20字节,帧报头的大小(取决于您使用的协议,可能是以太网),因此您可以预期这加上您的负载。这就是说,internet上的大部分流量由ACK控制,但是,您的网络堆栈应该结合有效负载。这还取决于TCP/IP规范,默认情况下,该规范要求像Nagle算法这样的操作。
writev
为+1。您还可以将stdio
与缓冲文件一起使用。