关于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四层网络模型
目前客户端(以下称为终端)采用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四层网络模型
相关文章推荐
- 关于SQL分布式数据远程传输问题
- MES操作数据库后数据显示的一点小问题,关于DataView的rowfilter
- 关于TCP/UDP数据传输过程
- 关于ffmpeg解码通过UDP协议传输的视频流遇到fifosize 的问题
- 关于UDP向本机端口发送数据报但是接收不到数据的问题
- 关于管道的大量数据传输问题解决方法 ( vc )
- 关于IOCP WSASend发送数据到客户端 出现LastError 为6的问题。。折腾我半天啊!
- 请教关于c#界面数据传输问题
- 关于客户端与服务器ajax使用json数据交互,出现中文乱码或因包含html标答而报错的问题(base64加密)
- 关于使用DirectShow架构,传输YUV420数据的Filter与Video Renderer Filter连接问题的解决办法。
- 解决关于导入数据到mysql数据库时出现的乱码问题
- 关于 php 用webservice传输数据的问题(nosoap与.NET对接)此处一直困扰三天时间,终于解决
- jQuery UI Autocomplete 使用 ajax 方法传输Json数据出现乱码问题的解决
- 关于在form中通过ajax请求传递数据时出现异常的问题
- 关于数据库插入数据出现乱码问题
- 在设定alarm时,通过Intent传输数据出现旧数据删除不掉的问题。
- 关于三层数据传输问题的谈讨
- 关于数据表映射在更新时候出现的一些问题
- 通过TCP协议传输数据时出现地址协议不兼容的问题
- 关于单片机TCP/IP协议栈的实现目前的进度和问题——TCP或UDP发送数据,端口绑定问题