9.3.2.2网络原理(传输层TCP)
TCP全部细节参考RFC标准文档
一.TCP特点:
有连接,可靠传输,面向字节流,全双工.
二.TCP数据报:

1.端口号是传输层的重要概念.
2.TCP的报头是变长的(UDP是固定的8字节),大小存在4位首部长度中,用4个bit位(0~15)表示长度单位是4字节.(TCP报头最大长度是60字节,前面20字节是固定的,"选项"部分可有可无,可大可小)
三.TCP核心特性:
1.保证可靠性的机制:
a)确认应答(核心)

1)对每个字节进行标号,只要对第一个字节编号,再结合报文长度,此时每个字节的编号就确定了.
2)确认序号表示该序号之前的数据全部收到了.

3)ACK:如果ACK为0,说明是普通报文,此时确认序号无效,如果ACK为1,此时确认序号都有效,但是序号和确认序号无关(序号是本次数据的编号,确认序号和接收的数据有关).
4)TCP载荷长度在IP层可以得知,TCP载荷 = IP载荷 - TCP报头.
b)超时重传:相当于针对确认应答做出的重要补充.
1)收到了数据之后,要对数据进行去重(按照TCP的序号作为依据).
2)TCP在内核中,会给每个socket对象安排一个内存空间,相当于一个队列,称为接收缓冲区,收到的数据会不会放在缓冲区中,按照序号进行排列(队头数据之前的序号一定是读过了,如果重传,会自动去除,如果发生后发先置的情况,则会在队列中根据序号排好队,如果最先发的数据迟迟不到会阻塞等待).
3)不管是发送的消息本身丢了,还是应答报文丢了,都会重传.
4)如果多次重传失败,会重置TCP连接.

RST为1表示复位报文.
c)三次挥手和四次握手(连接管理)
1)三次握手:

2)三次握手的目的:验证网络是否通畅,以及每个主机的发送能力和接收能力是否正常,进行消息协商,使客户端和服务器以相同的参数进行数据传输.
3)三次握手为什么是三次?
恰好三次,能够验证好双方的发送和接收功能均正常,并且把这样的信息同步给双方,所以两次是不可以的,虽然两次握手也可以验证完成通信能力的正确性,但是服务器这边还不知道这样验证通过的信息,四次是可以的,但是没有必要,中间两次可以合并,如果非要拆开会降低效率.
4)四次挥手:

FIN:结束报文段.
5)四字挥手,为什么是四次,三次行不行?
有的时候三次可以,有的时候必须四次,中间两次不一定能合并.FIN是由程序代码触发控制的,调用socket.close()方法,或者进程结束,才会触发FIN, ACK是系统内核控制的,收到FIN之后立马会返回ACK.
6)四次挥手时数据丢失:前三次数据丢失会重传,但是会发生最后一次ACK丢失的情况,所以客户端在发生最后一次ACK之后不能之间释放资源,而是应该等待2个MSL时间(1个MSL时间是网络通信所需的最大时间,一来一回一共2倍).
d)流量控制:根据服务器的处理能力,控制客户端的发送速度(窗口大小)
1)使用服务器接收缓冲区的剩余大小来衡量服务器的处理能力.

2)如果服务器发送的ACK中表示接收缓冲区空余大小为0,客户端会暂停发送数据(发也是丢包),一段时间过后,客户端会发送窗口探测包(不携带任何具体数据),为了触发服务器的ACK,根据服务器返回的ACK考虑下一步.
e)拥塞控制:整体的网络传输能力
1)机制:使用实验的方法,动态调整窗口大小.使用一个较小的窗口传输,如果传输通畅,就调大窗口;使用较大的窗口传输,如果传输拥塞(丢包),就调小窗口.
2)过程:
慢启动:刚开始使用非常小的窗口试水.
指数增长:在传输通畅的情况下,拥塞窗口就会指数增长.
线性增长:当指数增长到一定阈值之后,就会触发线性增长.
回归小窗口:在窗口增长的过程中,如果出现丢包,就认为网络拥塞,此时会回归到最初的小窗口.
重复上述过程,但是会调整阈值.
注意: 实际发送窗口 = min(流量控制窗口, 拥塞窗口)
2.提高传输效率:
a)滑动窗口:一次性发一组数据.

