教年轻 AIoT 创业者如何从 0 到 1 实现AIoT 创业项目 了解详情
写点什么

为什么 UDP 头只有 8 个字节 (二)

  • 2020-01-13
  • 本文字数:2549 字

    阅读完需:约 8 分钟

为什么 UDP 头只有 8 个字节 (二)

数据传输

RFC768 在介绍 UDP 协议时强调 UDP 协议假设底层会使用 IP 协议。IP 协议是 TCP/IP 协议栈的核心成员,它不保证端到端数据的可靠性和顺序,也不包含流控制等机制,其作用就是从来源向目的地传输数据包6。在本文中,我们只需要知道 IP 协议头中包含源 IP 和目的 IP,就不展开介绍 IP 协议的具体实现了,感兴趣的读者可以阅读 RFC791 和相关文档了解更多的内容。


『UDP 协议只能尽力送达数据』这一说法『继承』自 UDP 的下层协议,也就是 IP 协议。只包含了两个端口号的 UDP 协议本身是无法提供路由和寻址功能的,它还是需要下层的协议来解决这个问题。


上面提到的这种各司其职的设计源于网络通讯协议的分层结构。抽象是计算机科学中的基础概念,通过定义良好的接口、构建抽象层,我们可以减少同时需要关注的问题,让每一层都能聚焦到需要处理的问题上。TCP/IP 协议簇将通信过程分成了四个抽象层,分别是:链接层(Link)、网络层(Internet)、传输层(Transport)和应用层(Application)7



图 2 - TCP/IP 协议簇的抽象层


不同的抽象层有着完全不同的功能,我们来看一下网络层和传输层的职责。TCP 和 UDP 等传输层协议的主要作用是为应用建立基本的数据管道,为特定任务提供数据传输的功能;而 IP 等网络层协议的主要作用是寻址和路由,它能够帮助我们将数据发送目标的主机。


简单总结一下,UDP 协议下层的 IP 协议实现数据包的传输,虽然 UDP 属于传输层协议,但是其本身没有提供主机到主机的数据传输能力。

进程定位

在软件层面上,端口是用来表示特定进程或者特定类型网络服务的逻辑概念8,计算机硬件中也有端口的概念,但是这里说的端口是没有实体的。当主机接收到 IP 数据包时会根据协议号交给不同的模块处理,TCP 和 UDP 协议会根据端口号确定送给对应的进程处理。


虽然 TCP 和 UDP 协议中都有端口号这一概念,但是因为它们两者的端口不在一个命名空间下(TCP 和 UDP 是两套命名空间),所以 TCP 和 UDP 可以同时使用相同的端口号,例如:53/TCP53/UDP,这两个端口号后的服务都处理 DNS 请求。从这一点来看,只有通过 IP 地址、传输层协议和端口号三者才能在网络上定位到具体的服务,只凭借 IP 地址和端口号是不可行的。



图 3 - TCP 和 UDP 的重复端口号


UDP 协议中的两个端口号占据了 UDP 协议头的一半开销,这从侧面表明了端口号在 UDP 协议的重要地位和 UDP 协议的主要功能。接收 IP 数据包的主机可以使用目的端口号找到特定的进程,该进程也可以使用数据包中的源端口号向发送方回复数据。



图 4 - 端口号和进程


TCP 和 UDP 的端口号是主机和进程的中间层,进程和端口号既可以是一对一的关系,也可以是一对多的关系,端口号的引入可以让同一个主机上的多个进程对外提供服务,也可以让一个进程对外提供多个服务。有了端口号,想要访问主机服务的请求也不需要使用进程标识符等方式定位提供服务的具体进程。

总结

简单回答一下本文提出的问题:UDP 协议利用下层的 IP 协议提供基本的数据传输能力,它的作用就是引入端口号的概念让同一主机可以同时提供对外多个服务,由于不保证可靠性,所以协议本身只占用 8 个字节。


在理想情况下,我们可以在 IP 协议上构建新的传输层协议实现特定的需求,不过在实际操作中由于协议号的限制,新的传输层协议无法被大量部署的网络地址转换(Network address translation,NAT)9设备识别和支持,所以使用这种方式构建新的传输层协议在实践中难以落实。


注 1:协议号是 IP 首部中的一个字段,它表示当前报文数据区使用的协议,最常见的 TCP 和 UDP 协议的协议号分别是 6 和 17。

注 2:SCTP 协议10就是一个 RFC 标准中的传输层协议,但是 NAT 设备的兼容性问题会导致 SCTP 报文被丢弃。


由于 UDP 协议非常简单,很多新的传输层协议都会基于 UDP 实现,例如:Google 的 QUIC 协议11。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:


  • UDP 协议中的长度和校验码可以被省略么?为什么?

  • 除了 UDP 和 TCP 协议,其他基于 IP 的传输层协议有没有端口号的概念?


