趣学CCNA:路由与交换(第2版)
上QQ阅读APP看书,第一时间看更新

2.2 UDP概述

TCP是一个面向连接的协议,而UDP则正好相反,它是一个“无连接的”协议。这意味着,你不会在这一节读到关于握手流程的那些复杂的内容,可以省下一些时间和精力用来刷微博、微信。但是,TCP费那么大工夫去握手可不是因为它空虚寂寞,这一切都是为了保障接收方能够收到自己发送的数据。UDP省掉了这个过程,这也就说明,UDP并不关心对方能不能收到它发送的信息。因此,如果说TCP发送出去的数据是能够随时查询投递状态的快递包裹或者挂号信,那么UDP发送出去的数据就是普通的平信,虽然扔到邮筒里之后,理论上确实会有人把它最终投递到接收者的邮箱里,但实际上没有人会对它的丢失承担责任,它的投递状态也是难以追溯的。既然不需要追溯信息,也就不需要再定义那么多用来确认数据包状态的头部字段。所以,与TCP相比,UDP的头部格式要简单得多,详见图2-7。而精简的数据包头部可以提高传输层的效率,增加数据包中数据的占比,同时也因为设备不需要再处理这么多的头部信息,所以也可以提高UDP的处理速度。

图2-7 UDP的头部格式

在真正动手写作UDP头部格式之前,我曾一度想用“不解释”三个字带过,这样不光可以省掉很多笔墨,还可以显得十分洒脱不羁。UDP头部格式和TCP相比,实在是简单得吓人,甚至其中根本没有一个字段不包含在TCP定义的头部字段之中,再作解释,岂不是有复制粘贴之嫌?可一想到出版物毕竟不是课堂,更不是技术交流论坛,万一因为这三字被编辑打了回来,还得放下手头的其他工作回过头来补稿,反而弄巧成拙,所以这里还是简略地对UDP头部给出以下三点解释。

虽然UDP头部格式中包含的四个字段统统可以在TCP头部格式中找到,但因为UDP是无连接的协议,所以它并不要求对端向自己回复数据。这样一来,UDP的源端口号就成了一个按需使用的字段。当UDP发送的数据不需要对方回复时,可以将源端口号设置为0

相信你福至心灵,早就看出了UDP头部是没有可选项字段的。没有可选项字段,UDP头部长度也就因此而固定了下来。所以,对于UDP来说,定义头部的长度没有任何必要,而UDP头部中的“UDP长度”字段描述的当然也就不是头部长度,而是整个数据段的长度,其中包括了头部字段和数据部分的长度

UDP对数据提供的是不可靠的传输,因此虽然UDP头部字段中提供了校验和字段,但这个字段的使用也不是强制的,就像UDP源端口号字段是可选的道理一样。

关于UDP,我们已经没有什么细节可惦记。在本节最后,我们遵循TCP的惯例,通过表2-2来向读者介绍几个常用的基于UDP的应用层协议。

表2-2 基于UDP的几个常见应用层协议

我们在这里简单总结一下:TCP和UDP都工作在传输层,其中TCP是可以给上层应用提供可靠传输服务的协议;而 UDP 则是一个无连接的协议,不给上层协议提供有保障的传输。TCP为了确保对方能够接收到自己发送的数据,会在传输数据之前先与对端“彼此建立联系”,这个过程称之为建立连接,因此TCP称为面向连接的协议。TCP建立连接的过程叫作三次握手;相应地,它也会采用四次握手的过程与对端断开连接。而UDP则远没有这么麻烦,它不在乎对方是否能够接收自己的信息,也不在乎对方是否存在,就直接把信息丢给对方,因此称为无连接的协议。

在了解了传输层的两个“大咖”之后,下面我们来说说网络层的协议。