`

以太网中的UDP编程:udp分包问题

阅读更多
转载自: http://blog.csdn.net/yaneng/article/details/4574804
最近学习UDP编程,头都搞大了,找了不少资料,也请教了不少同行,自认为下面这篇资料写的很好,所以收藏之,以供参考.  
   
   1.在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?    
   当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对    
   像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助:    
   首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层.    
   UDP属于运输层,下面我们由下至上一步一步来看:    
   以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.    
   这个1500字节被称为链路层的MTU(最大传输单元).    
   但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区.    
   并不包括链路层的首部和尾部的18个字节.    
   所以,事实上,这个1500字节就是网络层IP数据报的长度限制.    
   因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.    
   而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.    
   又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.    
   这个1472字节就是我们可以使用的字节数。:)    
   
   当我们发送的UDP数据大于1472的时候会怎样呢?    
   这也就是说IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).    
   把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.    
   这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便    
   无法重组数据报.将导致丢弃整个UDP数据报。    
   
   因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好.    
   
   进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.    
   如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机    
   制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.    
   
   鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.    
   最好将UDP的数据长度控件在548字节(576-8-20)以内.    
   
   2.UDP数据报的覆盖和重叠问题?    
   有的兄弟说使用UDP编程时会出现数据的覆盖和重叠问题,    
   所谓覆盖,即发送第一条消息为"第一条",第二条消息为"第二条".    
   而接收到的两条消息皆为"第一条".    
   而重叠,即指当发送"第一条","第二条"两条消息后.    
   收到的第一条消息可能是不固定的,比如"第一条第二","第一条第二条"等.    
   这种重叠的情况在TCP编程中是常见的.    
   但是在我的编程经验中,从来没有遇到过这两种情况.    
   
   我在局域网中在机器A用使死循环连续不断的向机器B发送UDP数据报.    
   但一直没有出现上面的两个问题.    
   
   因此我认为,根据UDP协议的特性,不会象基于字节流连接的TCP一样出现重叠问题.    
   有兄弟说,他在局域网试也没有问题,但在Internet上会.是不是路由器对数据进行组合,    
   或者说两条消息同时到达?    
   
   我想两条消息到达的时延无论如何不会比在局域网中的时延短吧?即时有,那种机率也是很少的.    
   而对于路由数据进行了重组,我认为,即使假定路由器对数据进行了重组,这也对导致UDP数据报    
   在接收时发现数据报中的校验和与数据不一致而丢弃该数据报。    
轮子学习笔记一:浅谈以太网中的UDP编程    
   
   1.在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?    
   当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对    
   像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助:    
   首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层.    
   UDP属于运输层,下面我们由下至上一步一步来看:    
   以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.    
   这个1500字节被称为链路层的MTU(最大传输单元).    
   但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区.    
   并不包括链路层的首部和尾部的18个字节.    
   所以,事实上,这个1500字节就是网络层IP数据报的长度限制.    
   因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.    
   而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.    
   又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.    
   这个1472字节就是我们可以使用的字节数。:)    
   
   当我们发送的UDP数据大于1472的时候会怎样呢?    
   这也就是说IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).    
   把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.    
   这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便    
   无法重组数据报.将导致丢弃整个UDP数据报。    
   
   因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好.    
   
   进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.    
   如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机    
   制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.    
   
   鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.    
   最好将UDP的数据长度控件在548字节(576-8-20)以内.    
   
   2.UDP数据报的覆盖和重叠问题?    
   有的兄弟说使用UDP编程时会出现数据的覆盖和重叠问题,    
   所谓覆盖,即发送第一条消息为"第一条",第二条消息为"第二条".    
   而接收到的两条消息皆为"第一条".    
   而重叠,即指当发送"第一条","第二条"两条消息后.    
   收到的第一条消息可能是不固定的,比如"第一条第二","第一条第二条"等.    
   这种重叠的情况在TCP编程中是常见的.    
   但是在我的编程经验中,从来没有遇到过这两种情况.    
   
   我在局域网中在机器A用使死循环连续不断的向机器B发送UDP数据报.    
   但一直没有出现上面的两个问题.    
   
   因此我认为,根据UDP协议的特性,不会象基于字节流连接的TCP一样出现重叠问题.    
   有兄弟说,他在局域网试也没有问题,但在Internet上会.是不是路由器对数据进行组合,    
   或者说两条消息同时到达?    
   
   我想两条消息到达的时延无论如何不会比在局域网中的时延短吧?即时有,那种机率也是很少的.    
   而对于路由数据进行了重组,我认为,即使假定路由器对数据进行了重组,这也对导致UDP数据报    
   在接收时发现数据报中的校验和与数据不一致而丢弃该数据报。
分享到:
评论

相关推荐

    Qt:以太网udp发送与接收一体化显示

    本文将深入探讨如何使用Qt框架进行以太网UDP(用户数据报协议)的发送与接收,特别是在一个程序中实现一体化显示。Qt是一个跨平台的C++库,广泛用于开发图形用户界面应用程序,而UDP是网络通信中常用的一种无连接...

    用UDP实现数据接收的程序,UDP实现面向非连接,在通讯中接收实时数据.rar

    在单片机编程中,使用UDP来实现数据接收,主要是因为单片机资源有限,而UDP的轻量级特性恰好满足这一需求。下面将详细介绍如何在单片机中实现基于UDP的数据接收。 1. **UDP基本概念** - UDP协议头包含源端口号、...

    物联网项目实战开发之基于STM32+W5500以太网RJ45数据上传OneNet物联网平台代码程序(多路状态上传及控制)

    STM32F103通过SPI口跟W5500以太网模块相连。 1、本例程实现的是W5500为TCP客户端,OneNet为服务端。 2、实例展示了从DHCP动态获取IP、连接服务端、TCP数据通讯、关闭连接等过程。 3、代码使用KEIL开发,当前在STM32...

    STM32F407-以太网-TCP服务器通信例程

    需要注意的是,TCP是流协议,不保证数据的边界,因此在设计协议时需要考虑数据包的分包与重组问题。 6. **断开连接**:当通信完成后,服务器可以关闭连接,释放相关资源。客户端也可以主动断开连接,这时服务器应...

    rawsocket_udp.c

    实现发送自定义以往帧,以及raw_socket实现UDP发送,伪装IP头,大包IP分片与重组,checksum计算和大包分片时偏移值计算,编译直接可用。

    STM32F750 LWIP实现NETCONN_UDP实验(UCOSII版本)【支持STM32F7系列单片机_网络通信】.zip

    在STM32F750上实现LWIP的NETCONN_UDP,首先需要配置STM32的硬件接口,包括设置以太网MAC、PHY和DMA,确保能够正常接收和发送网络数据。接着,需要在LWIP配置文件中开启UDP支持,定义所需的端口号,并根据应用需求...

    android 文件传输通讯通信源码

    本文将深入探讨如何在Android系统中实现文件的无线(通过WIFI)和有线(通过以太网)传输,主要基于UDP(用户数据报协议)的通信方式。UDP是一种无连接的、不可靠的传输协议,适合于对实时性要求较高的场景,如音频...

    Intel 82599以太网控制器手册

    同时,该控制器还支持 IPv6,包括 IP/TCP 和 IP/UDP 接收 checksum 卸载、碎 UDP 校验和分包重组等。 中断和队列管理 该控制器支持消息信号中断(MSI)和消息信号中断(MSI-X),以减少中断率和改善 CPU 使用率。...

    W5500S2E-S1用户手册 Ver 1.0

    - **数据分包**:具备灵活的数据分包机制,可根据实际需求调整分包大小,便于处理大量数据传输任务。 - **网络功能**:支持 DHCP、DNS 和 NetBIOS 功能,增强了网络管理和访问能力。 - **安全性**:提供连接密码校验...

    CAN计算机接口卡通用DLL函数库应用手册

    例如ACUSB-131B表示单CAN通道的便携式工业用USB转CANbus接口卡,而ACNET-UDP则表示UDP工作方式下的以太网CANbus接口卡。 - **1.1.2 CAN_ErrorCode**:定义了错误码类别,如CAN_E_NOERROR表示没有发现错误,CAN_E_...

    多功能型嵌入式以太网串口数据转换模块资料汇总-电路方案

    串口数据转换模块集成 10/100M 自适应以太网接口, 串口通信最高波特率高达 256Kbps, 具有TCP Client, UDP工作模式, 通过软件轻松配置。 串口服务器网络模块功能特点: 1.10/100M 自适应以太网接口; 2.支持 AUTO MDI/...

    tcp-ip详解:协议

    TCP/IP详解:协议 TCP/IP(Transmission Control Protocol/Internet Protocol)是互联网上最核心的一组通信协议,它定义了电子...通过系统学习,不仅可以提升技术水平,还能更好地应对网络环境中可能出现的各种问题。

    周立功试验箱 TCPIP实验源码

    在单片机实验中,通常涉及以太网MAC层协议,如Ethernet II。 在【zlIP0.2】这个压缩包中,可能包含了以下内容: 1. **源代码**:实现TCP/IP协议栈的C语言或汇编代码,包括各个层次的函数和数据结构。 2. **配置...

    TCP/IP详解卷(完整版)

    9. **网络编程**:书中可能还会涉及网络编程的基本概念,如套接字API,以及如何编写TCP和UDP的客户端和服务器程序。 10. **实践案例**:通过实际例子和实验,让读者能够将理论知识应用于实践中,提升理解和应用能力...

    TCP/IP详解 卷一:协议

    TCP/IP协议族是互联网的核心,它定义了网络通信的标准,包括数据在网络中的传输、分包、重组以及错误检测与纠正等关键环节。TCP/IP模型通常分为四层(或五层,根据不同的分类方式):应用层、传输层、网络层和链路层...

    微雨信使

    7. **安全性**:尽管描述中未提及,但任何网络通信软件都需要考虑安全问题。可能的措施包括使用加密技术(如SSL/TLS)保护数据传输,以及身份验证机制确保只有授权用户可以参与通信。 8. **用户界面**:作为一款...

    DE2_system_NET.rar_DE2_NET_de2

    - **IP协议处理**:利用FPGA的强大并行处理能力,可以高效地处理IP协议中的分包、校验、路由选择等任务。 - **TCP连接**:通过FPGA实现TCP协议,可以建立可靠的端到端连接,确保数据的正确传输。 - **UDP通信**:...

    通信与网络中的如何实现TDM-Over-Packet IC 与其它TDMoP器件的互操作

    TDMoP封装过程涉及将TDM数据转化为以太网数据包,包括前导符、起始帧定界符、目标和源地址、以太网类型、数据和填充符以及帧校验序列等多个字段。这些字段对于确保数据包在网络中的正确传输至关重要。 在实现互操作...

    2018考题回忆.docx

    21. TCP段分包:TCP段在IP层可能被分包,根据IP头部的总长度字段计算原始TCP段长度。 大题部分主要涉及计算和应用: 1. 以太网帧长度和传输距离的关系:数据传输速率与信号传播速度决定了最大传输距离。 2. 电路...

Global site tag (gtag.js) - Google Analytics