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

【网络】传输层协议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中的一部分&#xff0c;具体来说&#xff0c;它是一个用于定义Open Graph协议的meta标签。 代码分析 <meta> 标签&#xff1a;这是一个HTML标签&#xff0c;用于在HTML文档的头…...

C++ 实现俄罗斯方块游戏

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

QT打包Macosx应用发布App Store简易流程

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

untiy mlagents 飞机大战 ai训练

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

从0开始学统计-什么是中心极限定理

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

工具方法 - 个人活动的分类

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

11.1组会汇报-基于区块链的安全多方计算研究现状与展望

基础知识 *1.背书&#xff0c;这个词源来自银行票据业务&#xff0c;是指票据转让时&#xff0c;原持有人在票据背面加盖自己的印鉴&#xff0c;证明该票据真实有效、如果有问题就可以找原持有人。 区块链中的背书就好理解了。可以简单的理解为验证交易并声明此交易合法&…...

ubuntu【桌面】 配置NAT模式固定IP

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

评估 机器学习 回归模型 的性能和准确度

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

如何下载安装TestLink?

一、下载TestLink、XAMPP TestLink 下载 |SourceForge.net 备用&#xff1a;GitHub - TestLinkOpenSourceTRMS/testlink-code&#xff1a; TestLink开源测试和需求管理系统 下载XAMPP&#xff1a; Download XAMPP 注意&#xff1a;TestLink与PHP版本有关系&#xff0c;所以XA…...

基于SSM+微信小程序的订餐管理系统(点餐2)

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

【C++排序 双指针】1996. 游戏中弱角色的数量|1996

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

GESP4级考试语法知识(捕捉异常)

参考程序代码&#xff1a; #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> 是一种重要的标签,用于提供关于文档的信息,这些信息不直接显示在网页内容中,但对于…...

栈虚拟机和寄存器虚拟机,有什么不同?

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

Windows下基于fping进行批量IP测试

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

一款实用的Word文档图片转换与水印保护工具

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

优化用于传感应用的衬底集成波导技术

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

Java多态特性的向上转型

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

C++ 判断语句的深入解析

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

15分钟学 Go 第 33 天:项目结构

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

conda迁移虚拟环境路径

方法一&#xff1a;使用软连接 ln -s ~/Anaconda3/envs /new/path/envs 方法二&#xff1a;修改~/.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服务器概念 服务器&#xff1a;安装了服务器软件的计算机服务器软件&#xff1a;接收用户的请求&#xff0c;处理请求&#xff0c;做出响应web服务器软件&#xff1a;在web服务器软件中&#xff0c;可以部署web项目&#xff0c;让用户通…...

yocto中通常不直接修改提供的recipes的bb文件

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

智能座舱相关术语全解及多模态交互在智能座舱中的应用

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

【Fastjson反序列化漏洞:深入了解与防范】

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

【OJ题解】C++实现反转字符串中的每个单词

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

万字长文详解Hive聚合函数 grouping sets、cube、rollup原理、语法、案例和优化

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