Linux网络——深入理解传入层协议TCP

news2024/11/14 12:13:55

目录

一、前导知识

1.1 TCP协议段格式

1.2 TCP全双工本质

二、三次握手

2.1 标记位

2.2 三次握手

2.3 捎带应答

2.4 标记位 RST

三、四次挥手

3.1 标记位 FIN

四、确认应答(ACK)机制

五、超时重传机制

六 TCP 流量控制

6.1 16位窗口大小

6.2 标记位 PSH

6.3 标记位 URG

七、滑动窗口

7.1 滑动窗口的概念 

7.2 滑动窗口的相关问题

7.2.1 滑动窗口的大小

7.2.2 滑动窗口策略简单思路

7.2.2 超时重传时的数据如何保存

7.2.3 超时重传 vs 快重传

八、拥塞窗口


一、前导知识

1.1 TCP协议段格式

源/目的端口号:表示数据是从哪个进程来, 到哪个进程去;
32 位序号/32 位确认号:后面详细讲;
4 位 TCP 报头长度:表示该 TCP 头部有多少个 32 位 (有多少个 4 字节);所以TCP 头部最大长度是 15(2^4 - 1) * 4 = 60
6位标志位:后面具体说
16位窗口大小:后面再说
16位校验和:发送端填充,CRC 校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含 TCP 首部,也包含 TCP 数据部分
16 位紧急指针:后面和标志位中的URG一起说

1.2 TCP全双工本质


在任何一台主机上, TCP 连接既有发送缓冲区, 又有接受缓冲区, 所以, 在内核中, 可以在发消息的同时, 也可以收消息, 即全双工。在这里,收消息和发消息的本质都变成了拷贝,发消息首先把应用层的数据拷贝到发送缓冲区,然后再拷贝到接受方的接受缓冲区,接受方再通过特殊的 API 将接受缓冲区中的数据拷贝到应用层。

二、三次握手

2.1 标记位

为什么要有标记位呢?这里先做一下简单的理解:
作为网络服务器,服务端可以连接多个客户端,但是每个客户端发送的报文分为很多种,以三次握手为例,该报文可能是1)请求连接 2)正文 3)请求关闭 ,所以客户端收到各种各样的报文,这就说明TCP报文是需要类型的,为了区分不同的报文类型,就引入了标记位的概念。

2.2 三次握手

1. TCP建立连接时,发送方先传达一个连接意愿

2. 接收方收到后需要响应这个消息,若不响应,发送方可能会一直重发消息。除此之外,接收方还要表达连接意愿

3.发送方响应接收方的意愿。

首先需要明确的是,上图中的标记位其实是一个个报文,其中SYN指的是报文中SYN标记位被置为1,以此类推:

SYN:请求建立连接,称携带SYN标识的报文为同步报文段。
ACK:确认号是否有效。

其中,当请求方发送连接意愿时,就会发送将SYN标记位置1的报文,接收方相应表示为ACK标记位置1,同时表达连接意愿又会将SYN置1...这种方式即为捎带应答(下面会讲到)。

在这里,配合着上一篇博客中对于TCP网络编程中相关的API来看:
client 通过应用层的 connect 接口发送握手请求,然后阻塞等待三次握手完毕,再继续向后执行
server 通过 listen 接口才会受理接受的 SYN 请求,否则会直接丢弃。

2.3 捎带应答

捎带应答相当于搭顺风车,当不影响网络服务时,ACK 会和服务器的接受意愿一起发送给客户端。但是,在四次握手中并没有出现捎带应答机制,者在下面会讲到。

其实不止是服务器首次回应连接意愿时会有捎带应答,在后面我们要讲到的窗口大小,它们在首次发送时,就会将窗口大小填到报文中传输给发送端,同时,在两次握手后,即发送端确认接受端已经可以接受数据后,发送端相应的ACK就可以开始携带传输数据了!

2.4 标记位 RST

在传输控制协议(TCP)中,RST标记位(Reset flag)用于复位连接。RST标记位通常在以下情况下使用:

  1. 拒绝连接:当一方收到一个连接请求(例如SYN包),但不愿意或者无法建立连接时,它会发送一个带有RST标记位的包来拒绝连接请求。

  2. 中止连接:当一个已经建立的连接出现问题(例如,某一方的应用程序崩溃),一方可能会发送一个带有RST标记位的包来强制终止连接。

  3. 处理错误的数据包:如果一方收到一个无法识别或不符合预期的数据包,它可能会发送一个带有RST标记位的包来通知发送方存在错误并终止连接。

具体来说,当一个TCP数据包的RST标记位被设置时,接收方会立即关闭连接,并不会等待剩余的数据传输完成。这是一种快速且强制性的连接终止方式。

RST标记位的使用通常表示存在某种异常或错误情况,因此在正常的TCP连接管理过程中,RST标记位的出现相对较少。

