传输层—UDP—校验和
学习一个协议,当然要掌握协议的特性,还需要理解协议报文格式。
UDP
UDP 基本特点:无连接、不可靠传输、面向数据报、全双工
UDP报头包含:源端口、目的端口、UDP报文长度、校验和。
UDP载荷中:是完整的应用层协议数据
在传输层,一次通信,涉及到 5 元组。(源端口、目的端口、源IP、目的IP,协议类型)
端口号:最大是2个字节,能表示多大的数据范围呢? 0 ~ 65535,这就是合法端口号的有效范围,不能再大了(实际上 0 不会使用的)。1-1024 这个范围的端口号,系统赋予了特定的含义,一般也不建议咱们使用。(相当于飞机的头等舱仓,都是知名端口号)
UDP报文长度:最大2个字节,传输数据时是16位,其范围也是 0~65535 字节,换算一下就是 64 kb。一个 UDP 报文长度最长也就是 64kb.
对于 199x 那个年代来说,64kb 可谓是一个很大的数字,可以表示很多东西。
但对于现在的我们来说,64kb 非常小。那我们能不能把这个长度给改大呢,用4个字节来表示??答案是否定的。
那我们在写程序的时候,传输的报文超过2字节怎么办??
- 在应用层中,把数据拆分成多组,通过多个UDP数据报进行传输
- 使用 TCP 代替 UDP。TCP 没有要求报文长度。
以下的字节范围大小需要牢记。
校验和
在网络传输中,受到外界干扰,数据可能会出错!!
因此,在接收方收到数据后,就需要先确认一下,这个数据是否是一个错误的数据。校验和就是简单有效的方式。
例子:
我去市场买菜,列出一个清单:黄瓜、鸡蛋、西红柿、芹菜。一共四样。
当我卖完菜了,清点一下数目发现不对劲,只买了三样菜,此时就发生了异常。
实际的校验和,不仅仅是一个”长度“,而是根据数据的内容来生成的。当内容发生改变的时候,就能感知出错误。
UDP 的校验和具体是咋实现的? 使用了一种简单粗暴的 CRC 校验算法。(循环冗余校验和)
加着加着,可能就溢出了~~溢出也无所谓。所有字节都加了一遍,最终就得到了校验和。传输数据的时候,就会把原始数据和校验和一起传递过去。接收方收到数据,同时也收到了发送端送过来的校验和(I日的校验和)。接收方按照同样的方式再算一遍,得到新的校验和。如果旧的校验和和新的校验和相同,就可以视为数据传输过程中是正确的。如果不同,则视为传输过程中数据出错了。
但是,有时候会出现,校验和相同,但是传输的数据和发送时候的数据不同,也就是数据发生错误,但校验和是对的。
原因:好巧不巧,某个字节,多了1。某个字节,少了1。二者相加,正好抵消。
此校验和方法并不是那么严谨,但在工程上,也是够用的。