Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
write()和TCP/IP开销_C_Sockets_Tcp_Unistd.h - Fatal编程技术网

write()和TCP/IP开销

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头。谢谢 不,不是每个字节都会成为一个数据包

如果使用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,因为每一个都是一个系统调用,这非常昂贵(在本地计算机上,而不是在网络上)。除了John的答案之外,您还可以禁用Nagle的算法(通过
TCP\u NODELAY
),然后第一个版本会变慢


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

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


如果您考虑的是最坏的情况,TCP报头是20字节,IP报头是20字节,帧报头的大小(取决于您使用的协议,可能是以太网),因此您可以预期这加上您的负载。这就是说,internet上的大部分流量由ACK控制,但是,您的网络堆栈应该结合有效负载。

这还取决于TCP/IP规范,默认情况下,该规范要求像Nagle算法这样的操作。
writev
为+1。您还可以将
stdio
与缓冲
文件一起使用。