TCP协议(1) -- 认识TCP协议段格式

文章详细介绍了TCP协议段的格式,包括16位的源端口号和目的端口号,32位的序号和确认序号,4位首部长度,6位标志位,16位窗口大小和校验和等关键字段。端口号用于标识服务器和客户端,服务器端口通常是固定的,而客户端端口可以随机但不能已被占用。TCP协议的特性包括有连接、可靠传输、面向字节流和全双工。文章还提及了校验和的重要性以及选项的可选性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


TCP 协议是一个非常重要的协议, 是一个相对于UDP 协议更相对复杂的协议

TCP协议有以下几点特性

  • 1. 有连接
  • 2. 可靠传输
  • 3.面向字节流
  • 4. 全双工

TCP 协议段格式

在第一节, 咱们先来简单认识下 TCP 协议段的格式

1. 16 位源端口号和目的端口号

其中, 源端口可以理解为客户端端口, 目的端口可以理解为服务器端口


什么是端口号

这里举一个例子来了解一下端口号:

先来了解一下服务器端口 (目的端口)
假如, 有一天, 我不想当程序猿了, 我想改行, 做一名厨师… 为了实现我这个梦想, 我就去了某个大学的食堂, 在这个食堂的第 2 餐厅, 第 12 号窗口, 开了一家北京烤鸭店 (此处, 第 2 餐厅, 就相当于我的服务器的 IP 地址, 第 12 号窗口, 就相当于我在这个 IP 地址里的一个端口号).
有一天, 一位顾客来到了我的店里, 尝了我的北京烤鸭, 觉得很好吃, 于是, 他回到宿舍, 告诉了他的舍友 : “诶你知道吗, 第 2 餐厅的 12 窗口新开了一家北京烤鸭, 很好吃, 有机会你们可以去试试!”. (这里就可以得出, 客户端可以根据服务器的 IP 地址和端口号, 就能找到我的这个服务器).

于是, 就有了一个问题: 服务器必须得是固定端口吗??
答案是: 是的, 服务器必须固定一个端口号.
还是上面的例子, 如果我不固定一个端口号, 我的端口号是随机产生的, 那当那位顾客的朋友来找我开的这家北京烤鸭店的时候, 来到了第 2 餐厅, 第 12 号窗口, 发现里面卖的不是北京烤鸭, 而是胡辣汤!! (所以, 服务器的端口号必须是固定端口, 这样才能让客户端根据这个端口找到这个服务器, 不然我每次重启服务器, 端口号就变得随机了, 客户端发的请求就找不到服务器, 导致服务器接收不到请求了)

这里再来了解一下客户端端口 (源端口)
还是上面的故事背景, 有一天, 一位老哥来到了我的北京烤鸭店, 点了一份烤鸭. 这时, 我就需要给他发一张小票, 这样当我做完这只鸭的时候, 我就可以根据小票上面的餐号, 来叫号, 这样就能找到他…(这里的小票上的餐号就相当于客户端的端口号)

上面说到, 服务器端口必须是固定端口号, 那客户端端口, 是不是可以是随机端口呢??
答案是 可以, 但是也不完全可以
比如, 点餐的时候, 这位老哥说, 我喜欢 8 这个数字, 可以给我 8 号餐号? 在有的时候, 是可以的, 但是, 在这个时刻, 8 号餐号可能在另一位大姐手上, 那假如我给他 8 号, 当我做完 8 号的餐的时候, 该给这位大哥还是那位大姐呢??? (得出结论: 客户端如果显示指定了一个端口, 那么这个端口必须要是没被别的程序使用的端口, 如果使用的端口已经被别的程序所使用, 那么这个程序会抛出异常: 无法绑定这个端口!!)


16 位端口号

16 位, 也就是 2 个字节, 在无符号整数中, 可以表示 0 ~ 65535, 所有的端口号被限制在了这个范围内
咱们自己写程序, 给程序绑定一个端口号, 得是1024及以后的端口号.

这里涉及到了一个概念:
0 ~ 1023 这个范围的端口号, 称为 “知名端口号 / 具名端口号”, 这些端口号已经分配给了其他知名并且广泛的应用程序, 所以我们在给程序绑定端口号的时候尽量不要使用 0 ~ 1023 这些端口号.


2. 32 位序号

会在 TCP 协议(2) 中着重去讲.


3. 32 位确认序号

会在 TCP 协议(2) 中着重去讲.


4. 4 位首部长度

首部长度里描述了这个 TCP 报文报头的长度

在一个 TCP 报文中, 整个报文所占的空间为 [TCP 报头 / 首部(header) + TCP 载荷(payload)], 其中 4 位首部长度就记录了这个 TCP 报文 报头 / 首部 的长度
**注意: **
1. 跟 UDP 不同, TCP 的一个报头的长度是可变的, UDP 报头是固定 8 个字节, 而 TCP 的报头的长度会根据选项来改变 (TCP 报头长度最少是 20 字节(此时相当于没有选项), 最多是 60 字节(此时选项的长度就为 40 字节)).
2. 首部长度的单位不是字节, 而是 4 字节… 如果这个报文没有选项, 那么报头长度就是 20 字节, 四位首部长度就为 5(0011), 最大为 60 字节, 四位首部长度就为 15(1111).


5. 6 位保留位

