您的位置:首页 > 其它

关于UDP数据传输中出现的分包问题的一点解释

2014-09-18 16:27 447 查看
在测试UDP数据传输的过程中,发现客户端上传的数据有不完整现象,发现有时出现一个数据包分了两次接收的情况。
目前客户端(以下称为终端)采用GPRS方式以UDP协议传输。
对于此问题的分析,要追溯到TCP/IP 四层模型(以下为自底向上)
链路层-->网络层-->传输层-->应用层
UDP与TCP一样,属于传输层协议,而链路层有个MTU(最大传输单元)【因特网协议允许IP分片,这样就可以将数据包分成足够小的片段以通过那些最大传输单元小于该数据包原始大小的链路了。这一分片过程发生在网络层,传输层是 OSI 模型中最重要的一层,这里是根据窗口控制传输,而非MTU。传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。除此之外,传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割。例如,以太网无法接收大于1500字节的数据包。发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组,该过程即被称为排序。它使用的是将分组发送到链路上的网络接口的最大传输单元的值。原始分组的分片都被加上了标记,这样目的主机的TCP层就能将分组重组成原始的数据包了。】以太网的数据帧长度不能大于1500字节(以太网物理特性决定),这个1500字节也就是网络层(IP层)数据报文的最大长度。
链路层 首部和尾部共有18个字节,数据区即为MTU往上看网络层,网络层有IP数据报文的头,占了20个字节,所以实际数据长度为1480个字节。这个1480长度的数据就是TCP或UDP传来的传来的数据。再往上看,由于在传输层UDP协议头占了8个字节,故实际的数据长度为1472个字节(此数据即为我们可存放封装的最大数据长度)故在局域网环境下,采用UDP协议传输数据,最大封装的数据长度为1472个字节。
而Internet上标准的MTU值为576,故数据封装的最大长度576-20-8=548个字节,数据长度小于此值,则不容易出现分包情况。
而对于OSI七层网络模型与TCP/IP四层网络模型不了解的,则可先行查看OSI七层网络模型与TCP/IP四层网络模型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