【linux】网络基础(3)——tcp协议

news2025/1/11 9:51:46

文章目录

  • TCP协议概括
  • TCP头部格式
  • TCP连接管理
  • 建立连接(三次握手)
  • 数据传输
    • 确认应答机制
      • 捎带应答
    • 滑动窗口
      • 丢包问题
    • 拥塞控制
    • 延时应达
  • 终止连接(四次挥手)

TCP协议概括

TCP是一个面向连接的协议,在传输数据之前需要建立连接,确保通信双方的准备工作。它提供可靠的数据传输服务,通过确认、重传、流量控制和拥塞控制机制,保证数据准确且按顺序地到达目的地。

TCP头部格式

在这里插入图片描述
源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去。
32位序号: 数据段的序列号,用于重组数据流和检测丢失数据
32位确认号:确认收到的数据段的序列号(当收到确认序列号时,可以保证的是,此序列号之前的序列号都已经处理完成,即使没有收到对应的序列号)。
如下图:(1-100)是客户端发给服务器的数据段序号,101则是服务端对客户端发送过来数据的确认(确认应答机制)。
在这里插入图片描述
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 (1111)* 4 = 60(注意乘4)
6位标志位:
URG: 紧急指针是否有效
ACK: 确认号是否有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

在每次发送报文以及应答报文时,对于以上六中的请求,会分别对对应请求的标志位的值标志位1,来表示此数据的意义!
16位窗口大小:流量控制窗口大小,接收方可以接受的最大数据量。(每次进行报文通信时,都会将自己的接受缓冲区的具体大小告诉对方,好让对方发送我们所能接受的字节流,以防于数据过大,导致丢包问题!)
16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分
16位紧急指针: 标识哪部分数据是紧急数据(配合标志位的URG使用)。
选项:可选字段,用于扩展TCP协议的功能
数据:实际传输的数据。

TCP连接管理

TCP是面向连接的协议,通信双方在传输数据之前必须先建立连接。连接管理包括连接建立、数据传输和连接终止三个阶段。

建立连接(三次握手)

在这里插入图片描述
TCP使用三次握手机制建立连接,确保双方同步并准备好数据传输。
SYN:客户端发送一个SYN(同步)报文段,表示请求建立连接,同时发送初始序列号。
SYN+ACK:服务器接收到SYN报文段后,发送一个SYN-ACK报文段,确认收到SYN,并发送自己的初始序列号。
ACK:客户端接收到SYN-ACK报文段后,发送一个ACK(确认)报文段,确认收到服务器的SYN。
通过三次握手,客户端和服务器确认彼此的存在,并交换初始序列号,准备传输数据。

为什么要进行三次握手?
解决SYN洪流问题!因为如果是一次或者两次握手,一些恶意的客户端,对服务器进行多次连接攻击,只要服务端收到来自客户端的连接,不论是一次还是两次,都会直接建立连接快速消耗内存,导致服务器挂掉,而三次握手需要客户端的再次确认返回,才会进行建立连接,虽然也会有SYN洪流问题,但要比之前的方式减少些许负担,同时还可以最小成本的验证全双工,客户端可以验证发送以及接受正常通信,服务端也可以验证发送以及接受的正常通信。

数据传输

确认应答机制

每收到一个数据段,接收方都会发送一个确认报文段(ACK),确认收到的数据段序列号。发送方如果在一定时间内没有收到确认,则会重传该数据段。
在这里插入图片描述
如上图是一种串行发送消息,效率可见是非常慢。所以有下图的多行发送消息,特别注意这里每次发送数据都是报头携带数据的。而返回的应答ACK则只有报头,在报头内将ACK标志位置为1
在这里插入图片描述
而这样收到的报文可能是乱序的这样就可以靠TCP报头的序列号进行排序,处理。

捎带应答

对于上面的ACK应答报文,也可以被携带在返回数据中,例如你向服务器发问1+1等于多少?服务器会给你回应2同时报头中ACK的标志位置为1,表示对你1+1的信息收到了。这样就可以将两个通信合并为一条。大大提高效率。

滑动窗口

针对确认应答机制中的多行并发消息的解决。滑动窗口的初始大小是根据接收方返回报头数据中自己的的接受缓冲区的大小来决定的,同时也达到流量控制的目的当然对于网络中进行通信有多个路由器等硬件设施,具体的滑动窗口的大小会根据这些硬件设施所能接受的大小与对方接受缓冲区的大小取最小值来设定!!
TCP使用滑动窗口机制进行流量控制,接收方根据自己的接收能力设置窗口大小,告诉发送方可以发送的最大数据量
在这里插入图片描述
如下图一次性发送一个窗口内所有的内容。倘若接受到2001的确认信号,那么窗口的左坐标就会移动到2001的位置,右坐标也会相应的增加到6001
在这里插入图片描述
把窗口的前坐标比作win_start,结尾坐标比作win_end,具体滑动就是根据下面的公式进行更变。
在这里插入图片描述

丢包问题

