之前我们已经针对以太网、IP、TCP协议,进行了包头赏析。本次,我们继续UDP协议包头赏析。
提到TCP,想必大家会有所了解,它早已是家喻户晓的一个网络协议了,而UDP远没有他的大哥那么的有名,所以,我们有必要先介绍下这个幕后的英雄。
【UDP是什么】
UDP,是User Datagram Protocol的缩写,中文翻译过来就是用户数据报协议,它和TCP是一对兄弟,同样位于OSI七层协议体系中的第四层“传输层”,向互联网提供面向事务的简单不可靠信息传送服务。
正如刚才介绍的那样,UDP提供的是一种不可靠信息传输,此时,你是否会心生疑惑:“科技都发展的这么厉害了,怎么还有这么不要强的协议呢?竟然自己承认自己的服务不可靠?”
【UDP存在的合理性】
并非UDP自己不要强,而是UDP的确有他存在的合理性和必然性。
众所周知,网络数据包在从上层到下层组建时,会由于上层包很大而需要拆分成较小的组再进行传输,这样的话,势必引出“哪些组先到目的地,哪些组后到目的地”的问题。TCP协议好似一个做事严谨的理科生,它对工作非常仔细,要求所有被分了组的数据,要按照原有的顺序,从前到后的发送到目的端。而UDP协议则好似一个文科生,它更讲究的是抒情和随性,只要分了组的数据被传送出去了,它就不会太在意、太上心了。
虽然,大多数人会认为TCP是一个靠谱的学生,但是,这种靠谱,是需要付出效率与性能的代价的。在一些不需要非常严谨的场景下,UDP反倒是一个更好的选择,比如语音传输、视频传输时,人们可能对正确性的关注度并非那么敏感,但是流畅度确是影响用户体验的关键指标。
【UDP的重要用户】
他们是DNS查询、视频传输、QQ、TFTP等等。
【UDP协议报头格式】
惯例,先看图,后解释:
图已经很清晰,UDP报头要比TCP的简单许多,只有区区8个字节,即源端口、目的端口、用户数据报长度、校验和。就凭这一点,就比TCP那复杂的20字节报头,要轻便了许多。
此处唯一需要解释一下的,就是“用户数据报长度”,它占了16位bit,能表示的最大长度是2^16,单位是字节。这里所指的长度,是包含UDP报头在内的总长度,而非数据部分的长度。
【UDP数据报长度一般设置为多少比较合适】
看到一位朋友对此问题解释的很是清晰,在此直接转帖过来,也对rain_fish表示感谢。(原帖地址在这里):
在进行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)以内.
原文转自:http://blogread.cn/it/article/6360?f=wb