UDP 报文结构
基本上所有的教科书上都是这样画的图, 但实际上 UDP 报文结构不是这样的, 这样显示应该是容易排版.
正确应该如下图 :
1.端口号 :
每个端口号在 UDP 报文里占两个字节, 取值范围就是: 0 ~ 65535
源 ip 和源端口描述了数据从哪里来, 目的 ip 和目的端口描述了数据去哪里.
补充 : 小于 1024 的端口称为 “知名端口”, 是给一些名气比较大的服务器预留的端口, 这部分端口在我们写代码时, 不应该使用. (如果某个知名端口没有被使用, 那么使用这个端口也没关系)
2.报文长度 :
就是整个报文(报头加载荷)多大, 两字节也就是 64kb 大小, 也就是说一个 UDP 报文最大长度就是 64kb.
那如果要传输一个比较大的数据咋办呢?
- 可以对大的数据进行拆分, 使用多个数据报来传输. (涉及到数据的拆分,比较复杂)
- 不用 UDP 了, 直接用 TCP, TCP 没有限制.
总结 : 使用 UDP 编程的时候, 要注意 UDP 的数据报不能太长, 否则会出问题.
3.校验和 :
网络传输其实并非是很稳定的, 经常会出错的. 在数据传输过程中, UDP 报头和载荷都可能出错. 校验和就是用来检查当前传输的载荷是否出错的.
校验和其实就是用载荷内容进行某种算术运算后得到的数据, 在 UDP 报文发出前计算一次校验和, 然后接收方收到后也根据载荷内容计算一次, 根据是否相同来判断数据是否出错了.
如果校验和不对, 那么数据一定出错了; 如果校验和对了, 数据也是有一定的概率出错的.
为了让校验和能够识别率高一点, 计算的时候通常会以数据的内容作为参数进行计算, 数据内容发生变化, 校验和也就发生变化.