【网络】传输层协议TCP
目录
四位首部长度
序号
捎带应答
标记位
超时重传机制
连接管理机制(RST标记位)
三次握手及四次挥手的原因
TCP的全称是传输控制协议(Transmission Control Protocol),也就是说,对于放到TCP发送缓冲区中的数据,如何发,什么时候发,出错了怎么办,这些都是有TCP协议控制的
下面是TCP报文的基本格式
标准报头是20个字节,并且在传输层,并不会像我们在应用层一样还需要序列化,传输层直接发送的就是结构化的数据,因为这样发送成本是最低的,发送带宽最小。那它不是会有跨平台,大小端的问题吗?Linux内核中对它进行了处理:
不同的客户端都同时可以基于TCP协议向服务器发送信息,那么OS中就会存在很多收到的报文,这些报文可能正在网络层或数据链路层中,还没有拷贝到传输层的接收缓冲区,可能就在缓冲区中,还没来的及处理,总之各种情况
那么OS就要对大量的已经收到的,但是暂未处理的报文进行管理,如何管理呢?先描述再组织
而描述这种报文的结构体就叫做struct sk_buffer,它里面存有指针,就指向存着报文的内存空间,对于每层协议来说,报头在前面,正文在后面,我们如果要剥离报头,只需要指针向后移动一定的字节数即可,添加报头就是向前移动。所以封装与解包本质就是指针移动,然后进行一定操作
四位首部长度
那下面来解释一下TCP报文中的4位首部长度:
这个长度指的是报头的20个字节加上选项的长度,并且基本单位是为4字节
也就是说4位能表示的最大数字是15,即报头+选项的最大长度是15*4=60字节,选项的范围是[0,40]
我们都说TCP协议是可靠的,它保证可靠性,具体体现是什么呢?
因为我们发到网络中的消息,我们根本不知道它去了哪里,我们如果想知道它有没有被对方收到,就只能看有没有收到应答
所以我们可以确定的是如果我收到应答,那么我发的消息对方肯定收到了。这依靠的就是确认应答机制:我收到了消息就要应答
所以可靠性是指:我能知道对方收到了我发的消息,同时我也得知道对方没收到我发的消息
发送数据和应答这些细节其实都是双方OS完成的,这也就是“传输控制协议”中“控制”的一个体现
序号
我们发送数据可以串行发,也就是发送一条等应答,然后再发下一条等应答……,但是这样效率太慢了
我们可以一次发多条,但是问题就来了,对方也给我很多应答,那如果有一条消息对方没收到,那我怎么知道是那一条消息呢?并且对方怎么判断那条消息在前,那条消息在后呢?(因为我的发送顺序并不一定是对方的接收顺序)
这个问题的解决方法就是报头中的序号,我们可以给消息带序号,对方收到了一堆消息也可以通过排序序号来知道我发的消息的顺序,然后再按顺寻处理数据即可,所以应答就要把确认序号带上,这个确认序号一般是发来消息的序号+1
确认序号的含义就是该确认序号之前的数据,对方已经全部收到了,下次发送请从确认序号开始
我们知道TCP是有发送缓冲区,并且TCP是面向字节流的,其实我们可以把这个缓冲区看成一个一定长度的char数组,那么缓冲区中每个字节其实都有自己的序号,这个序号就是下标,确认序号我们前面说就是发来的报头中的序号+1,那么新的序号其实就是确认序号+我要发送的报文的长度
捎带应答
TCP是支持全双工的,既要向对方发送消息,也要向对方发送应答,所以需要序号和确认序号两个
如果只发应答,只需要发一个报头(报头中添加确认序号)即可,那么我可不可以发送一个报文,其中既有应答(确认序号),又有我想给对方发的数据(序号和正文)呢?当然可以,我们叫做捎带应答
标记位
下面我们来解释TCP报头中的标志位:
为什么要有标志位呢?其实就是区分不同的TCP报文类型
就比如我们知道基于TCP通信时,客户端要connect服务器,这是发的报文就是建立连接的报文,同时还有正常通信的报文,还有close时断开连接的报文等等,这些报文类型都不同,那么为了区分这些报文类型,就有了标志位
下面我们简单通过三次握手这个过程来介绍三个标记位:ACK(确认标记位),SYN(同步标记位),FIN(断开连接标记位)
这个过程是我们在客户端调用connect后OS自动完成的,首先客户端向服务器发送带SYN标记位(即将此位 置为1)的报头,服务器收到后向客户端发送SYN+ACK的报头,客户端收到后向服务器发送ACK的报头,至此三次握手成功后服务器accept获取连接。我们将服务器置为监听状态是因为只有listen状态的服务器才能受理SYN的请求
双方建立好连接之后是要对这个连接进行管理的,用内核数据结构去管理,,这样就会消耗内存空间和时间。所以说维护连接是有成本的
下面是四次挥手的大致过程:这个过程也是OS自动完成的
先调用close的一方(A)要向对方发送FIN请求,对方(B)收到后会发送ACK,之后B会发送FIN请求,A收到后发送ACK
超时重传机制
这个机制其实在报头中是没有体现的,当我们向对方发送请求时,如果我们迟迟都收不到应答,我们只能主观的认为对方没收到数据(也有可能收到了,只不过对方的ACK可能没发过来,我们肯定要按最差情况处理),此时,我们就认为超时了,我们需要重传。
也就是说,如果我们发送的请求在一个时间段内都没有收到应答,就要触发超时重传机制。
那万一对方收到了呢?只不过是ACK没发过来,因为报头中是有序号的,对方可以根据这个序号进行去重
上面说一个时间段内,那这是多少时间呢?
因为网络的状态是动态的,TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个超时时间
Linux,超时以500ms为一个单位进行控制,等待时间以此是1*500,2*500,4*500,这样以指数形式递增,累积到一定的重传次数,TCP就会认为网络或对端主机出现异常,强制关闭连接
连接管理机制(RST标记位)
有这样一种情况,就是三次握手的第三次ACK发送之后丢掉了,这时客户端已经认为建立好连接了,但是服务器却没有建立好连接。
此时客户端都可以向服务器发送数据了,此时服务器因为没有建立好连接但是收到了数据,此时就会向客户端发送带有RST标记位的报头来表示reset(重置),即重新进行三次握手
所以RST这个标记位就是用来解决建立连接出现异常的问题的
三次握手及四次挥手的原因
三次握手:
如果一次就可以握手,那太扯了,因为客户端连应答都没有收到,连最基本的网络连通性都无法确认
两次的话服务器是比客户端先建立连接的,维护连接是有成本的,如果客户端是恶意连接的,疯狂发送SYN请求(SYN洪水攻击),那么服务器资源就会被浪费,从而导致真正想连接的用户无法连接
所以三次握手就是因为:
1.需要保证网络(信道)是健康的,三次握手,客户端服务器双方都会有一次确定的收发,他们就可以确认是全双工
2.确保双方OS是健康且愿意通信的
四次挥手:
它的原因其实和三次握手是一样的,关键就是四次挥手没有进行捎带应答,因为虽然比如客户端关闭连接,但是服务器还有消息要发。那么此时用户如何拿取数据呢?
首先一般应用层代码是有逻辑的,一般按照协议收完消息后才会close;其次,其实我们可以仅关闭写端,不关闭读端,是有这样的接口的
如果选项是SHUT_RDWR,就相当于close
相关文章:

