实际地址 F0-4D-A2-5C-FF-65
IP 地址 192.168.1.108
子网掩码 255.255.255.0
默认网关 192.168.1.254
DHCP 服务器 192.168.1.254
获得了租约 2012-11-26 172755
租约过期 2012-11-27 172755
DNS 服务器 202.97.224.68, 202.97.224.69
WINS 服务器
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以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。tcp ip协议设置怎么填
---------------------------------------------------------------------------------------------------------------------
经测试,局域网环境下,UDP包大小为1024*8,速度达到2M/s,丢包情况理想.
外网环境下,UDP包大小为548,速度理想,丢包情况理想.
如何把MPEG4(或H.264)的视频流拆分成一个个的RTP包?
MPEG-4和H.264拆分RTP包的方法原理基本上相同的,具体实现上还是有差别的,可以查看不同的RFC文档,H.264的是RFC3984。
一个rtp包的最大长度为多少,rtp包头信息怎么填,payload type等于多少?
一个rtp包如果是经过UDP传输的原
则上不要超过1460,原因如下:RTP基于UDP之上的传输协议,而UDP属于运输层,我们知道以太网数
据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节被成为链路层的MTU(最大传输单元),去除IP数据报的首部20字节和UDP首部的8字节,所以UDP数据报的数据区最大长度为1472字节,考虑到RTP包头的12个字节,这样RTP载荷的最大尺寸为1460字节。如果要封装进RTP载荷的数据大于1460字节,而且不在应用层数据装载进RTP分组之前进行载荷的拆分,这样就会产生大于IP网络MTU的分组。如此一来底层的协议(IP)将会对这种大的分组进行拆分,分为几个小于IP MTU尺寸的IP分组。这样就无法检测数据是否丢失,原因如下:IP和UDP协议都没有提供分组到达的检测,如果拆分后第一个分组成功接收,而后续分组丢失。由于第一个分组中包含完整的RTP头信息,而RTP头中也没有关于RTP载荷长度的指示,因此不能判读该RTP分组是否有丢失,而只能认为是完成接收了,这样就会造成解码时的错误信息。
rtp头的信息就按照RFC标准填写。
payload type因为没有定义,所以可以是96-127之间的任意值.
RTCP包要不要我来发送,如何发送,什么时候发送,发什么内容??
如果用jrtplib会自动发送RTCP包。
如何把MPEG4(或H.264)的视频流拆分成一个个的RTP包?
MPEG-4和H.264拆分RTP包的方法原理基本上相同的,具体实现上还是有差别的,可以查看不同的RFC文档,H.264的是RFC3984。
一个rtp包的最大长度为多少,rtp包头信息怎么填,payload type等于多少?
一个rtp包如果是经过UDP传输的原则上不要超过1460,
原因如下:RTP基于UDP之上的传输协议,而UDP属于运输层,我们知道以太网数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节被成为链路层的MTU(最大传输单元),去除IP数据报的首部20字节和 UDP首部的8字节,所以UDP数据报的数据区最大长度为1472字节,考虑到RTP包头的12个字节,这样RTP载荷的最大尺寸为1460字节。
如果要封装进RTP载荷的数据大于1460字节,而且不在应用层数据装载进RTP分组之前进行载荷的拆分,这样就会产生大于IP网络MTU的分组。
如此一来底层的协议(IP)将会对这种大的分组进行拆分,分为几个小于IP MTU尺寸的IP分组。这样就无法检测数据是否丢失,
原因如下:IP和UDP协议都没有提供分组到达的检测,如果拆分后第一个分组成功接收,而后续分组丢失。由于第一个分组中包含完整的RTP头信息,而RTP头中也没有关于RTP载荷长度的指示,因此不能
判读该RTP分组是否有丢失,而只能认为是完成接收了,这样就会造成解码时的错误信息
。
rtp头的信息就按照RFC标准填写。
payload type因为没有定义,所以可以是96-127之间的任意值.
RTCP包要不要我来发送,如何发送,什么时候发送,发什么内容??
如果用jrtplib会自动发送RTCP包。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论