赞
踩
在之前的文章里面,我们介绍了TCP协议的相关内容。TCP协议是一种基于连接的传输层协议,他可以保证数据完整正确的从网络的一端到达另一端,但是代价是什么呢?当然就是传输速度了。
数据的可靠性和数据的传输速度是两个不可兼得的特性,可靠性就意味着要对数据进行反复确认,要实现建立连接,但是这些过程都需要浪费数据传输的时间。所以我们应该做的是在适当的使用场景使用适当的传输协议。
而在一些对数据可靠性要求不那么高,反而对数据传输速度要求比较高的场合,如视频聊天,语音通话等,就需要用到无连接的不可靠的传输协议了,也就是我们今天要讲的UDP协议。
UDP协议具有以下特点
就像TCP协议一样,UDP协议同样也是将数据切割为一个一个的数据报进行发送,下面是一个典型的UDP数据报的格式:
可以看到,UDP数据报由两部分构成,分别是首部和数据部分,其中首部占8字节,由以下字段组成:
以上就是UDP报文段的格式,当某个应用程序要发送数据时,UDP将数据报的报头字段填充好,并将数据附加在报头后面,形成一个完整的UDP数据报,然后顺着网络进行传输。
当接收方的UDP从网络中接收到UDP数据报后,根据目标端口号将数据报交给对应的应用程序进行处理。接收方将解析数据报的报头字段,提取出数据并传递给应用程序处理。
这就是UDP协议中数据报的封装和解封装的过程。
当使用UDP协议进行数据传输时,校验和是一项重要的机制,用于检测数据报在传输过程中是否发生了错误。毕竟虽然UDP是不可靠的传输方式,但数据报对不对还是要知道的,毕竟丢掉错数据总是比传输错数据要好。
我们可以首先介绍一下校验和的计算方法,以n个字节的数据需要求他的校验和为例:
上面是这个过程的叙述,为了让大家更加直观的了解这个过程,可以举一个例子。比如说我有一个5字节的数据0x123456789A,我们要求这个数据的校验和。
首先,这个数据的字节数不是一个偶数,所以最这个数据的最后要添0,即将这个数据变为0x123456789A00;
按顺序将数据划分为16位的字块,如下图:
对多个字块执行二进制加法操作,得到数据X,如图:
X的值超过16位,将高位溢出的部分加回到低位,得到0000 0010 1010 1101
对X进行取反,得到校验和,所以0x123456789A的校验和就是1111 1101 0101 0010,也即0xFD52
如此,我们就知道了n个字节的数据如何求他的校验和,接下来我们介绍整个UDP报文段是如何求校验和的。
首先,会将UDP报文段进行扩展,在UDP报文段头部之前扩展出一个伪头部。伪头部中包含了4字节的源IP地址、4字节目的IP地址,1个字节的全0和1个字节的协议号最后还有2个字节的UDP长度,如下图:
伪头部的作用主要是将伪头部的这些消息也校验一次,防止发生比如发错地址等问题。当然,伪头部的消息在UDP报文段发送时候是不参与的,他们并不能算是UDP报文段的一部分,只是参与校验和的计算而已。
之后发送方把校验和置为全1,然后将所有的UDP伪头部、头部、数据部分一起进行校验和计算,得到最终的校验和,填入校验和字段,这就是UDP校验和计算的全过程。
我们都知道TCP和UDP的一些区别,主要在于他们的可靠性和效率方面,我们这边列举了一些基于UDP和基于TCP的协议,供大家参考。
协议 | |
---|---|
TCP | HTTP、FTP、SSH、SMTP |
UDP | DNS、DHCP、TFTP、SNMP |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。