【网络】传输层协议TCP
目录 四位首部长度 序号 捎带应答 标记位 超时重传机制 连接管理机制(RST标记位) 三次握手及四次挥手的原因 TCP的全称是传输控制协议(Transmission Control Protocol),也就是说,对于放到TCP发送缓冲…...

00-开发环境 MPLAB IDE 配置
MPLAB IDE V8.83 File 菜单简介 New (CtrlN): 创建一个新文件,用于编写新的代码。 Add New File to Project...: 将新文件添加到当前项目中。 Open... (CtrlO): 打开现有文件。 Close (CtrlE): 关闭当前打开的文件。 …...

<meta property=“og:type“ content=“website“>
<meta property"og:type" content"website"> 这段代码是HTML中的一部分,具体来说,它是一个用于定义Open Graph协议的meta标签。 代码分析 <meta> 标签:这是一个HTML标签,用于在HTML文档的头…...

C++ 实现俄罗斯方块游戏
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

QT打包Macosx应用发布App Store简易流程
1、QC里编译工程,生成Release版的的app文件; 2、运行macdeployqt把需要的文件打包进app文件中; % ~/Qt/5.15.0/clang_64/bin/macdeployqt {编译的app文件所在路径}/Release/xxxx.app 3、使用codesign对app进行签名,如果要发App…...

