看了罗云彬的<<Windows环境下32位汇编语言程序设计>>,在讲到用TCP编程时,他提到用recv函数接收数据包时会有包分割的问题:即发送方发送的一个包,可能会根据网络的质量被分割成若干小包传送。我想请问
1.被分割后的小包,理论上最小能到多小?
2. 实际环境中,发生这种整包被分割成小包的情况多见吗?
以上两问题,还请有实际经验的朋友回答一下,谢谢。
------解决方案--------------------
1.长度是根据网络情况决定的,一般是1500左右
2.一般来说只要报文长度不超过上述的长度,不会出现分包的情况。
另外,分包是在底层实现的,对应用层程序没有任何影响。
------解决方案--------------------
既然你选择了使用API来工作,你就不要管它是怎么工作的了.
这样才叫面向对象啊.这些基本是驱动的工作了
------解决方案--------------------
TCP传输的是一个数据流,每次接收时得到一个数据片段,它并不保证数据边界和发送时是一样的(可能拆分或合并),你需要给传输的数据设计一个结构,这样接收的时候能够知道得到了哪部分,完整不完整,老罗说的“设计合适的通信协议”应该就是这个意思。
至于TCP包的大小,最小当然是20字节,只有一个最小头部,此时负载的应用层数据大小为0。包分割多不多取决于IP层的MTU设计,MTU减去IP头大小(IPv4最小20字节,IPv6最小40字节),再减去TCP头大小(最小20字节),就是你的环境中能一次传输的最大应用层数据包的大小,不过数据可能穿越多级路由,每级都可以有不同的MTU设置,还要满足最小的那个MTU设置(但是IPv6可以保证不超过1280字节的IP报文不被拆分)。