在这里插入图片描述
在这里插入图片描述
因为有应答序号,保证次序号之前的消息都已经收到,所以1001——2000丢包,后面数据即使收到,也只会返回1001这个确认序号,经过多次重复应答,主机A就知道,1001——2001丢了,对方没有收到,则会再次发送此数据。
这种机制被称为 “高速重发控制”(也叫 “快重传”)

拥塞控制

控制滑动窗口大小的另一个决定因素
TCP通过慢启动、拥塞避免、快重传和快恢复等算法进行拥塞控制,防止网络过载。

慢启动:在连接初始阶段,发送方以指数增长方式增加发送窗口大小,快速探测网络容量。

拥塞避免:当慢启动阈值达到一定值时,发送方以线性增长方式增加发送窗口大小,避免网络拥塞。

快重传和快恢复:当发送方收到重复确认(ACK)时,快速重传丢失的数据段,并进行快速恢复,减少网络等待时间。
在这里插入图片描述

发送开始的时候, 定义拥塞窗口大小为1;
每次收到一个ACK应答, 拥塞窗口加1;
每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口;
像上面这样的拥塞窗口增长速度, 是指数级别的. “慢启动” 只是指初使时慢, 但是增长速度非常快.
为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍.
此处引入一个叫做慢启动的阈值
当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长

在这里插入图片描述
少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞;
当TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降;
拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案

延时应达

