计算机网络:运输层 —— TCP 协议概述与 TCP 报文段首部格式
文章目录
- 基本概念
- 主要特点和功能
- TCP报文段的首部格式
- 字段
- 标志位
- 扩展首部
传输控制协议(Transmission Control Protocol,TCP)协议是互联网上最常用的传输层协议之一,它负责提供可靠的端到端数据传输服务。TCP 协议采用连接导向的通信方式,通过三次握手建立连接,使用序号和确认机制确保数据的可靠传输。
基本概念
使用 TCP 通信的双方,在传送数据之前必须首先建立TCP连接(逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接。
TCP 为了实现可靠传输,就必须使用很多措施,例如TCP连接管理、确认机制、超时重传、流量控制以及拥塞控制等。TCP的实现复杂,TCP报文段的首部比较大,占用处理机资源比较多。
TCP 协议在许多应用中被广泛使用,特别适用于需要可靠传输的应用如网页浏览、文件传输、电子邮件等。它通过提供可靠的数据传输和连接管理,确保数据的顺序和完整性,为应用层提供了方便、可靠的传输服务。
主要特点和功能
TCP 协议的主要特点和功能包括:
-
可靠传输:TCP 使用序号和确认机制来确保数据的可靠传输。发送方将数据分割成多个数据段,并为每个数据段分配一个序列号。接收方根据序列号确认已接收的数据,并发送确认消息给发送方。如果发送方没有收到确认消息或者数据段丢失,它将重传未确认的数据。
-
流量控制:TCP 使用滑动窗口流量控制机制来控制数据的传输速率。发送方根据接收方的处理能力和网络状况动态调整发送数据的速度,避免数据的丢失和网络拥塞。
-
拥塞控制:TCP 使用拥塞窗口控制机制来避免网络拥塞。当网络出现拥塞时,TCP 通过减小发送方的拥塞窗口大小来减少发送的数据量,从而降低网络负载。
-
连接管理:TCP 通过三次握手建立连接和四次挥手断开连接。三次握手通信过程中,客户端向服务器发送连接请求,服务器确认并回复连接响应,客户端再次确认连接。四次挥手过程中,客户端发送连接断开请求,服务器确认并发送连接断开响应,客户端再次确认连接断开。
-
面向字节流:TCP 以字节流的方式传输数据,没有消息边界,应用层无需关心数据的分割和重组,可以连续地读取和写入字节流。
TCP报文段的首部格式
![![[TCP报文段.png]]](https://i-blog.csdnimg.cn/direct/8d4e53e54d1e4748825eb5f7c4a8fd9f.png)
发送方的TCP把应用进程交付下来的应用报文仅仅看作一连串的,无结构的字节流,TCP并不知道这些待传输的字节流的含义,仅将它们编号并存储在自己的发送缓存中。TCP根据发送策略,从发送缓存中提取一定数量的字节,并给其添加一个首部,使之成为TCP报文段并进行发送。
接收方的TCP,一方面从所接收到的TCP报文段中,取出数据载荷并存储在接收缓存中,另一方面,将接收缓存中的一些字节向上交付给应用进程。
TCP的全部功能需要依靠其首部中的各字段来实现。
![![[TCP报文段的首部格式.png]]](https://i-blog.csdnimg.cn/direct/623c740074164aec9d52f67b82dfe204.png)
字段
-
源端口字段:存储源端口号
-
目的端口字段:存储目的端口号
TCP实现可靠传输的相关字段为以下三个字段:
-
序号字段:占32比特,取值范围0~ 2 32 − 1 2^{32}-1 232−1。当序号增加到最后一个时,下一个序号又回到0。用来指出本TCP报文段数据载荷的第一个字节的序号。
-
确认号字段:占32比特,取值范围0~ 2 32 − 1 2^{32}-1 232−1。当确认号增加到最后一个时,下一个确认号又回到0。用来指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
对已接收且按序到达的最后一个TCP段进行确认
确认号为 n 则表明到序号 n-1 为止的所有数据都已正确接收,期望接收序号为 n 的数据
-
确认标志位ACK:只有当ACK取值为1时,确认号字段才有效。ACK取值为0时,确认号字段无效。TCP规定:在TCP连接建立后,所有传送的TCP报文段都必须把ACK置1。

- 数据偏移字段:占4比特,该字段的取值以4字节为单位。指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,这实际上指出了TCP报文段的首部长度。

-
保留字段:占6比特,保留为今后使用,目前应置为0
-
窗口字段:占16比特,该字段的取值以字节为单位,指出发送本报文段的一方的接收窗口的大小,即接收缓存的可用空间大小,这用来表征接收方的接收能力。
在计算机网络中,经常用接收方的接收能力的大小来控制发送方的数据发送量,这就是所谓的流量控制。
-
检验和字段:占16比特,用来检查整个TCP报文段在传输过程中是否出现了误码。

与UDP类似,在计算检验和时,要在TCP报文段的前面,加上12字节的伪首部,伪首部的格式与UDP用户数据报的伪首部一样。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。

TCP首部检验和计算方法与IPv4数据报首部检验和的计算方法类似,差别仅在于IPv4数据报只对首部进行检验,而TCP检验和对整个TCP报文段进行检验。

-
紧急指针字段:占16比特,以字节为单位,用来指明紧急数据的长度。
当发送方有紧急数据时,可将紧急数据“插队”到发送缓存的最前面,并立刻封装到个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
接收方收到紧急标志位为1的TCP报文段,会按照紧急指针字段的值,从报文段数据载中取出紧急数据并直接上交应用进程,而不必在接收缓存中排队。
标志位
-
同步标志位SYN:用于TCP“三报文握手”建立连接
当 SYN=1 且 ACK=0 时,表明这是一个TCP连接请求报文段。对方若同意建立连接,则应在响应的TCP报文段的首部中使 SYN=1 且 ACK=1。
SYN为1的TCP报文段要么是一个连接请求报文段,要么是一个连接响应报文段。 -
终止标志位FIN:用于TCP“四报文挥手”释放连接。
当 FIN=1 时,表明此TCP报文段的发送方已经将全部数据发送完毕,现在要求释放TCP连接 -
复位标志位RST:用于复位TCP连接。当RST=1时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立连接。
RST置1还用来拒绝一个非法的 TCP 报文段或拒绝打开一个TCP连接。 -
推送标志位PSH:发送方 TCP 把
PSH置1,并立即创建一个TCP报文段发送出去,而不需要积累到足够多的数据再发送。接收方 TCP 收到
PSH为 1 的 TCP 报文段,就尽快地交付给应用进程而不再等到接收到足够多的数据才向上交付,出于效率的考虑,TCP 的发送方可能会延迟发送数据,而 TCP 的接收方可能会延迟向应用进程交付数据。这样可以一次处理更多的数据。
但是当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,应用进程可以通知TCP使用推送(PUSH)操作。
-
紧急标志位URG:当
URG=1时,紧急指针字段有效。当URG=0时,紧急指针字段无效。
扩展首部
-
选项字段:长度可变,最大40字节,增加选项可以增加TCP的功能
-
最大报文段长度
MSS选项:指出TCP报文段数据载荷部分的最大长度,而不是整个TCP报文段的长度 -
窗口扩大选项:用来扩大窗口,提高吞吐率。
-
时间戳选项:用于计算往返时间
RTT。也用于处理序号超范围的情况,又称为防止序号绕回PAWS。 -
选择确认选项:用来实现选择确认功能。
-
-
填充字段:若选项字段的长度加上20字节固定首部的长度,不能被4字节整除时,需要填充相应数量的比特0(因为首部长度字段以4字节为单位),以确保首部长度能被4字节整除,与IPv4数据报首部中的填充字段作用一样。
相关文章:
计算机网络:运输层 —— TCP 协议概述与 TCP 报文段首部格式
文章目录 基本概念主要特点和功能TCP报文段的首部格式字段标志位扩展首部 传输控制协议(Transmission Control Protocol,TCP)协议是互联网上最常用的传输层协议之一,它负责提供可靠的端到端数据传输服务。TCP 协议采用连接导向的通…...
python正则表达式和递归
一、正则表达式 1.基础匹配 学习目标:了解什么是正则表达式,掌握re模块的基础使用 就是一种规则的定义,通过规则去验证给定的目标是否符合定义的规则。 正则的三个基础方法 match match是匹配开头,开头有python就算匹配成功&a…...
JAVA后端生成图片滑块验证码 springboot+js完整案例
前言 现在大部分网部都是图片滑块验证码,这个得要与后端联动起来才是确保接口安全性 通过我们系统在发送手机短息时都会选进行滑块验证,但是我们要保证发送短息接口的全安,具体路思如下 那么这个滑块的必须是与后端交互才能保证安全性&…...
Spring Boot中的自动装配机制
文章目录 1. 什么是自动装配?2. 自动装配是如何工作的?3. 如何开启自动装配?4. 自动装配的注意事项5. 结语推荐阅读文章 在Spring Boot的世界里,自动装配(Auto-configuration)就像春风拂面,轻轻…...
Brave127编译指南 Windows篇:配置Git(四)
1. 概述 在Brave浏览器的开发过程中,Git作为核心版本控制工具扮演着不可或缺的角色。作为当今最广泛使用的分布式版本控制系统,Git为开发者提供了强大的源码管理能力。通过Git,您可以轻松追踪代码变更、管理不同版本,并与其他开发…...
mysql数据库(五)多表查询
多表查询 文章目录 多表查询一、链表查询1.1交叉连接1.2 内连接1.3 左连接1.4 右连接1.5 全连接1.6 例子 二、子查询2.1 in与not in2.2 any/some2.3 all2.4 比较运算符2.5 exists 三、例子 查询中使用的表如下所示 ------------ | id | name | ------------ | 1 | IT | …...
【go从零单排】JSON序列化和反序列化
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,处理 JSON 数据主要依赖于 encoding/json 包。这个包提…...
海外携程机票token 1001分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…...
【算法】——二分查找合集
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 零:二分查找工具 1:最基础模版 2:mid落点问题 一:最…...
社会工程骗局席卷金融机构
2024 年北美金融机构收到的社交工程诈骗报告数量比一年前增加了 10 倍。数据显示,诈骗现在占所有数字银行欺诈的 23%。 深度伪造和 GenAI 诈骗的危险日益增加 BioCatch 在其 2024 年北美数字银行欺诈趋势报告中公布了这些发现,该报告还详细说明了报告的…...
前缀和算法习题篇(上)
1.一维前缀和 题目描述: 解法一:暴力解法:模拟 时间复杂度是O(n*q),会超时。 解法二:前缀和解法:快速求出数组中某一个连续区间的和 快速是指O(1),前缀和思想可把时间复杂度可降到O(q)。 算法思路: 先预处…...
C#核心(9)静态类和静态构造函数
前言 我们先前已经了解了静态成员的基本构成,也简单了解了一下静态变量,现在我们就要来看一下静态类和静态构造函数了,这些其实在上一节我已经在例子里有提到过,相信聪明的你甚至已经发现了一些规律。 GPT对c#中静态类和静态构造…...
B2002 Hello,World! C++实现
Hello,World! 题目描述 编写一个能够输出 Hello,World! 的程序。 提示: 使用英文标点符号;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 输出格式 样例 #1 样例输入 #1 无样例输出 #1 Hello,World!#include <bits/stdc.h&…...
前端-同源与跨域
一、同源策略 两个网站协议名、域名、端口号有一个不同就是非同源,就是跨域。跨域问题就是浏览器的同源策略造成的。 同源是指协议名、域名、端口号 必须完全一致! http 默认端口号是80,https 默认端口号是443 同源策略的限制 一般来说&…...
MySQL远程连接错误解决:Host is not allowed to connect to this MySQL server
1. 异常错误 通过远程客户端访问MySQL服务器时会遇到“Host is not allowed to connect to this MySQL server”的错误提示。 2. 原因 MySQL服务器当前配置不允许来自特定主机的连接尝试。 3. 解决方法 允许远程主机访问MySQL服务器,按照以下步骤操作ÿ…...
详解C语言字符和字符串的输入与输出
字符和字符串的输入与输出 一、字符的输入与输出1.1 字符的输入使用 getchar()使用 scanf() 1.2 字符的输出使用 putchar()使用 printf() 二、字符串的输入与输出2.1 字符串的输入使用 scanf() 输入字符串使用 fgets() 输入字符串 2.2 字符串的输出使用 printf() 输出字符串使用…...
adworld - stack2
adworld - stack2 题目概述:给一个数组(自己控制数组大小和填入的数据),并进行(展示, 增加, 修改值, 求平均值, 退出)菜单选项 存在后门函数(system(“/bin/bash”)),但是没找到栈溢出的点 没判断数组的边界造成任意地址修改 但是如何准确…...
Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程
若事与愿违,请相信,上天自有安排,允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 进程 进程:就…...
nuget 管理全局包、缓存和临时文件夹
查看文件夹位置 dotnet nuget locals all --list清空数据 # Clear the 3.x cache (use either command) dotnet nuget locals http-cache --clear nuget locals http-cache -clear# Clear the 2.x cache (NuGet CLI 3.5 and earlier only) nuget locals packages-cache -clea…...
linux物理内存管理:node,zone,page
一、总览 对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图: 上面的概念做下简单的介绍: Node:…...
行波管TWT聚焦系统硬核拆解:PPM vs PCM 核心区别、原理对比与工程选型全指南
对于行波管(TWT)研发工程师、射频微波专业学生、雷达 / 通信系统硬件从业者而言,电子注聚焦系统是决定器件生死的核心模块—— 它直接决定了电子注的流通率、注波互作用效率,甚至是器件的长期可靠性。在永磁聚焦方案中,…...
从零搭建到百万QPS:Python MCP服务器模板实战对比(含Docker镜像体积、CI/CD兼容性、调试友好度全维度打分)
第一章:从零搭建到百万QPS:Python MCP服务器模板实战对比总览在构建高并发、低延迟的MCP(Model Control Protocol)服务时,Python凭借其生态丰富性与开发效率成为主流选型之一,但原生GIL限制与异步模型差异常…...
Ubuntu 22.04 改IP重启失效?别急,可能是OVS的ovsdb-server在捣鬼
Ubuntu 22.04网络配置失效:当OVS与netplan的隐秘博弈 在虚拟化技术大行其道的今天,Open vSwitch(OVS)作为开源虚拟交换机的标杆,已经成为众多云计算平台和容器网络的核心组件。然而,当它遇上Ubuntu 22.04默…...
go-zero v1.10.1 更新解析:JSON5 配置正式支持 Redis 通用命令 Do DoCtx 上线 Go 1.24 升级与 core/codec 关键安全修复全梳理
一、版本总览:go-zero v1.10.1,微服务框架的又一次关键迭代 2026年3月28日,国产高性能Go微服务框架go-zero正式发布v1.10.1版本。作为一次补丁式更新,该版本并非简单的问题修复,而是集新功能拓展、核心安全加固、底层依…...
从LaMa到BrushNet:盘点图像修复(Inpainting)领域的关键模型与实战数据集
1. 图像修复技术的前世今生 第一次接触图像修复技术是在2015年,当时我正参与一个老照片修复项目。那些泛黄的老照片上布满了裂痕和污渍,传统Photoshop修复需要耗费数小时。直到发现深度学习可以自动完成这项任务,我才意识到这项技术将彻底改变…...
抖音批量下载神器:免费一键收藏创作者全部作品
抖音批量下载神器:免费一键收藏创作者全部作品 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...
别再手动整理了!用Python脚本5分钟搞定ImageNet验证集标签映射(附完整代码)
5分钟极速搞定ImageNet验证集标签映射:Python自动化实战指南 每次处理ImageNet验证集时,你是否也对着那些晦涩的数字标签头疼不已?手动查表不仅效率低下,还容易出错。今天我们就来彻底解决这个痛点——用Python脚本自动完成标签映…...
【Git】深入解析 ‘.git/index.lock‘ 文件冲突:从报错到彻底解决
1. 当Git突然罢工:index.lock报错现场还原 那天下午我正忙着切换分支部署新功能,突然终端弹出红字警告:fatal: Unable to create .git/index.lock: File exists。这就像你急着上厕所却发现门被反锁,更糟的是你不知道里面到底有没有…...
Transformer 从0到1:长时依赖问题的本质——梯度消失与爆炸
# Transformer 从0到1:长时依赖问题的本质——梯度消失与爆炸## 引言:序列模型的困境在自然语言处理、语音识别、时间序列分析等领域,处理序列数据是核心任务。一个理想的序列模型,不仅需要捕捉局部的语法结构(如主语和…...
别再手动测试了!教你用ThinkPHP6+Workerman/MQTT搭建一个本地MQTT消息调试台
基于ThinkPHP6与Workerman/MQTT构建物联网调试平台的完整指南 物联网开发中,MQTT协议因其轻量级和高效性成为设备通信的首选方案。但调试MQTT消息往往依赖命令行工具或第三方平台,效率低下且缺乏灵活性。本文将展示如何利用ThinkPHP6框架配合Workerman/M…...
