首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >write()和TCP/IP开销

write()和TCP/IP开销
EN

Stack Overflow用户
提问于 2011-02-14 02:27:43
回答 3查看 986关注 0票数 2

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

  • 现在是每个字节都是一个数据包?
  • 会在每个字节中添加TCP/IP报头吗?
  • 还是有缓冲机制(我个人对此表示怀疑,因为我没有显式刷新)。

例如:

代码语言:javascript
复制
write(fd, 'a', 1);
write(fd, 'b', 1);
write(fd, 'c', 1);

这会不会比说的更有效率

代码语言:javascript
复制
write (fd, 'abc', 3);

  • 我必须在这里问这个问题,因为我不具备监控流量中TCP/IP报头的专业知识。谢谢,
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-14 02:31:05

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

也就是说,您应该避免逐字节调用写/发送,因为每个调用都是一个系统调用,这是昂贵的(在本地机器上,而不是在网络上结束的方式)。

票数 3
EN

Stack Overflow用户

发布于 2011-02-14 02:36:39

添加到John的答案,您可以禁用Nagle的算法(通过TCP_NODELAY),然后第一个版本将变得更慢。

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

票数 1
EN

Stack Overflow用户

发布于 2011-02-14 02:37:29

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

如果您正在查看最坏的情况,TCP报头是20字节,IP报头是20字节,并且帧头的大小(取决于您使用的协议,可能是以太网),那么您可以期望它加上有效负载。尽管如此,internet中的大多数流量都是由ACK控制的,但是,您的网络堆栈应该合并有效载荷。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4988358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档