untiy mlagents 飞机大战 ai训练
前言 之前那个python源码的飞机大战bug过多,还卡顿,难以继续训练。可直接放弃的话又不甘心,所以找了个unity版本的飞机大战继续(终于不卡了),这次直接使用现成的mlagents库。 过程 前前后后花了两周时间,甚至因此拖…...

从0开始学统计-什么是中心极限定理
引言 中心极限定理(Central Limit Theorem, CLT)是统计学中的一块基石,它揭示了一个难以置信的数学现象:无论一个随机变量的原始分布如何,只要我们取足够大的样本量,这些样本的平均值(或总和&a…...

工具方法 - 个人活动的分类
人类活动的分类是一个复杂的话题,因为人类的活动范围非常广泛且相互交叉。然而,我们可以尝试将人类的活动大致分为以下几个主要类别: 工作活动 工作活动是人类生活中不可或缺的一部分,通常包括以下方面: 1. 职业工作&a…...

11.1组会汇报-基于区块链的安全多方计算研究现状与展望
基础知识 *1.背书,这个词源来自银行票据业务,是指票据转让时,原持有人在票据背面加盖自己的印鉴,证明该票据真实有效、如果有问题就可以找原持有人。 区块链中的背书就好理解了。可以简单的理解为验证交易并声明此交易合法&…...

ubuntu【桌面】 配置NAT模式固定IP
DHCP分配导致虚拟机IP老变,SSH老要重新配置,设成静态方便些 一、设NAT模式 1、设为NAT模式 2、看模式对应的虚拟网卡 - VMnet8 3、共享主机网卡网络到虚拟网卡 - VMnet8 二、为虚拟网卡设置静态IP 记住这个IP 三、设置ubuntu固定IP 1、关闭DHCP并…...

评估 机器学习 回归模型 的性能和准确度
回归 是一种常用的预测模型,用于预测一个连续因变量和一个或多个自变量之间的关系。 那么,最后评估 回归模型 的性能和准确度非常重要,可以帮助我们判断模型是否有效并进行改进。 接下来,和大家分享如何评估 回归模型 的性能和准…...

如何下载安装TestLink?
一、下载TestLink、XAMPP TestLink 下载 |SourceForge.net 备用:GitHub - TestLinkOpenSourceTRMS/testlink-code: TestLink开源测试和需求管理系统 下载XAMPP: Download XAMPP 注意:TestLink与PHP版本有关系,所以XA…...

基于SSM+微信小程序的订餐管理系统(点餐2)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…...

【C++排序 双指针】1996. 游戏中弱角色的数量|1996
本文涉及的基础知识点 排序 C算法:滑动窗口及双指针总结 本题其它解法 【C单调栈 排序】1996. 游戏中弱角色的数量|1996 LeetCode1996. 游戏中弱角色的数量 你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个…...

GESP4级考试语法知识(捕捉异常)
参考程序代码: #include <iostream> using namespace std;double divide(double a, double b) {if (b 0) {throw "Division by zero error"; // 抛出异常}return a / b; }int main() {double num1, num2;cout << "Enter two numbers:…...

HTML 基础标签——元数据标签 <meta>
文章目录 1. `<meta>` 标签概述2. 属性详解2.1 `charset` 属性2.2 `name` 属性2.3 `content` 属性2.4 `http-equiv` 属性3. 其他常见属性小结在 HTML 文档中,元数据标签 <meta> 是一种重要的标签,用于提供关于文档的信息,这些信息不直接显示在网页内容中,但对于…...

栈虚拟机和寄存器虚拟机,有什么不同?
本来这节内容是打算直接讲字节码指令的,但讲之前又必须得先讲指令集架构,而指令集架构又分为两种,一种是基于栈的,一种是基于寄存器的。 那不妨我们这节就单独来讲讲栈虚拟机和寄存器虚拟机,它们有什么不同࿰…...

Windows下基于fping进行批量IP测试
fping是Linux下一个很好用的IP测试工具,结合代码可以完成批量的IP测试,在网络调试中用途很广。本文是基于fping for Windows结合bat批处理,定制的测试脚本样例。 一、程序信息 本次测试使用fpingV5.1 for Windows版,版本信息如下…...

一款实用的Word文档图片转换与水印保护工具
目录 前言软件功能简介软件实现方法及关键代码 1. Word 文档转图片的实现2. 图片水印添加功能3. 生成数字指纹(哈希值)4. 保存图片信息到 JSON 文件 软件的实际使用场景软件操作指南 1. 下载和安装2. 操作流程 总结 1,前言 在日常办公和内…...

优化用于传感应用的衬底集成波导技术
ANSYS HFSS 是一款功能强大的电磁仿真软件,支持为微流体生物传感器应用设计和分析衬底集成波导 (SIW) 技术。它为快速设计优化、材料选择、系统集成和虚拟原型制作提供了一个强大的平台。借助 ANSYS HFSS,研究人员和工程师可以高效…...

Java多态特性的向上转型
Java的多态特性通过向上转型来实现。向上转型指的是将子类对象赋值给父类引用变量的操作。这样做的好处是可以使用父类引用变量来调用子类对象的方法。 例如,有一个父类Animal和一个子类Dog,可以这样进行向上转型: Animal animal new Dog(…...

C++ 判断语句的深入解析
C 判断语句的深入解析 C 是一种广泛使用的编程语言,以其高效性和灵活性著称。在 C 中,判断语句是控制程序流程的关键组成部分,它们允许程序根据不同的条件执行不同的代码路径。本文将深入探讨 C 中的判断语句,包括 if、else if、…...

15分钟学 Go 第 33 天:项目结构
第33天:项目结构 目标:了解Go项目的典型结构 在Go语言的开发中,项目结构的合理性直接影响着代码的可维护性、可扩展性和团队协作效率。本篇文章将深入探讨Go语言的典型项目结构,并提供实际示例代码和相关的流程图。 一、Go项目…...

conda迁移虚拟环境路径
方法一:使用软连接 ln -s ~/Anaconda3/envs /new/path/envs 方法二:修改~/.condarc文件 1.打开~/.condarc文件 #添加下面参数 envs_dirs: - /newpath/anaconda3/envs pkgs_dirs: - /newpath/anaconda3/pkgs 2. source ~/.bashrc 3.查看是否成功con…...

(八)JavaWeb后端开发——Tomcat
目录 1.Web服务器概念 2.tomcat 1.Web服务器概念 服务器:安装了服务器软件的计算机服务器软件:接收用户的请求,处理请求,做出响应web服务器软件:在web服务器软件中,可以部署web项目,让用户通…...

yocto中通常不直接修改提供的recipes的bb文件
不直接在 Yocto 官方提供的 recipe 中修改 通常是创建新的 metadata 和 recipe 来配置相关软件编译等过程 主要有以下几个原因: 1. 便于维护和升级 隔离自定义修改:Yocto 官方的 recipe 可能会随着版本更新而变化。如果直接修改官方 recipe࿰…...

智能座舱相关术语全解及多模态交互在智能座舱中的应用
文章目录 座舱相关术语全解1. 智能座舱2. UFS3. 多模态交互4. 3D虚拟引擎5. AR/VR6. GNSS7. TTS8. DPU9. 摄像头10. 屏幕/显示器11. 音频12. 无线连接13. 其他组件 多模态交互在智能座舱中有以下一些应用 座舱相关术语全解 1. 智能座舱 智能座舱(intelligent cabi…...

【Fastjson反序列化漏洞:深入了解与防范】
一、Fastjson反序列化漏洞概述 Fastjson是一款高性能的Java语言JSON处理库,广泛应用于Web开发、数据交换等领域。然而,由于fastjson在解析JSON数据时存在安全漏洞,攻击者可以利用该漏洞执行任意代码,导致严重的安全威胁。 二、F…...

【OJ题解】C++实现反转字符串中的每个单词
💵个人主页: 起名字真南 💵个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 题目要求:给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 题目链接: 反转字符串中的所…...

万字长文详解Hive聚合函数 grouping sets、cube、rollup原理、语法、案例和优化
目录 原理与语法 使用场景 多维度报表生成 复杂的数据分析 实际案例 原理与语法 与GROUPINGSETS的区别 实际案例 原理与语法 与CUBE的对比 实际案例 执行效率比较 优化建议 Hive提供了三个强大的高级聚合函数: GROUPING SETS 、 CUBE 和 ROLLUP ,用于处理复杂的…...