三、四次挥手

1. 发送方发起断开意愿

2. 接收端响应消息

3. 接收方表达断开意愿

4. 发送方响应断开意愿

3.1 标记位 FIN

这和三次握手的规律大致相同,只是把中间一条拆分成了两条,其中2和3不可以合并为一条,当接收方等待数据数据接收完整后,才可以表达断开意愿。


FIN:通知对方,本端要关闭了,称携带FIN表示的报文为结束报文段

四、确认应答(ACK)机制

在TCP的特点中,有一点叫做:可靠。那么TCP的可靠指的是什么呢?

TCP的可靠指的是,发送方不仅要发送数据,而且还要知道自己发送的数据是否被接收方接收,这就依赖于TCP的确认应答机制。

TCP 将每个字节的数据都进行了编号,即为序列号:

TCP 将应用程序发送的字节流分割成适合传输的段,每个段包含一个序列号,用于在接收端重新组装数据。接收方可以根据这些序列号将数据段正确地拼接成原始的字节流。

下面将发送缓冲区简单想象成线性的数组:

假设主机A发送的数据段是 1-1000 ,那么主机B的应答则需要是 1001 ,此时1001就会写到协议段中的32位确认序号中,表示确认序号以前的报文全部被收到。

五、超时重传机制

若发送方未收到接受方的应答,则统一约定接受方未收到报文,此时有三种可能:
1) 传输数据丢失 2) 应答丢失 3) 被阻塞在路由器中

为了避免第三种情况,发送方会进行等待,如果等待超时,则会进行重传,这就是超时重传机制。超时重传中约定的等待时间在 Linux 系统中会以500ms为基本单位进行动态调整。

六 TCP 流量控制

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。

因此 TCP 支持根据接收端的处理能力, 来决定发送端的发送速度。这个机制就叫做流量控制。

6.1 16位窗口大小

那么,假设主机A向主机B发送消息,如果要进行流量控制,就需要知道主机B的接受能力,即接受缓冲区中剩余空间的大小。这就要求主机B要将自身的接受能力通告给主机A,这里就用到了TCP协议段格式中的16位窗口大小,用于标明主机B接受缓冲区中剩余空间的大小,同时使用了确认应答机制与捎带应答机制。

6.2 标记位 PSH

当B的接受缓冲区中剩余空间大小为0时,A在此期间会发送一个窗口探测的包,如果B的接受缓冲区一直为0,A就会将报文中的 PSH 标记位置1作为催促标记位,要求主机B尽快将缓冲区中的数据交给上层。

当然不止是这种极端情况,在日常通信中,凡是有这种需求时,都会将标记位 PSH 置1。

6.3 标记位 URG

以上已经介绍了五种标记位,现在剩下最后一种 URG ,URG表示紧急指针是否有效。

在接受缓冲区中,TCP按序为我们排好了很多的数据并按序向应用层进行交付,
紧急指针:仅当URG标记位被设置时才有效。它指示了紧急数据的结束位置。紧急指针的值是一个相对序号,它表示从当前序号开始到紧急数据结束的偏移量。

接受方会优先处理该报文,但是URG的使用并不常见,它传输的紧急数据通常是1字节,表示的是一个状态码,比如在传输2G的数据时,接受方的缓冲区已经接受了1G,此时发送方想要紧急停止传输工作,就会传输一个 URG 被设置的报文,接受方优先处理该报文得知其状态码意味着中断传输,那么之前存放在缓冲区的1G数据也不会再向上进行交付

七、滑动窗口

在前面的讲解中,我们也会意识到,每次先传输数据等待应答后才能再次传输的效率太低了,尤其是数据往返的时间较长的时候:

7.1 滑动窗口的概念 

既然这样一发一收的方式性能较低, 那么我们一次发送多条数据,这些数据暂时不需要被应答,可以直接发送,这样就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了),这种策略在发送方的体现就是以一个滑动窗口的形式:

在不考虑网络的前提下,将暂时不需要应答,可以直接发送的数据的最大值称为发送方的滑动窗口的大小,上图中滑动窗口的大小就是4000字节。

滑动窗口其实就是在发送窗口上的双指针之间的一个数据段:

从上图我们可以把发送缓冲区分为三段:

7.2 滑动窗口的相关问题

重中之重:
确认序号的意义:确认序号以前的报文全部被收到

7.2.1 滑动窗口的大小

在不考虑网络速度的前提下,窗口的大小一般是接受方接收缓冲区中剩余空间的大小。

7.2.2 滑动窗口策略简单思路

7.2.2 超时重传时的数据如何保存

前面提到了确认序号的意义以及滑动窗口的策略,当有数据丢包时,比如1001-2000丢了,那么确认应答的值就为1001,从滑动窗口的策略可以看出:左指针仍是1001,这意味着1001-2000的数据仍在滑动窗口中,那么发送方就可以进行数据的重传。

