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 加层扩展,但很麻烦,这就像停车位永远不够,固定电话频繁升位一样,一开始人们总觉得足够大,但很快就不够用。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用:1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织(合并/删除) oracle表分区…

蓝桥杯(B组)-每日一题(求最大公约数最小公倍数)

题目&#xff1a; 代码展现&#xff1a; #include<iostream> using namespace std; int main() {int m,n,x,y;cin>>m>>n;//输入两个整数int b;bm%n;//取余数xm;//赋值yn;while(b)//当余数不为0的时候{xy;//辗转相除求最小公约数yb;bx%y;}cout<<y<&…

基于STM32的学习环境控制系统设计

&#x1f91e;&#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是学习环境控制。 设备的详细功能见网盘中的文章《21、基于STM32的学习环境控制系统设计》&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1uWSZX2zbZwy9sY…

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题&#xff0c;今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中&#xff0c;单服同时在线一般都会有几千人。当有个玩家执行一个操作&#xff0c;理想情况下要把玩家的操作广播同步给单…

w~大模型~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/13284996 #VideoMamba 视频理解因大量时空冗余和复杂时空依赖&#xff0c;同时克服两个问题难度巨大&#xff0c;CNN 和 Transformer 及 Uniformer 都难以胜任&#xff0c;Mamba 是个好思路&#xff0c;让我们看看本文是…

【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景

文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先&#xff0c;新建一个空的文件夹&#xff0c;然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…

Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)

一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架&#xff0c;可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序&#xff0c;比如 控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代…

PostgreSQL 开发利器:Navicat 核心功能与资源攻略

近几年&#xff0c;&#x1f418; PostgreSQL 在全球数据库排名中表现优异。在 2025 年 2 月 DB-Engines 排名中 (如图)&#xff0c;PostgreSQL 稳居第四名&#xff0c;并逐渐逼近第三名的 Microsoft SQL Server&#xff0c;其评分和受欢迎度持续增长&#xff0c;成为开源数据库…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集&#xff08;涵盖8种语言类别和32个领域&#xff09;进行完整下载地址整理收集。 2024-02-28&#xff0c;由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写&#xff0c;深入探讨了大型语…

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库

文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…

修改docker内容器中的某配置文件的命令

先找到配置文件config.php find / -name "config.php" 2>/dev/null 然后用vi编辑器修改配置文件 vi /var/www/config.php 最后就是vi的基本操作&#xff0c;根据具体需求使用&#xff1a; vi 有两种主要模式&#xff1a; 命令模式&#xff1a;进入 vi 后的默认…

23.[前端开发]Day23-移动端适配方案-考拉海购移动端项目

01-05 移动端适配rem方案 适配方案 – rem动态html的font-size rem的font-size尺寸 方式一&#xff1a;动态font-size-媒体查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

数据中心网络监控

数据中心是全球协作的特定设备网络&#xff0c;用来在internet网络基础设施上传递、加速、展示、计算、存储数据信息。 对于任何利用IT基础设施的企业来说&#xff0c;数据中心都是运营的核心&#xff0c;它本质上为整个业务网络托管业务应用程序和存储空间。数据中心可以是任…

网络初识-

网络的相关概念 一、局域网和广域网 将各种计算机、外部设备等相互连接起来&#xff0c;实现在这个范围内数据通信和资源共享的计算机网络。它的覆盖范围通常在几百米到几公里之内。例如&#xff0c;一个小型企业的办公室&#xff0c;通过交换机将多台电脑连接在一起&#xf…

如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件

DHTMLX Scheduler 是一个全面的调度解决方案&#xff0c;涵盖了与规划事件相关的广泛需求。假设您在我们的 Scheduler 文档中找不到任何功能&#xff0c;并且希望在我们的 Scheduler 文档中看到您的项目。在这种情况下&#xff0c;很可能可以使用自定义解决方案来实现此类功能。…

haproxy+nginx负载均衡实验

准备三台虚拟机&#xff1a; HAProxy 服务器192.168.65.131Web 服务器 1192.168.65.132Web 服务器 2192.168.65.133 在 HAProxy 服务器&#xff08;192.168.65.131&#xff09;上操作&#xff1a; 安装 HAProxy&#xff1a; sudo yum install -y haproxy编辑 HAProxy 配置…

数据结构与算法之排序算法-插入排序

排序算法是数据结构与算法中最基本的算法之一&#xff0c;其作用就是将一些可以比较大小的数据进行有规律的排序&#xff0c;而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章&#xff0c;将排序算法中各种算法细化的&#xff0c;详尽的为大家呈现出来&#xff1a; &…

cv2小练习

基础概念 帧率是指在单位时间内&#xff0c;显示的图像帧数的数量。它是衡量视频或动画流畅度的一个重要指标。帧率的单位通常是每秒帧数&#xff08;Frames Per Second&#xff0c;简称FPS&#xff09;。在数字视频和计算机图形领域&#xff0c;帧率是决定视频播放质量和流畅度…