如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。


  1. Postel, J., “User Datagram Protocol”, STD 6, RFC 768, DOI 10.17487/RFC0768, August 1980, https://tools.ietf.org/html/rfc768

  2. 为什么 DNS 使用 UDP 协议 · Why’s THE Design?, November 2019 https://draveness.me/whys-the-design-dns-udp-tcp

  3. Stackoverflow: UDP checksum calculation, Sep 2017 https://stackoverflow.com/questions/1480580/udp-checksum-calculation

  4. Mockapetris, P., “Domain names - implementation and specification”, STD 13, RFC 1035, DOI 10.17487/RFC1035, November 1987, https://www.rfc-editor.org/info/rfc1035.

  5. 为什么 TCP 建立连接需要三次握手 · Why’s THE Design?, Oct 2019 https://draveness.me/whys-the-design-tcp-three-way-handshake

  6. Postel, J., “Internet Protocol”, STD 5, RFC 791, DOI 10.17487/RFC0791, September 1981, https://www.rfc-editor.org/info/rfc791.

  7. Wikipedia: Internet protocol suite https://en.wikipedia.org/wiki/Internet_protocol_suite#Link_layer

  8. Wikipedia: Port (computer networking) https://en.wikipedia.org/wiki/Port_(computer_networking)

  9. Wikipedia: Network address translation https://en.wikipedia.org/wiki/Network_address_translation

  10. Stewart, R., Ed., “Stream Control Transmission Protocol”, RFC 4960, DOI 10.17487/RFC4960, September 2007, https://www.rfc-editor.org/info/rfc4960.

  11. Wikiepedia: QUIC https://en.wikipedia.org/wiki/QUIC

关于图片和转载

本作品采用知识共享署名 4.0 国际许可协议进行许可。


  转载时请注明原文链接,图片在使用时请保留图片中的全部内容,可适当缩放并在引用处附上图片所在的文章链接,图片使用 Sketch 进行绘制,你可以在 [](https://draveness.me/sketch-and-sketch) 一文中找到画图的方法和素材。
复制代码


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/whys-the-design-udp-minimum-header


活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2020-01-13 17:47596

评论

发布
暂无评论
发现更多内容

如何缓解低代码开发的安全风险

YonBuilder低代码开发平台

小程序云开发 开发者 低代码 APP开发 APICloud

百度南渡,护航泉州水务的产业智能化征程

脑极体

Linux OOM Killer

OutOfMemory1024

Linux

计算机原理学习笔记 Day12

穿过生命散发芬芳

计算机原理 4月日更

乘“云”加速疾病诊断研发,亚马逊云科技新阶段“诊断开发计划”已开启!

亚马逊云科技 (Amazon Web Services)

运动的这两个价值,你知道吗?|靠谱点评

无量靠谱

AIOps智能运维

进击的梦清

运维自动化 AIOPS 智能

如何批评下属?

石云升

团队建设 28天写作 职场经验 管理经验 4月日更

Guide to UUID in Java

OutOfMemory1024

Java

Ubuntu 20.04 启用休眠(Hibernate)配置过程

OutOfMemory1024

Ubuntu20.04

采访彩食鲜 CTO乔新亮:程序员如何持续的登上新台阶

风翱

4月日更 采访提纲

微服务架构核心基础讲解

麦洛

微服务

不惧业务规模与复杂性,实现敏捷的云转型“三步走”就对了 | 云途专栏

亚马逊云科技 (Amazon Web Services)

如何从零开始学Python:(5)如何处理列表中嵌套多个列表?

广之巅

Python 4月日更

《专访阿里研究员吴翰清:云时代,如何建设更安全的互联网环境?》(采访提纲)

xiezhr

网络安全 阿里吴翰清

Linux nslookup 命令

一个大红包

Linux linux命令 4月日更

如何打造更为精准的个性化推荐?Amazon Personalize 有独门技术秘籍!

亚马逊云科技 (Amazon Web Services)

警惕数据泄露!快给你的数据加上安全密钥!

亚马逊云科技 (Amazon Web Services)

低开销获取时间戳

捉虫大师

Java

Go Channel

escray

学习 极客时间 Go 语言 4月日更

架构师实战营 模块一总结

代廉洁

架构实战营

话题讨论|To B & To G,互联网公司的下一主战场

程序员架构进阶

话题讨论 28天写作 4月日更 To B业务 领域思考

牛P牛P!Github上堪称2021最全、最新Java面试题库到底有多香?

比伯

Java 程序员 架构 编程语言 技术宅

专访前美篇首席架构师张超|从工程师到CTO的蜕变

Aldeo

程序员 采访 调查采访能力考核

Redis - 跳表以及其内部结构

insight

redis 4月日更

轻松搞定XML和对象之间的互转,就它了!

麦洛

xml XStream

Open Source Load Testing Tool Review 2020

OutOfMemory1024

Load Testing Open Source

JVM 读书笔记(一) 内存划分

U2647

JVM 4月日更

TO B产品从0到1:从项目中走出来

菜根老谭

产品孵化

Zip和7-zip谁更强,如何选择?

麦洛

ZIP格式 ZIP zip4j

基于mysqldump聊一聊MySQL的备份和恢复

麦洛

MySQL MySQL 运维 数据备份

  • 扫码添加小助手
    领取最新资料包
为什么 UDP 头只有 8 个字节 (二)_文化 & 方法_Draveness_InfoQ精选文章