当某一段报文段丢失之后, 发送端会一直收到 1001 这样的 ACK, 就像是在提醒发送端 "我想要的是 1001" 一样;
如果发送端主机连续三次收到了同样一个 "1001" 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;
这个时候接收端收到了 1001 之后, 再次返回的 ACK 就是 7001 了(因为 2001 -7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;
这种机制被称为 "高速重发控制"(也叫 "快重传")

在滑动窗口中,可以分为窗口最左侧数据丢包,窗口中间数据丢包,窗口最右侧数据丢包,但是根据确认序号的意义,每次的确认序号都会保证确认序号前面的数据全部被成功接收,如果最左侧数据被丢包那么就参考以上方案。如果中间和右侧数据被丢包,那么它们最后都会称为滑动窗口中的最左侧,解决方案也同上一样。

7.2.3 超时重传 vs 快重传

从上面可以看出快重传的效率明显高于超时重传,超时重传需要等待一定的时间,而快重传接受到确认应答即可实现重传,那么超时重传的存在还有意义吗?

其实,从7.2.2中的图中可以看出接受方需要发送3次重复的确认应答,发送方也需要收到3个同样的确认应答才会重发,那么总有不足3个的情况,这时候发生生丢包,就需要超时重传进行兜底。

八、拥塞窗口

虽然 TCP 有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题。因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。

TCP 引入 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据

此处引入一个概念称为拥塞窗口:
1.发送开始的时候, 定义拥塞窗口大小为 1;
2.每次收到一个 ACK 应答, 拥塞窗口加 1
3.每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口。

实际上,拥塞窗口并不是一直呈指数增长的,这里引入了新的概念,即慢启动的阈值,当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长

当 TCP 开始启动的时候,慢启动阈值等于窗口最大值;
•在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回 1;
少量的丢包, 我们仅仅是触发超时重传;大量的丢包,就认为网络拥塞;
当 TCP 通信开始后, 网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;
拥塞控制,归根结底是 TCP 协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案。

TCP 拥塞控制这样的过程, 就好像热恋的感觉

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

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

相关文章

昇思25天学习打卡营第10天|xiaoyushao

从今天开始做一些实践应用,今天分享的是FCN图像语义分割。 全卷积网络(Fully Convolutional Networks,FCN)是UC Berkeley的Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation一文中提出的用于图…

值得买科技与MiniMax达成官方合作伙伴关系,共建融合生态

7月29日,值得买科技与大模型公司MiniMax宣布达成官方合作伙伴关系。 MiniMax旗下大模型产品海螺AI现已接入值得买“消费大模型增强工具集”,基于海螺AI比价策略,用户可通过海螺AI“悬浮球”功能实现快速比价及跳转购买。 此次合作也标志着值…

2023河南萌新联赛第(二)场 南阳理工学院

A. 国际旅行Ⅰ 题目&#xff1a; 思路&#xff1a; 因为题意上每个国家可以相互到达&#xff0c;所以只需要排序&#xff0c;输出第k小的值就可以了。 AC代码&#xff1a; #include<bits/stdc.h> #define int long long #define IOS ios::sync_with_stdio(0);cin.tie…

springboot短视频推荐系统-计算机毕业设计源码21503

摘 要 本论文基于协同过滤算法&#xff0c;旨在设计并实现一种基于SpringBoot框架的短视频推荐系统。该系统主要分为平台用户和管理员两类角色&#xff0c;用户可以注册、登录、浏览短视频内容&#xff0c;并根据个人兴趣收藏喜爱的视频。管理员则可以管理系统数据、用户和内容…

3.1.数据增广

数据增广 ​ 以图片为例&#xff0c;在不同的灯光&#xff0c;色温&#xff0c;以及灯光反射的影响下&#xff0c;对识别可能会造成很大影响。这时候我们希望样本有更多的多样性&#xff0c;则可以在语言里面加入各种不同的背景噪音&#xff0c;或者改变图片的颜色和形状 1.常…

【2024蓝桥杯/C++/B组/进制】

题目 代码 #include <bits/stdc.h> using namespace std;// 定义一个字符串 str&#xff0c;其内容为 "8100178706957568" string str "8100178706957568";// 函数 check 用于检查传入的字符串是否全部由数字组成 bool check(const string& st…

Java(二十七)---二叉搜索树以及Map和Set

文章目录 前言1.二叉搜索树1.1.概念1.2.操作--- 插入1.3.操作---搜索1.4.操作---删除1.6.性能分析1.7 和 java 类集的关系 2.搜索2.1.概念和场景2.2.模型 3.Map的使用3.1.关于Map的说明3.2.Map.Entry<K,V>的说明3.3.Map中常用的方法3.4.TreeMap的使用案例 4.Set的使用4.1…

探索 Milvus 存储系统:如何评估和优化 Milvus 存储性能

欢迎来到探索 Milvus 系列。Milvus 是一款支持水平扩展和具备出色性能的开源向量数据库。Milvus 的核心是其强大的存储系统&#xff0c;是数据持久化和存储的关键基础。该系统包括几个关键组成部分&#xff1a;元数据存储&#xff08;meta storage&#xff09;、消息存储&#…

Vs2022+QT+Opencv 一些需要注意的地方

要在vs2022创建QT项目&#xff0c;先要安装一个插件Qt Visual Studio Tools&#xff0c;根据个人经验选择LEGACY Qt Visual Studio Tools好一些&#xff0c;看以下内容之前建议先在vs2022中配置好opencv&#xff0c;配置方式建议以属性表的形式保存在硬盘上。 设置QT路径 打开v…

数学建模--差值算法

目录 插值方法的种类 应用实例 编程实现 算法实现 拉格朗日插值算法 ​编辑 多项式差值算法 样条插值 牛顿插值算法 插值算法在数据预测中的最新应用和案例研究是什么&#xff1f; 如何比较不同插值方法&#xff08;如线性插值、多项式插值&#xff09;在实际工程问…

bjtu数据库课程设计--基于Spring Boot框架的门店点餐系统

一、安装与配置 1 安装与配置 下载IntelliJ IDEA&#xff0c;需要下载安装jdk1.8.0_152&#xff0c;安装tomcat-9.0.88&#xff0c;安装MySQL8.0数据库。安装成功后打开IntelliJ IDEA&#xff0c;使用 Spring Boot 2.6.13框架&#xff0c;服务器URL窗口使用start.aliyun.com&a…

AI副业玩法:开启你的智能赚钱之路

在这个数码时代&#xff0c;人工智能&#xff08;AI&#xff09;已经不仅仅是科技巨头的专利&#xff0c;它逐渐渗透到我们生活的方方面面。如今&#xff0c;越来越多的人开始利用AI技术进行副业尝试&#xff0c;既拓宽了收入来源&#xff0c;也提升了自我技能。那么&#xff0…

【前端 07】JavaScript中的数组对象

JavaScript中的数组对象 在JavaScript中&#xff0c;数组&#xff08;Array&#xff09;对象是一种非常基础且强大的数据结构&#xff0c;用于在单个变量中存储多个值。这些值可以是任何数据类型&#xff0c;包括数字、字符串、甚至是其他数组&#xff08;多维数组&#xff09…

实验2-4-2 求N分之一序列前N项和**注意小细节

//实验2-4-2 求N分之一序列前N项和//计算序列 1 1/2 1/3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N;double sum0.0;scanf("%d",&N);for(int a1;a<N;a)sum(1.0/a);//这里必须是1.0 不可以是1&#xff01;&#x…

【管理咨询宝藏150】MBB咨询顾问的结构化PPT训练课程

【管理咨询宝藏150】MBB咨询顾问的结构化PPT训练课程 【格式】PDF版本 【关键词】MBB、麦肯锡、罗兰贝格、咨询顾问 【核心观点】 - 在项目的开始阶段你着手发展有效的金字塔式的演示文稿—我们的重点在最后两个步骤&#xff1b;我们用金字塔结构&#xff1a;通过把核心的信息…

使用nginx解决本地环境访问线上接口跨域问题

前言 前端项目开发过程中&#xff0c;经常会遇到各种各样的跨域问题。 虽然大部分时候&#xff0c;由脚手架自带的proxy功能即可解决问题&#xff0c;如webpack&#xff0c;vite等&#xff1b;但是若没有通过脚手架搭建项目&#xff0c;或者必须使用某些特殊规则转发时&#…

<数据集>手机识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;16172张 标注数量(xml文件个数)&#xff1a;16172 标注数量(txt文件个数)&#xff1a;16172 标注类别数&#xff1a;1 标注类别名称&#xff1a;[Phone] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;…

【QT】qt 文件操作

qt 文件 qt 文件1. Qt 文件概述2. 输入输出设备类3. 文件读写类4. 文件和目录信息类 qt 文件 1. Qt 文件概述 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库&#xff0c;提供了跨平台的文件操作能力。 Qt 提供了很多关于文件的类&#xff0c;通过这些类能够对文件…

上海有机所化学数据库:一站式科研资源

上海有机化学研究所是中国科学院上海分院的直属机构&#xff0c;主要从事有机化学、材料化学、生命科学等领域的基础研究和应用研究&#xff0c;化学专业数据库是该所承担建设的综合科技信息数据库的重要组成部分&#xff0c;服务于化学化工研究和开发的综合性信息系统&#xf…

Javaweb项目|springboot医院管理系统

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于springboot医院管理系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 编号&#xff1a;…