什么是保留位呢, 就跟 C 语言的保留字是差不多的作用

在 C 语言中, 有一个词叫做关键字, 还有一个词叫做保留字, 保留字就是现在没被用上的关键字, 现在不用, 保不齐以后要用的关键字, 这些保留字不给用户使用, 当以后需要扩展一些新功能的时候, 这些保留字就用上了.

而此处, TCP 的六位保留位, 就是为了将来可能出现的扩展做准备… 为什么要设定这个保留位呢? 因为在网络协议中, 扩展/ 升级是一件成本极高的一件事情, 就拿 UDP 来说, UDP 的报文长度是两个字节 -> 一个包的长度最大只有 64 kb, 在当年的情况下, 64 kb 或许很大, 但是对于网络科技发达的现在来说, 64 kb 就显得有点鸡肋了… 那能不能把 UDP 协议升级一下, 让它支持更大的长度, 一个包所带的数据就能更大呢? 答案是: 理论上可行, 但是实际上基本不可能. 因为升级协议所花费的成本是巨大的, 在世界上, 每一个装有 UDP 协议的设备都是支持 2 字节长度的 UDP 协议, 如果要升级协议, 就需要让全世界所有装有旧的 UDP 协议的设备统统升级, 如果有任何的设备没升级, 那么使用旧的 UDP 协议的设备就不能跟使用新 UDP 的设备使用 UDP 协议进行通信了, 所以, 想要升级, 就需要让全世界的电脑都升级… 理论上可行, 实际上, 这样的情况是基本不存在的…

而为了支持将来可能出现的升级的情况, TCP 协议引入了保留位 这个概念, 引入了保留位, 如果后续 TCP 引入了新的功能, 就可以使用这些保留位的字段, 升级的成本就会低了不少… 此时, 引入新功能也对 TCP 报头的整体结构没有太大的变化, 使所有的设备都能兼容.


6. 六位标志位

URG: 紧急指针是否有效
ACK: 确认号是否有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接;我们把携带RST标识的称为复位报文段
SYN: 请求建立连接;我们把携带SYN标识的称为同步报文段
FIN: 通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

部分会在会在 TCP 协议(2) 中的 TCP 内部工作机制涉及到.


7. 16位窗口大小

会在会在 TCP 协议(2) 中的 TCP 内部工作机制的滑动窗口讲到


8. 16 位校验和

数据在网络传输的过程中, 可能会出现一些干扰, 在这些干扰的情况下, 可能会出现 “比特翻转”(数据中 1 -> 0, 0 -> 1) 的现象, 导致数据传输不准确…
网络传输的本质, 其实就是 光信号 / 电信号 的传输, 用 0 / 1 来表示高低高低电平, 这些信号在传输过程中, 可能会受到环境因素的影响(电场 / 磁场 / 高能射线…), 导致数据的某些比特位出现比特翻转, 使数据与源数据变得不同了, 这些影响往往都是致命的… 这些现象是不可避免的.

于是, 就引入了校验和这样的机制. 发送方首先将要发送的数据进行一系列的数学运算, 得到的结果就为校验和, 而后将数据连同校验和打包进数据包中进行发送. 接收方收到数据的时候先将收到的数据按照原来的方法再次进行数学运算, 得到接收方的校验和, 将这个校验和和发送方一起发来的校验和进行对比, 如果两个校验和完全一致的话, 就代表数据在网络传输的过程中没有被环境因素影响到, 代表数据是正确的… 如果校验和不一致, 代表数据是错误的.

下列列举一些比较知名的计算校验和的算法

  1. CRC(循环冗余校验)
    特点:
    1. 简单粗暴, 把数据的每个字节, 循环累加. 如果数据溢出, 高位就不要了, 只保留低位.
    2. 好算, 复杂度小, 但是效果不理想, 要是两位数据分别是 0 和 1, 同时发生了比特翻转, 那么校验和还是不变
  2. MD5
    MD5 并不是简单的相加, 而是经过一系列极其复杂的数学公式运算得出的
    特点:
  3. 定长: 无论数据有多大, 多长, 得到的 MD5 都是固定的长度 (有 4 字节和 8 字节版本)
  4. 冲突概率小: 数据中, 哪怕只变动一个地方, 得到的 MD5 值都是千差万别的, 这样让 MD5 的结果更加分散了
  5. 不可逆: 根据原有的数据计算 MD5 值很容易, 但是如果根据 MD5 的值想要得出原本的数据很难, 理论上是不可能实现的(计算量极大).
  6. SHA1
    与 MD5 的特点基本一致.

9. 16位紧急指针


标识哪部分数据是紧急数据


10. 选项


选项(option) 是对TCP 报文中的一些属性进行解释说明的. 选项是可有可无的.

选项的大小为 [首部长度 - 20 字节]


第一节就先介绍 TCP 协议段格式, 下一篇会介绍 TCP 内部的工作机制, 将会涉及到上面一些未详细讲的部分(32 位序号, 32 位确认序号, 16 位窗口大小).

是对TCP 报文中的一些属性进行解释说明的. 选项是可有可无的.

选项的大小为 [首部长度 - 20 字节]


第一节就先介绍 TCP 协议段格式, 下一篇会介绍 TCP 内部的工作机制, 将会涉及到上面一些未详细讲的部分(32 位序号, 32 位确认序号, 16 位窗口大小).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值