学习一个网络协议,主要是学习“数据格式”,“报文结构”。
这种UDP的结构是一种方便与理解的结构但是实际上的UD并没有“动作”,实际上的结构如下:
前四个方框都是16个比特为因此都是2个字节,称之为UDP的报头,后面的称为UDP的正文/载荷,需要特别注意的是这8个字节是固定长度且没有固定分隔符来进行区分。
使用2个字节的长度来表示端口号,比如如果使用10W来表示端口,那么就会在系统底层进行截断,这里的源端口为发送请求的一方(客户端),目的端口为接收请求的一方(服务器),可以将这两部分分别理解为打电话和接电话,通过端口号就可以进行信息的交互。
UDP报文长度就是 报头长度+载荷长度。报文长度的单位是字节又由于UDP报文长度是2个字节因此最大值为65535约等于64KB,在这里需要特别注意如果使用UDP传送一个很大的数据就很麻烦,在当今这个时代64KB明显不够用,因此有两个方案可以解决这个问题1,把一个大的数据包拆分为多个分别进行传输。2,直接使用TCP。
现实情况就是我们选择方案2这是因为在UDP中实现分包组包的过程中存在不确定性,因为网络传输本身就是不确定性的,我们当然还有一种方法就是将报文长度进行扩大,很明显在创建UDP是并没有选择这种后来也没有使用这种方式来解决这种问题。UDP的设计初衷:UDP(用户数据报协议)是一种无连接的协议,设计时考虑了简单性和高效性,不提供流量控制和重传机制。它适用于需要快速传输、对延迟敏感的应用,如实时音视频传输、在线游戏等。因此,延长数据长度可能会增加处理复杂性,还有一些其他的原因在这里就不过多介绍了。如果使用这种方式作为一个网络协议并不是单方面修改就可以解决这个问题,假如服务器中实现了这个功能客户端那边没有实现这样就很容易出现BUG如果这样修改那么像手机/电脑之类涉及到UDP协议的设备都需要进行统一修改,因此相比与修改UDP,未来开发出新的歇息代替可能UDP是更简单一些。
校验和:产生校验和原因的前提是网络传输过程中,非常容易出现错误。例如我们通过电信号/光信号/电磁波等传播方式是非常容易受到外界因素影响导致传输信号改变,例如:比特翻转 在信号传输过程中 信号 0转变为1,1转变为0。在互联网快速发展的今天在地面上比特翻转的概率相对以往已经比较低了,但在太空中更为严重,因此在这条道路上依旧任重道远。校验和存在的目的就是能够“发现”并“纠正”这里出现的错误,通过给传输的数据中引入额外信息用来发现/纠正传输数据的作物,当然如果只是发现错误携带的额外信息就会少一些,反之信息就多(消耗更多的带宽)。
UDP中,使用两个字节传输校验和并且UDP使用简单有效的方案CRC校验和(循环冗余检验),通过这种方式吧UDP数据报整个数据都进行遍历,分别取出每个字节在2个字节的变流量上进行累加由于整个数据可能有很多,因此很有可能会溢出,但是在这里的重点并不是是否会溢出而是数据是否发生改变,在客户端(发送方)传递数据是会首先计算一个校验和,服务器(接收方)也会计算校验和如果这两个校验和相等那么数据就没有发生改变反之则发生了改变(这也是理想情况,仍有一些概率及其低情况)。
除CRC算法计算校验和之外还有另外两个经典的算法MD5和SHA1。
MD5本质上是一个字符串hash算法,其背后就是一个数学过程简单理解为套公式,相比于md5的计算细节更关心与:1, 定长 :无论输入的字符串长度多长,计算出的md5的结果都是固定长度。
2,分散:输入的内容哪怕只有一点点差别得到的md5的值都会差别很大。
3,不可逆:根据输入的内容计算md5非常简单,如果已知md5的值,还原出 演示内容,理论上是不可行的。