前言
这一节详细讲述UDP是如何运作的,可以运作在哪几个方面,UDP又有什么是之前没有了解到的知识。
一、UDP
我们无论设计什么网络应用程序,都要考虑到由应用层传输至运输层时是不能直接将报文直接传输,最少也得做点什么,比如上一节讲述的多路复用,或者由网络层所接收到的数据报,也不能直接递交给应用层进程,也得最少做点什么,比如上一节讲述的多路分解,运输层的最低限度是提供一种复用/分解的功能,以便可以完成数据的网络到进程的正确传输数据。
而这里介绍的UDP运输层协议【由RFC768定义】就是满足运输层最低限度要求,除了多路复用/分解以及少量的差错检测外,没有对IP增加任何东西。也可以这样说:如果应用程序开发选择UDP而不是TCP那么可以说明应用程序几乎是直接与IP打交道。与TCP不同的是,UDP在传输数据时候,并没有与目的端进行握手,也就是说明UDP是面向无连接的。
举个使用UDP例子:DNS是通常使用UDP协议的,当用户主机使用DNS应用查询地址时,进程构造一个DNS查询报文,通过套接字接口发送给运输层UDP协议,UDP为报文添加首部字段:将套接字接口端口号与目的端口号、长度、检验和(之后会讲)封装,并发送给网络层,网络层找到对应ip地址的查询服务器,由网络层进行数据报分解为报文段,由运输层UDP多路分解,将报文发送给对应端口号的套接字接口,并合并为报文传递给对应进程,进程对这一系列进行响应,并按照之前的方式发送回客户端。
二、选择性UDP优点
1.UDP优点
当然我们知道,UDP是不提供可靠数据传输的,那么是不是我们在设计程序之初有限选择TCP而不是UDP呢?
答案当然是否定的,与所有研究一样,每个协议都有它运作不同环境下的点,也存在着更适合UDP而不是TCP协议的地方。也许我们会提出疑问,要是数据丢失,数据不完整那不是糟糕了,对于选择上来看,我们当然选择最优的,简单的例子,例如:视频通话,假设全校学生在同一时间段都在给自己的父母进行视频通话,而如果所有人选用的是TCP协议,这虽然可以保证通话传递信息的正确性,但是TCP拥有拥塞协议,现在时间段内,所有人都有视频通话都会产生TCP连接,会造成网络拥塞,而TCP会主动阻止某些或者是一部分同学的TCP连接,使得网络正常运行,也就是说,你和父母的通话虽然信息传递都是正确的,但不是实时的,有可能存在时延,你回答父母的话有可能是父母早就说了的。但如果使用UDP就不会产生这种令人头疼的时延问题,虽然有可能卡顿,或者有几个字没有传输成功,但是并不影响实时性,这也是UDP没有拥塞协议的一点,那么如果在这样的环境下,你会选择哪种协议呢,相信大家都会选择后者,因为对于视频通话来说,缺少点信息其实不痛不痒。
UDP还有如下优点:
- 关于发送什么数据以及何时发送数据控制精确。这里类比之前提到的视频通话的例子,TCP有拥塞控制机制,流量大时会延迟其他TCP的通信,而UDP如果一旦发送传输,则不管这些,不会考虑网络负担问题。
- 无需建立连接。与TCP不同,TCP在进行数据传输时,需要端对端事先进行三次握手,并进行连接之后传输数据,而UDP则不需要进行连接与过多的握手操作,其实可以视为节省了一部分时延。这也是DNS为什么不用TCP的原因之一,假设DNS最差要查询的服务器为三个:根服务器、TDL服务器、本地服务器,如果DNS使用TCP则需要与三个不同的服务器分别进行三次握手,总计9次握手,则返回查询的IP地址相较UDP会较慢一些。
- 无连接状态。TCP要在连接传输数据的过程中维护连接状态。此连接状态包括了接收、发送数据缓存、拥塞控制参数以及确认号的参数,这是TCP可靠性所必须需要的参数。而UDP则不追踪这些参数。
- 分组首部开销小。每个TCP报文段都有20个字节的首部开销,而UDP只有8个字节的首部开销。
下表是流行英特网应用中运输层协议
| 应用 | 应用层协议 | 运输层协议 |
|---|---|---|
| 电子邮件 | SMTP | TCP |
| 远程终端访问 | Telnet | TCP |
| web | HTTP | TCP |
| 文件传输 | FTP | TCP |
| 远程文件服务器 | NFS | UDP |
| 流式多媒体 | 通常专用 | TCP或者UDP |
| 因特网电话 | 通常专用 | TCP或者UDP |
| 网络管理 | SNMP | 通常UDP |
| 名字转换 | DNS | 通常UDP |
2.报文结构
报文结构如下:
| 源端口号 | 目的端口号 |
| 长度 | 检验和 |
| 报文内容 | |
UDP报文结构中首部由四个字段构成,每个字段2个字节,所以首部字段一共8个字节,源端口号和目的端口号不再赘述,长度是报文结构中首部字段长度加上报文内容字段的长度,检验和是为了UDP做差错检验的计算使用的,差错检验的详细内容于之后的6.5节会及逆行讲述,现在做一个检验和的简单描述。
3.UDP检验和
UDP的检验和提供了差错检验的功能,,检验用于确定,当前传输的数据由源端系统到目的端系统后,字段是否发生改变。发送方计算16进制位比特和进行反码运算,溢出的字节将进行回卷。下面给出一个例子:
有三个16比特的字:
0110011001100000
0101010101010101
1000111100001100
要计算它们的和,先对前两个字进行加和运算得到:1011101110110101
再和第三个进行加和计算:
1011101110110101
1000111100001100
——————————
0100101011000001 + 1
最后这一步的意思就是回卷,我们可以看到在,最左边的字节进行加和时候,有溢出的1,溢出的1必须与最低位进行加和,故最后得到的值为:
0100101011000010,而反码是将0变为1而1变为0,这里进行反码运算后的值为:1011010100111101。(ps:我自己去查了一下反码运算,好像不是书中说的这样,反码运算是带符号的,按照我们现在进行运算来看,正数应该在字节前加上一个0,负数应该加上一个1,而负数是需要进行反码的,也即是0变1,1变0,之后再进行加和运算,这里的反码运算好像和我查找的反码运算不太一样,也不知道是不是自己理解有问题,但是这不影响我们学习检验和,这里只用知道这样做就可以),反码运算后,在接收方,将所有的这四个比特进行加和,如果得出的值为:
1111111111111111,则证明数据没有差错,但如果出现一个0,则数据有差错。
总结
这一节的内容我们主要学习了UDP,与什么环境下选择使用UDP,UDP与TCP的差别、UDP报文结构与UDP的检验和,在最后提示一点,虽然UDP有差错检验,但是没有差错恢复功能,UDP的差错检验作用只是提示端系统,发送出的报文是不是很好的传递出去而已。
本文探讨了UDP协议的基本原理,如何在无连接情况下工作,以及其在选择性应用中的优点,如实时性、报文结构和检验和。重点讲解了UDP与TCP的区别,适合场景如视频通话。
3249

被折叠的 条评论
为什么被折叠?



