TCP 端口号为何位于首部前四个字节?协议设计的智慧与启示

知乎的一个问题很有意思:“为什么在TCP首部中要把TCP的端口号放入最开始的四个字节?”

这种问题很适合我这种搞历史的人,大年初一我给出了一个简短的解释,但仔细探究这个问题,我们将会获得 TCP/IP 被定义的过程。

文顿瑟夫(Vinton Cerf)和罗伯特卡恩(Robert Kahn)的《A Protocol for Packet Network Intercommunication》看似是一个开端,但在当时(1970 年代初)它只是在罗列 NCP 的问题并给出的一个解决方案,事后看这个解决方案就是 TCP/IP。这是典型的从一个方案中诞生的一个新东西。
有此论文作为理论基础,定义和实现在 RFC675 中被展示。问题 “为什么在TCP首部中要把TCP的端口号放入最开始的四个字节?” 也能在其中找到答案。

看一下 RFC675 第 4.2.1 节就够了,最初(1974 年)的 TCP 和 IP 是合在一起的,就叫 TCP,最初的 TCP port 字段放在最后面(仅在校验码之前,24 bit)而不是最前面。但 675 定义的 TCP 合理吗?

50 年过去了,从现在的视角看 50 年前 TCP 的设计可以获得很多启发,Judith Estrin 分享了从文顿瑟夫和罗伯特卡恩那里学到的原则,其中一个是为不确定性做计划,协议不能假设来自下层或上层的任何东西,另一个相关的原则是互连多样性以获得集体力量,而不是同质化扩展。

这意味着 “数据流”,“可靠”,“保序” 的假设应该被去除,同时,应该为 “互连多样性” 抽取一个最小公共集,这样一来 675 就变形了:
在这里插入图片描述

当 UDP 不得不被抽象出来之后,独立出来的 IP 必须单独分离,分离的过程其实是一个非常常规的过程,TCP675 把将要属于最小公共集 IP 的字段一个个往前挪到独立的 IP 头是最自然的做法。这个过程一直持续到最后端口字段,由于 UDP 也需要它来解复用,这两个字段本不属于 IP,自然不能往前挪,但由于当时只有 TCP 和 UDP 两个协议,且 TCP 和 UDP 都需要端口,就判断它虽不属于最小公共集,但属于独立解复用的 “子层”,这样它们就紧挨着 IP 的最后,处在 IP 和 TCP/UDP 之间,所以还是挪了,这就造成了如今 TCP,UDP 协议头的格局,端口处在最前面的 4 个字节。

这样的协议头带来一个非常好的正向副作用,当路由器交换机这些转发节点需要进行包分类时,可以快速定位端口号,从而高效识别五元组,这在侧面催生并加强了防火墙,NAT 等 mid-box 向高性能方向发展。

另一方面, ICMP,隧道封装协议,路由控制协议,这类控制协议并非端应用或服务,并不需要端口来解复用,它们多属于 TCP/IP 协议族的控制平面,也就自然而然与 TCP,UDP 并列了,通过 IP 协议的 protocol 字段来识别解复用。

但总有人玩花活儿,看不上 TCP,又不基于 UDP 之上构建,却在 134~254 间新开辟一个独立的协议号,以示创新。设计这个新协议的初衷是嫌 16-bit 端口号不够用,想使用 24-bit 端口号。但这真的需要开辟一个新协议号吗?

TCP/IP 的灵活性和可扩展性简直炸天,但凡想对 TCP/IP 大动筋骨的思路很大概率都是错的,甚至不需要微创,它本身的扩展性就足以满足几乎任何需求。事实上是玩花活儿的人误解了做事的目标,目标不是解决端口不够用的问题,而是解决复用度的问题,要么参考我此前的端口不均衡的思路,要么就让 UDP 仅作为一个负载均衡层,在 UDP 之上构建 24-bit 端口号的新协议。

很多改造 TCP 的想法都可在 UDP 上实现,首先我在 UDP 上照抄一份 TCP 代码,UDP 仍只做负载均衡层,然后修改这些 TCP 代码,比如把端口号改成 24-bit,支持 NACK,修改 RTO 机制,修改 SACK 机制,使用保留 bit 等等。

回到文初的问题,现在可以一句话回答了,“为什么在TCP首部中要把TCP的端口号放入最开始的四个字节?”,因为 “TCP/IP 最初的诞生过程中偶然在 TCP|UDP 和 IP 之间引入了一个 ‘解复用子层’,这个子层就是目标端口和源端口”。

如果说 TCP/IP 的缺陷,和其它任何现代工业设施一样,确实是 “低估了数字”,8-bit 网络号被 32-bit IP 地址替换,但还是不够,16-bit 端口号虽可基于 UDP 加层扩展,但很麻烦,这就像停车位永远不够,固定电话频繁升位一样,一开始人们总觉得足够大,但很快就不够用。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看引脚电平

在Linux系统中,通过cat命令查看/sys/class/gpio/export文件并不能直接获取GPIO引脚的高低电平。/sys/class/gpio/export文件用于向系统请求导出(即启用)某个特定的GPIO引脚,而不是用于读取引脚的状态。 1.导出GPIO引脚&#xff1…

luoguP8764 [蓝桥杯 2021 国 BC] 二进制问题

