本节书摘来自异步社区《趣学ccna——路由与交换》一书中的第2章,第2.2节,作者 田果 , 彭定学,更多章节内容可以访问云栖社区“异步社区”公众号查看
趣学ccna——路由与交换
tcp是一个面向连接的协议,而udp则正好相反,它是一个“无连接的”协议。这意味着,您不会在这一节读到关于握手流程的那些复杂的内容,可以省下一些时间和精力用来刷微博、微信。但是,tcp费那么大工夫去握手可不是因为它空虚寂寞觉得冷,这一切都是为了保障接收方能够收到自己发送的数据。udp省掉了这个过程,这也就说明,udp 并不关心对方能不能收到它发送的信息。因此,如果说tcp发送出去的数据是能够随时查询投递状态的快递包裹或者挂号信,那么udp发送出去的数据就是普通的平信,虽然扔到邮筒里之后,理论上确实会有人把它最终投递到接收者的邮箱里,但实际上没有人会对它的丢失承担任何责任,它的投递状态也完全不可追溯。既然不需要追溯信息,也就不需要再定义那么多用来确认数据包状态的头部字段。所以,与tcp相比,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的应用层协议。
我们在这里简单总结一下: tcp 协议和 udp 协议都工作在传输层 ,其中 tcp 协议 是 可以给上层应用提供可靠传输服务的协议;而 udp 则是一个无连接的协议 ,不给上层协议提供有保障的传输。 tcp 协议为了确保对方能够接收到自己发送的数据,会在传输数据之前先与对端“彼此建立联系”,这个过程称之为建立连接,因此 tcp 称为 面向连接的协议。 tcp 建立连接的过程叫做三次握手;相应地;它也会采用四次握手的过 程与对端断开连接。而 udp 则远没有这么麻烦,它 不在乎对方是否能够接收自己的信息,也不在乎对方是否存在,就会直接把信息丢给对方,因此称为无连接的协议。
在了解了传输层的两个“大咖”之后,下面我们来说说网络层的协议。