用TCP接收数据包时,包分割的疑惑。

yuanquana 2014-05-20 02:12:25
看了罗云彬的<<Windows环境下32位汇编语言程序设计>>,在讲到用TCP编程时,他提到用recv函数接收数据包时会有包分割的问题:即发送方发送的一个包,可能会根据网络的质量被分割成若干小包传送。我想请问
1.被分割后的小包,理论上最小能到多小?
2. 实际环境中,发生这种整包被分割成小包的情况多见吗?

以上两问题,还请有实际经验的朋友回答一下,谢谢。
...全文
1373 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanquana 2014-05-26
  • 打赏
  • 举报
回复
谢谢楼上,给出如此详细的解释。
  • 打赏
  • 举报
回复
TCP传输的是一个数据流,每次接收时得到一个数据片段,它并不保证数据边界和发送时是一样的(可能拆分或合并),你需要给传输的数据设计一个结构,这样接收的时候能够知道得到了哪部分,完整不完整,老罗说的“设计合适的通信协议”应该就是这个意思。 至于TCP包的大小,最小当然是20字节,只有一个最小头部,此时负载的应用层数据大小为0。包分割多不多取决于IP层的MTU设计,MTU减去IP头大小(IPv4最小20字节,IPv6最小40字节),再减去TCP头大小(最小20字节),就是你的环境中能一次传输的最大应用层数据包的大小,不过数据可能穿越多级路由,每级都可以有不同的MTU设置,还要满足最小的那个MTU设置(但是IPv6可以保证不超过1280字节的IP报文不被拆分)。
yuanquana 2014-05-23
  • 打赏
  • 举报
回复
继续等待,不相信CSDN上汇编版没人懂这个。
yuanquana 2014-05-22
  • 打赏
  • 举报
回复

不好意思,楼上手滑,没发图片,本楼补上。
yuanquana 2014-05-22
  • 打赏
  • 举报
回复
引用 2 楼 bEst_02 的回复:
1.长度是根据网络情况决定的,一般是1500左右
2.一般来说只要报文长度不超过上述的长度,不会出现分包的情况。

另外,分包是在底层实现的,对应用层程序没有任何影响。


楼上两位,现在关键的问题是罗云彬说在API层面就要考虑循环调用recv函数,直到接收完一个完整的包才结束循环。如果说分包是在底层实现的,对应用层程序没有影响,那为什么罗云彬还要写那个循环调用recv的函数,照罗的说法并不是因为包太大了,而是因为网络质量的不稳定,即使很小的包也会被分解。下面的图是罗云彬的书第584页关于讲解分包的内容:
yuanquana 2014-05-21
  • 打赏
  • 举报
回复
没人回,只好自已顶下。发贴前总分不过百,拿出60,还请各位不要让我失望啊。
WJN92 2014-05-21
  • 打赏
  • 举报
回复
既然你选择了使用API来工作,你就不要管它是怎么工作的了. 这样才叫面向对象啊.这些基本是驱动的工作了
bEst_02 2014-05-21
  • 打赏
  • 举报
回复
1.长度是根据网络情况决定的,一般是1500左右 2.一般来说只要报文长度不超过上述的长度,不会出现分包的情况。 另外,分包是在底层实现的,对应用层程序没有任何影响。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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