UDP/TCP ①-UDP协议报文格式
这里是Themberfue
结束了HTTP/HTTPS协议的学习后,我们将进入传输层中的两个重要的协议——UDP/TCP
UDP协议报文格式
- 关于UDP的一些特点我就不做过多赘述了,详情见我之前的文章:UDP
- ✨UDP:无连接、不可靠传输、面向数据报、全双工
- 我们直接开始认识协议报文格式
- UDP协议是传输层的一个协议,传输层的上一层是应用层,下一层是网络层。所以,一个UDP数据报包括报头(header)和完整的应用层数据包(payload)。UDP报头分为四个部分,每个部分占用2个字节,总共占用8个字节
- 16位源端口号和16位目的端口号:源端口和目的端口相信大家已经是比较熟悉的了,五元组中的两个,端口号通常有传输层这边处理。既然是2个字节,那么就是16个bit位,所以理论上说端口号可以取的范围为 0~65535,实际上,一般把1024以下的端口保留,那么端口号的分配一般就在 1024~65535 之间。端口号通常由操作系统自动分配,当然也可以程序员手动分配,但还请不要为不同的程序分配相同的端口号。
- 16位UDP长度:这里的UDP长度指的是整个UDP数据报的长度,是包括报头和载荷的,但这里的16位是以字节为单位的,所以UDP数据报的最大长度可以达到65535字节,也就是64kb(包含报头);当然,这只是理论上的,实际中,由于网络层的限制,UDP报文通常不能达到64kb的理论值。
- ❓在互联网早期,64kb的最大长度是绰绰有余的,但是随着互联网的发展,人们发现64kb已经逐渐放不下应用层的完整数据了,比如应用层数据包里由一个较大的图片,这可能超过64kb,如果不作任何处理,数据会被截断,从而使传输的数据发生错误。
- 为了解决上述的问题,通常有两套解决方案:将应用层数据包进行拆包操作,将一个应用层数据包通过多个传输层数据报传输,然后在进行组包,显而易见,这样的操作要实现起来还是非常麻烦的;另一种方法就是直接换一个协议——TCP,TCP协议没有这样的长度限制。
- 16位UDP校验和:此处的校验作用并不是像HTTPS数字签名防止数据被篡改,而是防止数据在传输的过程是否发生损坏,通常表现为 “比特翻转”,也就是 1变成0,0变成1,数据在物理层都是通过光信号、电信号或者电磁波传递的,很难不受到某些不可抗力因素的干扰,这种干扰会导致数据发生损坏。在向下传输前先将当前数据计算出一个校验和放入这个字段中,对方在收到数据时,再通过一样的方法计算出校验和,与我这个传输前的校验和进行比对,若算出的结果不相同,UDP协议的做法通常是直接丢弃该数据报。
UDP长度字段的特性
冗余性:
- UDP 长度字段理论上是冗余的,因为 IP 数据报头也包含了数据长度。
- 但在某些情况下,IP 层可能无法准确确定 UDP 数据的实际边界,因此 UDP 长度字段可以作为独立的校验依据。
与 MTU 的关系:
- 最大长度通常受网络 MTU(最大传输单元)限制。
- IPv4 的 UDP 数据报最大长度为 65535 字节(IP 数据报最大长度),减去 IP 头部(20 字节)和 UDP 头部(8 字节),UDP 数据部分最大为 65507 字节。
- 在实际网络中,MTU 通常为 1500 字节(以太网),因此 UDP 数据部分通常限制在 1472 字节(1500 - 20 - 8)。
- UDP协议的讲解到这就差不多结束了,下节我们将进入TCP协议的讲解~~~
- 毕竟不知后事如何,且听下回分解
- ❤️❤️❤️❤️❤️❤️❤️