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

文章目录

  • 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.mzph.cn/diannao/40480.shtml

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

相关文章

医疗器械进销存软件 专业合规的医疗公司器械出入库管理软件

财务管理:财务档案统一管理,有利于科学管理企业资金 财务管理:发票关联业务单据,业财融合,加速财务数字化转型 财务管理:提供收付款功能,加快企业应收账款的回收,降低付款的资金浮…

小白轻松使用maven

一、maven 下载 下载地址 maven 下载官方地址 https://maven.apache.org/download.cgi,黄色压缩包。 2. 下载解压 cmd 解压命令 tar -zxvf apache-maven-3.9.8-bin.tar.gz二、maven 配置 settings.xml 文件配置 镜像配置: 国内镜像配置用于下载资源…

《操作系统真象还原》学习笔记:第1章 部署工作环境

**提示:**这篇文章是根据学长提供的教程《操作系统真象还原》第一章 部署工作环境来完成的,我按照学长给的教程一步一步做下来,再结合《操作系统真象还原》这本书,对实验环境进行了配置。以下是我按照教程进行搭建的记录&#xff…

[Vue3 + TS + Vite] CSS穿透

以 Element-Plus UI 中的 <el-drawer> 为例 方法一 Template中 <el-drawer>CSS中 <style lang"scss" scoped> :deep(.el-drawer__header) {margin: 0px 0px 0px 0px; /*上 右 下 左*/box-sizing: border-box;padding: 0px 0px 0px 0px; /*上 右…

【Ubuntu】详细说说Parallels DeskTop安装和使用Ubuntu系统

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、Ubuntu系统的使用2.1 系统的下载2.2 系统的安装2.3 安装桌面版(可选)2.3.1 安装/更新apt2.3.2 安装桌面版2.3…

【JNDI注入利用工具】JNDIExploit v1.1

# 简介 JNDIExploit一款用于 JNDI注入 利用的工具&#xff0c;大量参考/引用了 Rogue JNDI 项目的代码&#xff0c;集成了JDNI注入格式&#xff0c;能够更加方便的开启服务端后直接利用&#xff0c;支持反弹Shell、命令执行、直接植入内存shell等&#xff0c;并集成了常见的by…

7.4、空指针和野指针

空指针 #include <iostream> using namespace std;int main() {//空指针//1、空指针用于给变量进行初始化int * p NULL;//2、空指针是不可以进行访问的//0-255之间的内存编号是系统占用的&#xff0c;因此不可以访问//cout<<*p<<endl;system("pause&q…

算法训练 | 图论Part3 | 101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

目录 101.孤岛的总面积 图论法 102.沉没孤岛 图论法 103.水流问题 图论法 104.建造最大岛屿 图论法 101.孤岛的总面积 题目链接&#xff1a;101. 孤岛的总面积 文章讲解&#xff1a;代码随想录 图论法 代码一&#xff1a;深搜 #include <iostream> #includ…

在Centos7上安装PostgreSQL16的详细步骤

文章目录 环境一、准备二、postgresql下载方法一&#xff1a;wget下载方法二&#xff1a;下载压缩包解压 三、创建用户组、用户四、创建数据主目录五、配置环境变量六、initdb初使化数据库七、配置服务八、设置开机自启动九、设置防火墙十、启动数据库服务 环境 CPU: 4 核心或以…

Python爬虫系列-让爬虫自己写爬虫(半自动化,代替人工写爬虫)

现在的PC、手机客户端等终端设备大量使用了网页前后端技术&#xff0c;另外主流的网站也会经常会更新&#xff0c;导致以前一个月更新一次爬虫代码&#xff0c;变成了天天需要更新代码&#xff0c;所以自动化爬虫技术在当前就显得特别重要&#xff0c;最近我也是在多次更新某个…

养老院生活管理系统

摘要 随着全球范围内人口老龄化趋势的日益加剧&#xff0c;养老院作为老年人生活的重要场所&#xff0c;其生活管理问题也显得愈发突出和重要。为了满足养老院在日常生活管理、老人健康监护、服务人员管理等多方面的需求&#xff0c;提高管理效率和服务质量。决定设计并实现了…

用一百场线下讲座科普充电桩 能效电气做到了

在新能源汽车产业蓬勃发展的今天,充电桩作为产业链的重要环节,其建设与发展成为推动行业进步的关键。在这一背景下,能效电气凭借其卓越的技术实力和前瞻性的市场布局,成为了新能源充电桩行业的佼佼者。 为了进一步推动新能源产业的发展,普及充电桩知识,能效电气精心策划并举办…

C语言数据类型和变量(二)

目录 1.数据类型的取值范围 2.变量 2.1 变量的创建 2.2 变量的分类 2.3全局变量和局部变量在内存中的存储​编辑 3. 算术操作符&#xff1a; 、 - 、* 、/ 、% 3.1 和 - 3.2 * 3.3 / 3.4 % 1.数据类型的取值范围 每一种数据类型有自己的取值范围&#xff0c;也就是存…

mapper.xml 文件对应的 Dao 接口原理

在 Java 框架如 MyBatis 中&#xff0c;Mapper.xml 文件是用于定义 SQL 查询的配置文件&#xff0c;而对应的 Dao 接口&#xff08;Mapper 接口&#xff09;则提供了与 XML 文件中的 SQL 查询相对应的方法。这种设计模式使得 Java 代码与 SQL 语句解耦&#xff0c;提高了代码的…

盘点亚马逊5大实用选品思路(图文讲解+选品案例)

一、7天蓝海选品法 市场上很多工具一般都是近30天的跨境商品数据&#xff0c;而店雷达亚马逊选品&#xff0c;可以筛选出上架近7天的亚马逊产品&#xff0c;避免在已经市场相对饱和的赛道&#xff0c;中小卖家还要挤破头去抢蛋糕。我们更应该学会在市场反馈好的新品中找到出单…

Git删除了文件拉取时失败

本地删除了一些文件&#xff0c;远端的另一个提交修改了被删除的文件&#xff0c;vs里拉取时提示未处理的提交&#xff0c;无法继续操作&#xff0c;git gui里显示很多unstaged change的项 解决办法&#xff1a; 1、用git bash的git rm --cached filename或 git rm -r --cached…

GBASE8S如何使用dbexport实现单表的还原和实现数据库的复制

(一) 通过dbexport实现单表数据还原 1. 测试前的信息查看 本次以test库的表test21为例 [gbasedbtiZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test - Your evaluation license will expire on 2025-05-26 00:00:00Database selected.> select * from test21;id name1 a2 b3 c3…

探索Vue.js的无限可能 —— vuejs-challenges

vuejs-challenges&#xff1a;挑战自我&#xff0c;共同成长&#xff0c;Vue.js挑战等你来战&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 vuejs-challenges是一个专为Vue.js学习者和开发者设计的开源项目。它通过提供一系列精心设计的挑战&#xff0c;帮助参与者深…

使用 JavaScriptCore 进行跨语言调用

使用 JavaScriptCore 进行跨语言调用时&#xff0c;既可以在 Native 代码中执行 JavaScript 代码&#xff0c;也可以在 JavaScript 中调用 Native 方法。以下是详细的实现步骤和示例。 1. 在 Native 代码中执行 JavaScript 代码 使用 JavaScriptCore 框架&#xff0c;可以在 …

手把手教你一步一步通过AI助手生成利润表分析报告

AI助手之利润表分析报告-操作篇 以下为文字整理部分&#xff1a; 如果要手工制作一份这样的利润分析报告大概要多久时间&#xff1f;从准备数据做成表格&#xff0c;到完成报告&#xff0c;至少需要1天的时间吧&#xff0c;特别是敲文字报告的时候&#xff0c;生怕把数字搞错要…