`
494078416
  • 浏览: 80482 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

UDP数据包大小问题

 
阅读更多

在进行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)以内.

理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。
我们将遇到两个限制因素。第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数据数的默认值)。
第二个限制来自于TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。
在SunOS 4.1.3下使用环回接口的最大IP数据报长度是32767字节。比它大的值都会发生差错。
但是从BSD/386到SunOS 4.1.3的情况下,Sun所能接收到最大IP数据报长度为32786字节(即32758字节用户数据)。
在Solaris 2.2下使用环回接口,最大可收发IP数据报长度为65535字节。
从Solaris 2.2到AIX 3.2.2,发送的最大IP数据报长度可以是65535字节。很显然,这个限制与源端和目的端的实现有关。
主机必须能够接收最短为576字节的IP数据报。在许多UDP应用程序的设计中,其应用程序数据被限制成512字节或更小,因此比这个限制值小。
由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此,UDP编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?不幸的是,该问题的答案取决于编程接口和实现。
典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。应用程序何时能够知道,则与版本有关(4.3BSD Reno及其后的版本可以通知应用程序数据报被截断)。
SVR4 下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作。TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。在讨论TCP时,我们发现它为应用程序提供连续的字节流,而没有任何信息边界。TCP以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。

在进行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)以内.

---------------------------------------------------------------转载分割线------------------------------------------------------

经测试,局域网环境下,UDP包大小为1024*8,速度达到2M/s,丢包情况理想.

外网环境下,UDP包大小为548,速度理想,丢包情况理想.

分享到:
评论

相关推荐

    测量UDP 数据包延迟_python_代码_下载

    尝试不同的数据包大小! 同时测量来自多个发送主机的数据包延迟! 测量单向延迟(需要单独出售的单独硬件计时器以及往返延迟 保存每个数据包的延迟列表...到文件! 你说什么?普通人会ping做大部分这些事情吗?嗯...

    TCP-UDP数据包自动发送工具V3.01版本

    使用TCP-UDP数据包自动发送工具V3.01,不仅可以加深对TCP和UDP协议原理的理解,还可以用于实际项目中的网络调试、性能评估和问题诊断。例如,在开发网络应用程序时,可以通过发送特定的数据包来测试服务器的响应;在...

    windows环境下发送原始UDP数据包的研究代码

    创建原始UDP数据包发送程序的关键步骤包括: 1. **初始化Winsock**:在开始任何网络操作之前,必须先调用`WSAStartup`函数来初始化Winsock库。这会加载必要的动态链接库(DLL)并设置所需的版本信息。 2. **创建套...

    TCP和UDP数据包发送程序

    本程序旨在帮助理解这两种协议的工作原理,并能够实际发送TCP和UDP数据包。下面我们将深入探讨TCP和UDP的特点、工作流程以及它们在数据包发送中的应用。 首先,TCP是一种面向连接的协议,它确保了数据的可靠传输。...

    UDP数据包一分为二工具

    然而,当需要将数据从一个点发送到多个点时,传统的UDP协议并不直接支持多播或广播功能,这便是"UDP数据包一分为二工具"发挥作用的地方。 这个工具的主要目的是将单点到点的数据包分解为多份,以便能够同时发送给多...

    C# 抓取TCP UDP网络数据包.zip

    6. **解析数据包**:Pcap.Net提供了许多预定义的解析器,如`TcpDatagram`和`UdpDatagram`,用于解析TCP和UDP数据包的具体内容。 在压缩包中的`README.md`文件通常会包含项目的介绍、使用说明或者注意事项。而`...

    TCP&UDP数据包测试工具

    "TCP&UDP数据包测试工具"很可能就是这样一个软件,它可以帮助我们发送和接收TCP和UDP数据包,检查网络连接的性能,验证端口的开放状态,以及分析数据包的内容和传输特性。 这类工具通常具备以下功能: 1. **数据包...

    simplewnd.rar_UDP数据包传输

    标题"simplewnd.rar_UDP数据包传输"可能指的是一个简单的UDP数据包传输实现,其中“wnd”可能是窗口(Window)的缩写,可能是指在UDP通信中使用的滑动窗口协议。滑动窗口协议是一种流量控制机制,允许发送方在等待...

    利用udp发送数据包

    在描述中提到的“百万数据包”和“每个数据包大小为1500bytes(其中数据为1472bytes)”是衡量UDP传输性能的关键指标。 首先,让我们深入理解UDP协议的特点: 1. **无连接性**:与TCP(Transmission Control ...

    tcp/udp数据包格式详解 抓包分析二进制数据代表的意思

    本篇将深入探讨TCP和UDP数据包的帧格式,以及如何通过工具如tcpdump和Wireshark进行抓包分析。 首先,TCP数据包的头部结构是其核心特性之一,它包含了控制和同步数据传输的关键信息。一个基本的TCP头部由20字节组成...

    C语言伪造TCP、UDP数据包.zip

    在IT领域,网络编程是至关重要的一环,而伪造TCP和UDP数据包则涉及到网络协议栈的深入理解。本文将详细探讨如何使用C语言来构造IP、TCP和UDP头部,以及如何填充数据,这对于网络通信、安全分析和学习底层网络原理...

    UDP数据包协议

    2. **不可靠性**:UDP不保证数据包的顺序、可靠传输或重传,可能导致数据丢失或重复。 3. **快速传输**:由于没有复杂的连接和确认机制,UDP的传输速度较快。 4. **资源消耗小**:UDP协议开销小,适合对延迟敏感的...

    安卓真机上UDP程序收不到PC机数据包的解决方法

    3. 数据包大小限制:UDP协议对数据包大小有上限,超过这个限制的数据包可能会丢失,因此在设计通信协议时要注意数据包的大小。 4. 错误处理:在发送和接收数据时,都需要捕获并处理可能出现的异常,例如`IOException...

    Android模拟器接收UDP数据包的若干问题分析

    最后,模拟器对UDP数据包大小的限制。尽管真机设备没有明确的数据包大小限制,但在Android模拟器中,如果数据包大小超过大约8192字节(8K),模拟器可能无法接收。这是由于模拟器内部的限制,对于超大数据包,开发者...

    cpp-sokit是TCPUDP数据包收发测试调试工具

    cpp-sokit是一个针对TCP和UDP协议的数据包收发测试与调试...总的来说,cpp-sokit是网络编程中一个实用的辅助工具,它为开发者提供了一个便捷的平台,以测试和调试TCP/UDP数据包的收发,从而提升网络应用的质量和性能。

    linux下的UDP发包器

    可以利用原始套接字来完成发送自己填写的UDP数据包。整个程序由初始化原始套接口和发送UDP数据包两部分组成。UDP传输实体将用户数据加上UDP报头,形成UDP数据包,在UDP数据包上增加IP头部,形成IP数据包。 为了能够...

    UDP数据传输大小.pdf

    因此,实际应用中,我们需要根据目标系统和环境来确定合适的UDP数据包大小。 在编程接口方面,socket API允许应用程序设置接收和发送缓存的长度,这也影响了UDP数据包的大小。某些系统默认的UDP数据报大小超过8192...

Global site tag (gtag.js) - Google Analytics