当收到多个数据请求时,接收方的接收缓冲区就会变小,此时如果对多个数据请求先来的做出应答,那么对于应答携带的报头中发送给对方的可接受缓冲区的大小是非常小,会降低下一次发送的效率,所以我们引入延时应达,我们可以等一次性收到的全部数据都处理完,通过序列号的排序,仅仅应答最后一个序列号即可(因为确认序列号可以保证携带之前序列号的数据已经收到并处理
具体的延时应答策略:
数量限制: 每隔N个包就应答一次;
时间限制: 超过最大延迟时间就应答一次

具体的数量和超时时间, 依操作系统不同也有差异; 一般N取2, 超时时间取200ms
在这里插入图片描述

终止连接(四次挥手)

TCP使用四次挥手机制终止连接,确保双方都能够正常结束数据传输。

FIN:一方(通常是客户端)发送一个FIN(终止)报文段,表示不再发送数据,但仍然可以接收数据。
ACK:另一方(服务器)接收到FIN报文段后,发送一个ACK报文段,确认收到FIN。
FIN:服务器发送自己的FIN报文段,表示不再发送数据。
ACK:客户端接收到FIN报文段后,发送一个ACK报文段,确认收到服务器的FIN。

在这里插入图片描述

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

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

相关文章

Zabbix 配置进程监控

Zabbix 进程监控介绍 Zabbix可以很方便地监控服务器上的各种进程。在使用Zabbix进行进程监控时,被监控的节点通常需要安装Zabbix Agent。Zabbix Agent 是一个轻量级的代理程序,安装在被监控的主机上,用于收集系统的各种性能数据和指标&#…

OpenBMB × Hugging Face × THUNLP,大模型课开班丨伙伴活动推荐

2022 年,OpenBMB 开源社区联合 THUNLP 开国内大模型公开课先河,全网百万级播放量,已帮助无数大模型爱好者从入门到精通。 这个夏天,OpenBMB 携手 HuggingFace、THUNLP 和面壁智能,推出大模型公开课第二季。全球知名开…

vue实现一个简单的审批绘制功能

1、vue代码 <div class"approval"><div class"approval_ul" v-for"(item,key) in approvalList" :key"key"><div><el-radio-group v-model"item.jointlySign"><el-radio label"1">…

人大出品!最适合大模型初学者人手的LLM大语言模型综述,爆火全网

今天给大家推荐一本大模型&#xff08;LLM&#xff09;这块的一本外文书&#xff0c;经过整理已经出中文版了&#xff0c;就是这本《大型语言模型综述》&#xff01;本书在git上有9.2k star&#xff0c;还是很不错的一本大模型方面的书。 本教程内容主要内容&#xff1a;中文版…

外挂级OCR神器:免费文档解析、表格识别、手写识别、古籍识别、PDF转Word

智能文档解析&#xff1a;大模型友好的文档解析工具 PDF转Markdown 支持将任意格式的文件&#xff08;图片、PDF、Doc&#xff0f;Docx、网页等&#xff09;解析为Markdown或Json格式&#xff0c;以对LLM友好的方式呈现。 更高速度&#xff1a;100页PDF最快1.5s完成解析 更大…

Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换

一、前言说明 这个地图组件写了很多年了&#xff0c;最初设计的比较粗糙&#xff0c;最开始只是为了满足项目需要&#xff0c;并没有考虑太多拓展性&#xff0c;比如最初都是按照百度地图写死在代码中&#xff0c;经过这几年大量的现场实际应用&#xff0c;以及大量的用户提出…

1.7-自然语言的分布式表示-skip-gram模型代码实现

文章目录 1 skip-gram模型的实现1.1模型结构的实现1.2前向传播的实现1.3反向传播的实现 2 skip-gram模型的计算与学习3总结 书上提供了skip-gram模型的代码实现&#xff0c;但是没有去讲解&#xff1b;这里我们自己来看看他提供的代码&#xff1b;看代码的时候&#xff0c;尤其…

yarn不同操作系统的安装与配置

Yarn 是一个快速、可靠且安全的依赖包管理工具&#xff0c;用于替代 npm。以下是在不同操作系统上安装和配置 Yarn 的步骤。 1. 安装 Node.js 在安装 Yarn 之前&#xff0c;请确保已经安装了 Node.js&#xff0c;因为 Yarn 需要 Node.js 环境。你可以在 Node.js — Run JavaSc…

极简通俗VAE

一、VAE 背景&#xff1a;VAE什么变分自编码器&#xff0c;听起来起名都头大&#xff0c;用大白话告诉你。 把一个复杂图片压缩成两个参数&#xff0c;用这个参数采样再复原。 这个简单的东西是两个参数&#xff0c;均值和方差&#xff0c;用&#xff08;0&#xff0c;1&…

15kg级弹簧刀高速巡飞无人机技术详解

弹簧刀高速巡飞无人机&#xff0c;作为一种先进的战术导弹系统&#xff0c;融合了无人机与导弹的双重特性&#xff0c;成为了现代战争中不可或缺的侦察与打击利器。该无人机以其小巧的外形设计、优异的性能表现和广泛的适用领域&#xff0c;受到了全球军事领域的广泛关注。弹簧…

ChatGPT如何应用在谷歌seo?

ChatGPT在提升博客和创作效率方面非常有用。它可以帮助你快速生成吸引人的标题&#xff0c;确保内容第一眼就能抓住读者的注意力。不仅如此&#xff0c;ChatGPT还能根据你的主题生成详细的文章提纲&#xff0c;让你在写作时思路更加清晰。关键词优化也是它的强项&#xff0c;可…

当《开心消消乐》遇上 AI 推理,我们找到了高质量关卡背后的原因!

随着 AI 热潮席卷各行各业&#xff0c;其落地应用已经成为企业技术研发升级的工作重心。人工智能应用的升级不仅需要软件层面的升级迭代&#xff0c;还需要大规模基础设施的支撑。然而&#xff0c;自行搭建大规模算力、存储基础设施对于大多数企业而言都存在技术难度、人力资源…

OpenSSL的一些使用案例

目录 一、介绍 二、基本使用 1、Shell &#xff08;1&#xff09;文件加解密 &#xff08;2&#xff09;生成密钥文件 2、API &#xff08;1&#xff09;md5sum &#xff08;2&#xff09;AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法&#xff0c;只…

【IA修补一切】Inpaint Anything: Segment Anything Meets Image Inpainting论文解读

作者来自中国科学技术大学和东部高级研究院。文章提出了一个新的图像修复工具“Inpaint Anything (IA)”&#xff0c;它结合了不同的视觉模型&#xff0c;如Segment Anything Model (SAM)、LaMa、Stable Diffusion (SD)等&#xff0c;以实现更高级的图像编辑功能。 论文&#x…

P3374 【模板】树状数组 1

题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 &#x1d465;x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 &#x1d45b;,&#x1d45a;n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …

【MySQL】表的操作{创建/查看/修改/删除}

文章目录 1.创建表1.1comment&#xff1a;注释信息1.2存储引擎 2.查看表3.修改表3.1add添加列&#xff0c;对原数据无影响3.2drop删除列3.3modify修改列类型3.4change修改列名3.5rename [to]修改表名 4.删除表5.总结 1.创建表 CREATE TABLE table_name (field1 datatype,field…

springboot医院门诊挂号系统-计算机毕业设计源码033123

目 录 摘要 1 绪论 1.1研究背景及意义 1.2研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2 医院门诊挂号系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.…

第一百三十八节 Java数据类型教程 - Java boolean数据类型和float数据类型

Java数据类型教程 - Java boolean数据类型 布尔数据类型只有两个有效值:true和false。 这两个值称为布尔值字面量。 我们可以使用布尔值字面量 boolean done; // Declares a boolean variable named done done true; // Assigns true to done布尔变量不能转换为任何其他…

什么是分库分表?它有哪些实现类型?

假如你正在使用关系型数据库开发一款健康类系统。业务发展很好&#xff0c;系统有很多活跃的新老用户&#xff0c;这些用户会和平台的医生团队进行交互&#xff0c;每天可能会生成数万甚至数十万级别的业务数据。这样的话&#xff0c;随着数据量越来越大&#xff0c;系统中的某…

如何选择易用性高的项目管理软件?

随着项目管理在各行各业的广泛应用&#xff0c;选择一款易用性高的项目管理软件变得越来越重要。易用性高的软件可以帮助企业提高工作效率&#xff0c;降低管理成本&#xff0c;同时还能提升团队之间的协作能力。那么&#xff0c;如何选择一款易用性高的项目管理软件呢&#xf…