1)如果一个一个发,大部分时间浪费在等待ACK什么,使用滑动窗口,一次性发送多个数据,使用一份等待时间,等待多个ACK.
2)窗口的含义:一次发送不需要等待ACK的消息个数.
3)如下图,当2001到达客户端之后,客户端就会立刻发送下一个数据,客户端始终保持等待的ACK的个数不变.

4)丢包处理:
如果是ACK丢了,不用做任何处理,比如,如果确认序号2001丢了,但是下一次会返回确认序号3001,表示3001前的数据都收到了(包括2001).
快速重传:如果普通数据丢了,必须要重传,比如,如果数据2001~3000丢了,客户端继续发送数据,服务器会一直发送确认序号2001,这时客户端就知道了数据2001~3000丢了.收到多次同样的确认序号之后,客户端就会重传.
注意:这里的快速重传和上面的超时重传并不冲突,在数据量少的情况下,TCP未必会使用滑动窗口的机制,丢包情况下会使用超时重传机制,数据量的时,TCP使用滑动窗口机制,丢包情况下使用快速重传机制.
b)延迟应答:
机制:服务器返回ACK时,拖延一点时间,使服务器先消费掉一点数据,这样接收缓冲区就更大了,客户端的窗口也更大了.

c)捎带应答:
机制: 响应和ACK合二为一.
实例:四次挥手可以合并成三次.
3.粘包问题:
a)粘包问题就是接收方在缓冲器中取数据,无法区分一条数据的边界.
b)解决问题需要站在应用层的角度.
1)应用层协议中,引入分隔符,比如\n.
2)应用层协议中,引入包长度

4.TCP异常情况处理:
a)进程崩溃:
进程没了 => PCB没了 => 文件描述符释放(相当于调用socket,close()方法) => 发送FIN,触发四次握手.
和正常情况没区别.
b)主机正常关机:
正常关机会干掉所有进程,和进程崩溃处理一样.

c)主机掉电:
1.接收方掉电:发送方收不到ACK,发送方会触发超时重传,多次失败后,会发送复位报文(RST字段
为1)来重置连接,失败后就释放连接.
2.发送方掉电:接收方会发送心跳包(不携带业务数据)来触发ACK,目的是确认发送方是否工作和网络是否通畅.

d)网线断开:
参考c)主机掉电.
5.总结:


