转载自: 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是一个跨平台的C++库,广泛用于开发图形用户界面应用程序,而UDP是网络通信中常用的一种无连接...
在单片机编程中,使用UDP来实现数据接收,主要是因为单片机资源有限,而UDP的轻量级特性恰好满足这一需求。下面将详细介绍如何在单片机中实现基于UDP的数据接收。 1. **UDP基本概念** - UDP协议头包含源端口号、...
STM32F103通过SPI口跟W5500以太网模块相连。 1、本例程实现的是W5500为TCP客户端,OneNet为服务端。 2、实例展示了从DHCP动态获取IP、连接服务端、TCP数据通讯、关闭连接等过程。 3、代码使用KEIL开发,当前在STM32...
需要注意的是,TCP是流协议,不保证数据的边界,因此在设计协议时需要考虑数据包的分包与重组问题。 6. **断开连接**:当通信完成后,服务器可以关闭连接,释放相关资源。客户端也可以主动断开连接,这时服务器应...
实现发送自定义以往帧,以及raw_socket实现UDP发送,伪装IP头,大包IP分片与重组,checksum计算和大包分片时偏移值计算,编译直接可用。
在STM32F750上实现LWIP的NETCONN_UDP,首先需要配置STM32的硬件接口,包括设置以太网MAC、PHY和DMA,确保能够正常接收和发送网络数据。接着,需要在LWIP配置文件中开启UDP支持,定义所需的端口号,并根据应用需求...
本文将深入探讨如何在Android系统中实现文件的无线(通过WIFI)和有线(通过以太网)传输,主要基于UDP(用户数据报协议)的通信方式。UDP是一种无连接的、不可靠的传输协议,适合于对实时性要求较高的场景,如音频...
同时,该控制器还支持 IPv6,包括 IP/TCP 和 IP/UDP 接收 checksum 卸载、碎 UDP 校验和分包重组等。 中断和队列管理 该控制器支持消息信号中断(MSI)和消息信号中断(MSI-X),以减少中断率和改善 CPU 使用率。...
- **数据分包**:具备灵活的数据分包机制,可根据实际需求调整分包大小,便于处理大量数据传输任务。 - **网络功能**:支持 DHCP、DNS 和 NetBIOS 功能,增强了网络管理和访问能力。 - **安全性**:提供连接密码校验...
例如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(Transmission Control Protocol/Internet Protocol)是互联网上最核心的一组通信协议,它定义了电子...通过系统学习,不仅可以提升技术水平,还能更好地应对网络环境中可能出现的各种问题。
在单片机实验中,通常涉及以太网MAC层协议,如Ethernet II。 在【zlIP0.2】这个压缩包中,可能包含了以下内容: 1. **源代码**:实现TCP/IP协议栈的C语言或汇编代码,包括各个层次的函数和数据结构。 2. **配置...
9. **网络编程**:书中可能还会涉及网络编程的基本概念,如套接字API,以及如何编写TCP和UDP的客户端和服务器程序。 10. **实践案例**:通过实际例子和实验,让读者能够将理论知识应用于实践中,提升理解和应用能力...
TCP/IP协议族是互联网的核心,它定义了网络通信的标准,包括数据在网络中的传输、分包、重组以及错误检测与纠正等关键环节。TCP/IP模型通常分为四层(或五层,根据不同的分类方式):应用层、传输层、网络层和链路层...
7. **安全性**:尽管描述中未提及,但任何网络通信软件都需要考虑安全问题。可能的措施包括使用加密技术(如SSL/TLS)保护数据传输,以及身份验证机制确保只有授权用户可以参与通信。 8. **用户界面**:作为一款...
- **IP协议处理**:利用FPGA的强大并行处理能力,可以高效地处理IP协议中的分包、校验、路由选择等任务。 - **TCP连接**:通过FPGA实现TCP协议,可以建立可靠的端到端连接,确保数据的正确传输。 - **UDP通信**:...
TDMoP封装过程涉及将TDM数据转化为以太网数据包,包括前导符、起始帧定界符、目标和源地址、以太网类型、数据和填充符以及帧校验序列等多个字段。这些字段对于确保数据包在网络中的正确传输至关重要。 在实现互操作...
21. TCP段分包:TCP段在IP层可能被分包,根据IP头部的总长度字段计算原始TCP段长度。 大题部分主要涉及计算和应用: 1. 以太网帧长度和传输距离的关系:数据传输速率与信号传播速度决定了最大传输距离。 2. 电路...