当前位置: 首页 > news >正文

计算机网络:运输层 —— TCP 协议概述与 TCP 报文段首部格式

文章目录

    • 基本概念
    • 主要特点和功能
    • TCP报文段的首部格式
      • 字段
      • 标志位
      • 扩展首部

传输控制协议(Transmission Control Protocol,TCP)协议是互联网上最常用的传输层协议之一,它负责提供可靠的端到端数据传输服务TCP 协议采用连接导向的通信方式,通过三次握手建立连接,使用序号和确认机制确保数据的可靠传输。

基本概念

使用 TCP 通信的双方,在传送数据之前必须首先建立TCP连接(逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接

TCP 为了实现可靠传输,就必须使用很多措施,例如TCP连接管理确认机制超时重传流量控制以及拥塞控制等。TCP的实现复杂,TCP报文段的首部比较大,占用处理机资源比较多。

TCP 协议在许多应用中被广泛使用,特别适用于需要可靠传输的应用如网页浏览文件传输电子邮件等。它通过提供可靠的数据传输和连接管理,确保数据的顺序和完整性,为应用层提供了方便、可靠的传输服务。

主要特点和功能

TCP 协议的主要特点和功能包括:

  1. 可靠传输:TCP 使用序号确认机制来确保数据的可靠传输。发送方将数据分割成多个数据段,并为每个数据段分配一个序列号。接收方根据序列号确认已接收的数据,并发送确认消息给发送方。如果发送方没有收到确认消息或者数据段丢失,它将重传未确认的数据。

  2. 流量控制:TCP 使用滑动窗口流量控制机制来控制数据的传输速率。发送方根据接收方的处理能力和网络状况动态调整发送数据的速度,避免数据的丢失和网络拥塞。

  3. 拥塞控制:TCP 使用拥塞窗口控制机制来避免网络拥塞。当网络出现拥塞时,TCP 通过减小发送方的拥塞窗口大小来减少发送的数据量,从而降低网络负载。

  4. 连接管理:TCP 通过三次握手建立连接四次挥手断开连接。三次握手通信过程中,客户端向服务器发送连接请求,服务器确认并回复连接响应,客户端再次确认连接。四次挥手过程中,客户端发送连接断开请求,服务器确认并发送连接断开响应,客户端再次确认连接断开。

  5. 面向字节流TCP 以字节流的方式传输数据,没有消息边界,应用层无需关心数据的分割和重组,可以连续地读取和写入字节流。

TCP报文段的首部格式

![[TCP报文段.png]]

发送方的TCP把应用进程交付下来的应用报文仅仅看作一连串的,无结构的字节流,TCP并不知道这些待传输的字节流的含义,仅将它们编号并存储在自己的发送缓存中。TCP根据发送策略,从发送缓存中提取一定数量的字节,并给其添加一个首部,使之成为TCP报文段并进行发送。

接收方的TCP,一方面从所接收到的TCP报文段中,取出数据载荷并存储在接收缓存中,另一方面,将接收缓存中的一些字节向上交付给应用进程。

TCP的全部功能需要依靠其首部中的各字段来实现

![[TCP报文段的首部格式.png]]

字段

  • 源端口字段:存储源端口号

  • 目的端口字段:存储目的端口号

TCP实现可靠传输的相关字段为以下三个字段:

  • 序号字段:占32比特,取值范围0~ 2 32 − 1 2^{32}-1 2321。当序号增加到最后一个时,下一个序号又回到0。用来指出本TCP报文段数据载荷的第一个字节的序号

  • 确认号字段:占32比特,取值范围0~ 2 32 − 1 2^{32}-1 2321。当确认号增加到最后一个时,下一个确认号又回到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! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 输出格式 样例 #1 样例输入 #1 无样例输出 #1 Hello,World!#include <bits/stdc.h&…...

前端-同源与跨域

一、同源策略 两个网站协议名、域名、端口号有一个不同就是非同源&#xff0c;就是跨域。跨域问题就是浏览器的同源策略造成的。 同源是指协议名、域名、端口号 必须完全一致&#xff01; http 默认端口号是80&#xff0c;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服务器&#xff0c;按照以下步骤操作&#xff…...

详解C语言字符和字符串的输入与输出

字符和字符串的输入与输出 一、字符的输入与输出1.1 字符的输入使用 getchar()使用 scanf() 1.2 字符的输出使用 putchar()使用 printf() 二、字符串的输入与输出2.1 字符串的输入使用 scanf() 输入字符串使用 fgets() 输入字符串 2.2 字符串的输出使用 printf() 输出字符串使用…...

adworld - stack2

adworld - stack2 题目概述&#xff1a;给一个数组(自己控制数组大小和填入的数据)&#xff0c;并进行(展示, 增加, 修改值, 求平均值, 退出)菜单选项 存在后门函数(system(“/bin/bash”))&#xff0c;但是没找到栈溢出的点 没判断数组的边界造成任意地址修改 但是如何准确…...

Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程

若事与愿违&#xff0c;请相信&#xff0c;上天自有安排&#xff0c;允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程 进程&#xff1a;就…...

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

一、总览 对于物理内存内存&#xff0c;linux对内存的组织逻辑从上到下依次是&#xff1a;node&#xff0c;zone&#xff0c;page&#xff0c;这些page是根据buddy分配算法组织的&#xff0c;看下面两张图&#xff1a; 上面的概念做下简单的介绍&#xff1a; Node&#xff1a…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...