Linux socket缓冲区的机制是什么?

似水如风 2012-09-09 10:39:02
请问socket的缓冲区是个什么机制,是每次缓存一个包的数据,还是累计缓存多个数据包的数据呢?假如我要发送1000个数据包,每次隔1s发送一次,缓冲区是不是每次都只是缓存了一个数据包的数据呢?
...全文
441 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kazeeku 2012-09-10
  • 打赏
  • 举报
回复
1.数据包这个概念只有UDP才有的,TCP是流
2.而你问的“缓冲区是不是每次都只是缓存了一个数据包的数据”:
A。对于UDP是对的,也就是说,UDP你发的数据,在对端他recvfrom就是一个包
B。对于TCP是错的,TCP没有包的概念,TCP要实现包需要自己定义边界(比如在包头定义包的长度)

3.还有就是:
A。UDP,你用recvfrom读到的是一个完整的包,那是因为在系统底层系统帮你把还没有形成一个包的数据缓存起来(比如你发102400字节,不能一次就发过来,对端需要接收很多次),等形成一个包再提交给你(应用层)
B。TCP就是不一样,他会以接受“多少”就给你(应用层)的,那么你收到有可能不是一个完整的包(包是你自己定义的),所以你需要缓存
冷月清晖 2012-09-09
  • 打赏
  • 举报
回复
这要深入Linux TCP/IP协议栈的细节了。
qq120848369 2012-09-09
  • 打赏
  • 举报
回复
字节流, 无论是UDP还是TCP, 实际底层都不可能是一个包飞过来, 而是一个字节一个字节的流过来.

你这种问题, 一方面阅读 TCP/IP协议详解 了解协议是怎么规定和实现的, 一方面有一个款开源实作:UDT 供你学习如何自己实现TCP/IP协议.
羽飞 2012-09-09
  • 打赏
  • 举报
回复
一般的是TCP是一次尽量接收多个字节的数据,知道缓冲区满或者到达延迟时间
UDP数据就是一次一个包
如果理解的有错误,请大侠们指点

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