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

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开发微信小程序过程中&#xff0c;遇到了时间轴布局&#xff0c;由于每项的内容高度不一致&#xff0c;使用uniapp自带的扩展组件uni-steps&#xff0c;样式布局无法对齐竖线&#xff0c;于是自己造轮子&#xff0c;完成特殊的布局。显示效果如下&#xff1…...

深入浅出 栈和队列(附加循环队列、双端队列)

栈和队列 一、栈 概念与特性二、Stack 集合类及模拟实现1、Java集合中的 Stack2、Stack 模拟实现 三、栈、虚拟机栈、栈帧有什么区别&#xff1f;四、队列 概念与特性五、Queue集合类及模拟实现1、Queue的底层结构&#xff08;1&#xff09;顺序结构&#xff08;2&#xff09;链…...

前端基础(二)

前言&#xff1a;前端开发框架——Vue框架学习。 准备工作&#xff1a;添加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&#xff08;Simultaneous Localization and Mapping&#xff09;系统&#xff0c;它能够从单个、双目或RBG…...

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一个通配符&#xff08;*&#xff09;或一个占位符&#xff08;:&#xff09;来捕获 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-数据结构-数组、矩阵、广义表

数组、矩阵、广义表 目录 数组、矩阵、广义表 一、数组 二.矩阵 三、广义表 一、数组 这一章节理解基本概念即可。数组要看清其实下标是多少&#xff0c;并且二维数组&#xff0c;存取数据&#xff0c;要先看清楚是按照行存还是按列存&#xff0c;按行则是正常一行一行的去读…...

Idea 反编译jar包

实际项目中&#xff0c;有时候会需要更改jar包源码来达到业务需求&#xff0c;本文章将介绍一下如何通过Idea来进行jar反编译 1、Idea安装decompiler插件 2、找到decompiler插件文件夹 decompiler插件文件夹路径为&#xff1a;idea安装路径/plugins/java-decompiler/lib 3、…...

【Git】安装以及基本操作

目录 一、初识Git二、 在Linux底下安装Git一&#xff09;centOS二&#xff09;Ubuntu 三、 Git基本操作一&#xff09; 创建本地仓库二&#xff09;配置本地仓库三&#xff09;认识工作区、暂存区、版本库四&#xff09;添加文件五&#xff09;查看.git文件六&#xff09;修改文…...

Spring创建Bean的过程(2)

上一节介绍了Spring创建过程中的两个重要的接口&#xff0c;那么它们在创建Bean的过程中起到了什么作用呢&#xff1f;接下来请看&#xff1a; Spring有三种方式寻找 xml 配置文件&#xff0c;根据 xml 文件内容来构建 ApplicationContext&#xff0c;分别为ClassPathXmlAppli…...

Linux 终端操作命令(2)内部命令

Linux 终端操作命令 也称Shell命令&#xff0c;是用户与操作系统内核进行交互的命令解释器&#xff0c;它接收用户输入的命令并将其传递给操作系统进行执行&#xff0c;可分为内部命令和外部命令。内部命令是Shell程序的一部分&#xff0c;而外部命令是独立于Shell的可执行程序…...

【Git】大大大问题之syntax error near unexpected token `(‘ 的错误解决办法

话不多说&#xff0c;先上图&#xff1a; 如图&#xff0c;因为在linux环境里&#xff0c;文件路径中含有括号&#xff08;&#xff09;&#xff0c;因此报错&#xff01; 解决办法 等同于 &#xff1a;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 &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 思路一&#xff1a;回溯 void backtracking(int* nums, int numsSize, int** res, int* ret…...

Skywalking-9.6.0系列之本地源码编译并启动

Skywalking相信有很多人使用过&#xff0c;通过容器或者下载安装包进行安装的&#xff0c;今天从源代码角度&#xff0c;拉取、构建、启动。 官方文档步骤简洁明了&#xff0c;我这边会结合自己遇到的一些问题做出总结。 当前构建资源版本&#xff1a; MAC 10.15.7IDEA 2021.…...

proteus结合keil-arm编译器构建STM32单片机项目进行仿真

proteus是可以直接创建设计图和源码的&#xff0c;但是源码编译它需要借助keil-arm编译器&#xff0c;也就是我们安装keil-mdk之后自带的编译器。 下面给出一个完整的示例&#xff0c;主要是做一个LED灯闪烁的效果。 新建工程指定路径&#xff0c;Schematic,PCB layout都选择默…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...