luogu题目传送门 题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗? 输入格式 输入一行包含两个整数 N 和 K。 输出格式 输出一个整数表示答案。 输入输出样例 输入 #1 7 2 输出 #1 3 说明/提示 对于…

qt的QSizePolicy的使用

使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中,QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为,可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…

GLM库需要VS2013及以上

GLM库简介 GLM(OpenGL Mathematics)是一个C++数学库,它基于OpenGL Shading Language(GLSL)规范。 功能: 矩阵变换和四元数:GLM支持各种矩阵变换操作,包括平移、旋转和缩放。此外,它还提供了四元数支持,这对于处理3D旋转非常有用。 数据打包和随机数生成:除了基本…

八.springboot集成mybatis+druid数据库连接池

文章目录 前言一、添加必要依赖二、添加application-dev.yml配置三、添加mybatisdruid配置三、添加mybatis-config.xml四、测试使用1.在TestController中添加一个testMybatis2.在TestService中添加对应接口3.实现TestService4.最终项目结构5.测试接口 五、Druid监控功能总结 前…

FreeRTOS 知识点总结(一):基础概念与核心特性

FreeRTOS 是一款广泛应用于嵌入式领域的实时操作系统(RTOS),以其轻量级、开源性、高可裁剪性等特点,成为许多嵌入式开发项目的首选。本文将从基础概念、核心特性、任务管理等方面对 FreeRTOS 进行总结,帮助初学者快速入…

一文了解zookeeper

1.ZooKeeper是什么 简单来说,她是一个分布式的,开放源码的分布式应用程序协调服务 具体来说,他可以做如下事情: 分布式配置管理:ZooKeeper可以存储配置信息,应用程序可以动态读取配置信息。分布式同步&a…

游戏引擎学习第100天

仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天,我们开始了反射和环境贴图的工作,成功地根据法线显示了反射效果。然而,我们还没有实现反射向量的计算,导致反射交点的代…

MYSQL的管理备份

一、系统数据库 mysql数据库安装完成后,自带了四个数据库,具体作用如下: mysql:存储MySQL服务器正常运行所需的各种信息(时区、主从、用户、权限等); information_schema:提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等; performanc…

【时时三省】(C语言基础)简单的算法举例

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 判定2000—2500年中的每一年是否为闰年,并将结果输出。 本先分析闰年的条件: (1)能被4整除,但不能被100整除的年份都是闰年&…

基于单片机的智能奶茶机(论文+源码+图纸)

1总体架构设计 本课题为基于单片机的智能奶茶机设计,其系统架构上设计如图2.1所示,整个系统包括了DS18B20温度传感器、继电器模块、LCD液晶、蜂鸣器、按键、STC89C52单片机等器件,在功能上用户可以通过按键键控制选择甜度和添加物以及设置温度…

在线网校教育软件开发助力互联网时代教育发展

互联网时代,在线教育已成为推动教育事业发展的重要力量。开发优质的在线网校教育软件,能够有效整合资源、提升效率、促进公平,为教育发展注入新活力。以下是关键点: 一、 在线网校教育软件的优势 打破时空限制: 学生…

Air724 DTU数据上报json到v1/gateway/telemetry

Air724 DTU数据上报json到v1/gateway/telemetry 任务模板: functionsys.wait(10000)local taskname"userTask"log.info(taskname,"start")local nid 1local netmsg "UART_DATA_TO_NET"..nidwhile true dolocal t{}t.params {} -- …

基于微信小程序的场地预约设计与实现

第3章 系统设计 3.1系统设计目标 本系统的实现可以帮助体育馆场地信息的管理。帮助管理员对注册用户管理以及用户预约管理。同时可以帮助用户进行场地预约。本系统可以实现用户足不出户预约到需要的场地,为用户提供场地信息了解的平台。 3.2系统功能结构图 本系统的…

Kettle开发Jsoup组件进行网页爬取

1. 概述 在当今数据驱动的商业环境中,企业需要从各种来源收集和分析数据以支持决策。网页爬取作为一种数据收集手段,能够从网页中提取有价值的信息。Kettle作为一种强大的ETL工具,结合Jsoup库,可以实现高效、灵活的网页爬取功能。…

C++ Primer 跳转语句

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

tomcat html乱码

web tomcat html中文乱码 将html文件改成jsp <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%>添加 <meta charset"UTF-8">

[c语言日寄]在不完全递增序中查找特定要素

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

【第1章:深度学习概览——1.2 深度学习与机器学习、传统人工智能的区别与联系】

在科技飞速发展的时代,AI 技术如同一颗璀璨的明星,照亮了我们生活的方方面面。今天,让我们一起深入探寻 AI 技术的演进历程,看看它是如何从最初的简单规则系统,一步步发展成为如今强大的智能技术。 一、开篇故事:三杯咖啡看懂三代 AI 想象一下,你经营着一家充满温馨氛…

小结:OSPF的网络类型,LSA

OSPF&#xff08;Open Shortest Path First&#xff09;是一个基于链路状态的内部网关协议&#xff08;IGP&#xff09;。以下是对OSPF网络类型、LSA类型、序列号与Age作用&#xff0c;以及相关配置指令的详细讲解。 一、OSPF的网络类型 OSPF支持多种网络类型&#xff0c;不同…