相关文章:
9.3.2.2网络原理(传输层TCP)
TCP全部细节参考RFC标准文档 一.TCP特点: 有连接,可靠传输,面向字节流,全双工. 二.TCP数据报: 1.端口号是传输层的重要概念. 2.TCP的报头是变长的(UDP是固定的8字节),大小存在4位首部长度中,用4个bit位(0~15)表示长度单位是4字节.(TCP报头最大长度是60字节,前面20字节是固定…...
ssm+mybatis无法给带有下划线属性赋值问题
原因:mybaitis根据配置,将有下划线的字段名改为了驼峰格式。 具体见:ssmmybatis无法给带有下划线属性赋值问题,无法获取数据库带下划线的字段值 - 开发者博客 解决方式: 直接将实体类中的下划线去掉返回值使用resul…...
学习笔记-JVM监控平台搭建
SpringBoot Actuator 1 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>2 开启配置 # 暴露所有的监控点【含Prometheus】 management.endpoin…...
使用css实现时间线布局(TimeLine)
前言 在使用uni-app开发微信小程序过程中,遇到了时间轴布局,由于每项的内容高度不一致,使用uniapp自带的扩展组件uni-steps,样式布局无法对齐竖线,于是自己造轮子,完成特殊的布局。显示效果如下࿱…...
深入浅出 栈和队列(附加循环队列、双端队列)
栈和队列 一、栈 概念与特性二、Stack 集合类及模拟实现1、Java集合中的 Stack2、Stack 模拟实现 三、栈、虚拟机栈、栈帧有什么区别?四、队列 概念与特性五、Queue集合类及模拟实现1、Queue的底层结构(1)顺序结构(2)链…...
前端基础(二)
前言:前端开发框架——Vue框架学习。 准备工作:添加Vue devtools扩展工具 具体可查看下面的这篇博客 添加vue devtools扩展工具添加后F12不显示Vue图标_MRJJ_9的博客-CSDN博客 Vue官方学习文档 Vue.js - 渐进式 JavaScript 框架 | Vue.js MVVM M…...
ORB-SLAM2学习笔记7之System主类和多线程
文章目录 0 引言1 整体框架1.1 整体流程 2 System主类2.1 成员函数2.2 成员变量 3 多线程3.1 ORB-SLAM2中的多线程3.2 加锁 0 引言 ORB-SLAM2是一种基于特征的视觉SLAM(Simultaneous Localization and Mapping)系统,它能够从单个、双目或RBG…...
gin的占位符:和通配符*
1、用法 在 Gin 路由中,可以使用一个通配符(*)或一个占位符(:)来捕获 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…...
【量化课程】08_2.深度学习量化策略基础实战
文章目录 1. 深度学习简介2. 常用深度学习模型架构2.1 LSTM 介绍2.2 LSTM在股票预测中的应用 3. 模块分类3.1 卷积层3.2 池化层3.3 全连接层3.4 Dropout层 4. 深度学习模型构建5. 策略实现 1. 深度学习简介 深度学习是模拟人脑进行分析学习的神经网络。 2. 常用深度学习模型架…...
12-数据结构-数组、矩阵、广义表
数组、矩阵、广义表 目录 数组、矩阵、广义表 一、数组 二.矩阵 三、广义表 一、数组 这一章节理解基本概念即可。数组要看清其实下标是多少,并且二维数组,存取数据,要先看清楚是按照行存还是按列存,按行则是正常一行一行的去读…...
Idea 反编译jar包
实际项目中,有时候会需要更改jar包源码来达到业务需求,本文章将介绍一下如何通过Idea来进行jar反编译 1、Idea安装decompiler插件 2、找到decompiler插件文件夹 decompiler插件文件夹路径为:idea安装路径/plugins/java-decompiler/lib 3、…...
【Git】安装以及基本操作
目录 一、初识Git二、 在Linux底下安装Git一)centOS二)Ubuntu 三、 Git基本操作一) 创建本地仓库二)配置本地仓库三)认识工作区、暂存区、版本库四)添加文件五)查看.git文件六)修改文…...
Spring创建Bean的过程(2)
上一节介绍了Spring创建过程中的两个重要的接口,那么它们在创建Bean的过程中起到了什么作用呢?接下来请看: Spring有三种方式寻找 xml 配置文件,根据 xml 文件内容来构建 ApplicationContext,分别为ClassPathXmlAppli…...
Linux 终端操作命令(2)内部命令
Linux 终端操作命令 也称Shell命令,是用户与操作系统内核进行交互的命令解释器,它接收用户输入的命令并将其传递给操作系统进行执行,可分为内部命令和外部命令。内部命令是Shell程序的一部分,而外部命令是独立于Shell的可执行程序…...
【Git】大大大问题之syntax error near unexpected token `(‘ 的错误解决办法
话不多说,先上图: 如图,因为在linux环境里,文件路径中含有括号(),因此报错! 解决办法 等同于 :linux下解决bash: syntax error near unexpected token (’ 的错误&am…...
Flink源码之TaskManager启动流程
从启动命令flink-daemon.sh可以看出TaskManger入口类为org.apache.flink.runtime.taskexecutor.TaskManagerRunner TaskManagerRunner::main TaskManagerRunner::runTaskManagerProcessSecurely TaskManagerRunner::runTaskManager //构造TaskManagerRunner并调用start()方法 …...
加入微软MCPP有什么优势?
目录 专业认可 技术支持 销售和市场推广支持 培训和认证 业务机会和合作伙伴网络...
leetcode做题笔记78子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 思路一:回溯 void backtracking(int* nums, int numsSize, int** res, int* ret…...
Skywalking-9.6.0系列之本地源码编译并启动
Skywalking相信有很多人使用过,通过容器或者下载安装包进行安装的,今天从源代码角度,拉取、构建、启动。 官方文档步骤简洁明了,我这边会结合自己遇到的一些问题做出总结。 当前构建资源版本: MAC 10.15.7IDEA 2021.…...
proteus结合keil-arm编译器构建STM32单片机项目进行仿真
proteus是可以直接创建设计图和源码的,但是源码编译它需要借助keil-arm编译器,也就是我们安装keil-mdk之后自带的编译器。 下面给出一个完整的示例,主要是做一个LED灯闪烁的效果。 新建工程指定路径,Schematic,PCB layout都选择默…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
