UDP协议是除了TCP外的另一种运输层协议。与TCP不同的是,UDP提供无连接服务,因此,UDP是不可靠的,无法保证数据传送不出现差错。UDP的特点是简单、高效、开销小。
UDP是面向消息的。UDP不会把两个应用层交给的报文组合在一起,也不会把单个的报文分成几个数据块。UDP只会将应用程序交给的一块数据作为一个UDP报文发送,并组装成一份待发送的IP数据报。这与TCP面向流的发送是不同的,因为在TCP中,应用数据会被分割成最适合发送的数据块。这是UDP与TCP在数据发送方式上的区别。
UDP除了在IP上增加了一个端口寻址能力外,完全不具有什么额外的控制和功能。UDP的某些熟知端口如表6-3所示。
表6-3 UDP熟知端口
UDP报文(协议标准称为数据报)的首部非常简单,如图6-13所示。各字段的含义如下。
图6-13 UDP首部
1)源端口号:16bit字段,标识发送方的应用程序。
2)目的端口号:16bit字段,标识接收方的应用程序。
3)UDP报文长度:16bit字段,表示整个报文段的长度,包括首部和数据。最小值是8字节,也就是无数据字段的UDP报文,仅仅包含UDP首部。
4)UDP校验和:16bit字段,UDP的校验和与TCP检验和相同,同样是检验整个报文加上前面附加的IP伪首部。算法也仍是采用二进制反码相加的方式。UDP的校验和是可选的。如果不使用该字段,就设置为零。因为IP首部校验和只检验IP首部而不检验数据部分,因而如果UDP不使用校验和,那么数据部分直到交付给应用层都不会被检验。UDP提供的是不可靠服务,校验和字段确实有些画蛇添足。(www.daowen.com)
到这里为止,已经将MAC层、网络层、传输层的协议数据单元(PDU)的结构弄清楚了。各层次的PDU关系如图6-14所示。一个UDP报文由UDP首部和应用程序送来的数据组成,然后该UDP报文作为IP数据报的数据部分,与IP首部结合为一个IP数据报。之后该IP数据报加上以太网首部和尾部(图中未画出尾部的CRC校验),封装为MAC帧,MAC帧变成串行的比特流,使用适当的数据信号编码才能真正在以太网上传播。
图6-14 各层协议PDU的封装关系
在重新熟悉了各层次协议帧结构的关系之后,来看一个实际中得到的UDP报文,如图6-15所示。通过解析一个真正的UDP报文实例,总结一下各层PDU结构的知识。
图6-15 一个实际的UDP报文
图中的数据是从线路上得到的比特流,这似乎是一连串毫不相关的十六进制表示的0、1比特流,而现在的目的就是要逐步揭开这些数字背后的信息。
首先,大家知道这是从以太网网卡来的一个MAC帧,最外层的应该是位于MAC层的以太网帧的首部。根据以太网的帧结构,|00|18|4d|dd|56|d9是目的MAC地址,而|00|18|f3|d5|aa|db则为源MAC地址。之后的0x0800是类型字段(数值的大小也表明这是以太网MAC帧结构,而非IEEE 802.3MAC帧结构),代表网络层协议为IP。后面是IP数据报。
首先对IP首部进行解析。0x45是两个四位组,0x4是版本号,代表着IPv4。而0x05则是IP首部的长度字段,表明是20字节。之后的字节0x00为服务类型。而0x0045是IP数据报的总长度,为64字节。之后的16位,0x5452为其标识符。之后的0x00代表标志位和偏移量均为0。而0x80为生存期字段,TTL=128。之后的8位为协议字段,0x11表示是UDP协议。0x62a3为首部校验和,其后的一连串字段分别为源IP地址|c0|a8|01|66(192.168.1.102)和目的IP地址|c0|a8|01|01|(192.168.1.1)。之后进入UDP首部。
在UDP首部中,0x6731为源端口号(26417),0x0035为目的端口号(53)。0x002c是UDP报文长度,为44字节。之后的0x5223为UDP检验和。其后的部分为UDP数据部分。
如果细心的话就会进一步发现该UDP报文中数据字段所包含的内容,该UDP报文的目的端口号是53,53是一个熟知端口号,用于DNS域名解析服务协议。也就是说UDP的数据部分是DNS的报文内容。DNS是应用层的一个协议,对其的解析是下一章的内容。当了解了DNS协议后,这部分的内容同样可以逐字段解析。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。