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

网络原理-三

一、连接管理

建立连接,断开连接

建立连接,TCP有连接的.

客户端执行  socket = new Socket(SeverIP,severPort);   ->   这个操作就是在建立连接.

上述只是调用socket api,真正建立连接的过程,实在操作系统内核完成的.

内核是怎样完成上述的 " 建立连接 "过程的呢?

称为 " 三次握手 ",此处谈到的连接, "虚拟的,抽象的,"连接,目的是让通信双方都能保存对方的信息.

客户端是主动的一方,第一次交互一定是由客户端发起的.

所谓syn是一个特殊的TCP数据报,

1. 没有载荷,不会携带应用层数据

2. 六个标志位中的第五位,为1.

表示想和对方建立连接.

虽然syn不带有应用层载荷,但是也会带有IP报头,以太网数据帧...更会有TCP报头.

TCP报头中,就包含了客户端自己的端口.IP报头中就包含了客户端自己的IP

上述流程中有四次交互,但实际过程中,有两次交互可以合二为一,最终就形成了 " 三次握手 "

所谓的建立连接过程,本质上就是通信双方各自给对方发送一个syn,各自给对方回应一个ack.

虽然第一次握手,客户端已经把自己的信息告诉服务器了.但是服务器具体是否要确定存储这个信息,还得再观望,等到所有的握手环节结束,服务器才会最终保存客户端的相关信息.

上述过程中,有两次可以合二为一.

syn就是第五位为1,ack就是第二位为1.

完全可以有一个数据包,第二位和第五位都是1,这个数据包就能同时起到两个作用.

网络传输过程中,要涉及到多次的封装 和 分用

两个包就封装分用两次,合并成一个包,就可以减少一次封装分用的过程,整体效率就提高了,成本就降低了.

二、三次握手的意义

1. 三次握手,可以针对通信路径,进行投石问路,初步的确认一下通信链路是否通畅,

2. 三次握手,也是在验证通信双方,发送能力和接收能力是否正常.

3. 三次握手的过程中也会协商一些必要的参数,通信是客户端服务器两方的事情,要配合,其中的有些内容要保持一致.

TCP中也是有很多参数要进行协商的,往往是以 " 选项 " 部分来体现的.

选项 : 最少0字节,最多40字节(TCP报头总长最多60,去掉前面固定的20,还剩下40.

其中有一个信息是挺关键的,TCP通信的序号,起始值.

TCP一次通信的过程中,序号不是从0或者1开始的,而是先选择一个比较大的数字,以这个数字的开头来计算

即使是同一个客户端和服务器,每次连接,开始的序号都是不同的.

如上图

在网络通信过程中,是有可能会后发先至的,这就有可能导致第一次连接的数据,再断开连接,第二次连接建立的时候才到达.

而每次开始的序号不同,就可以让客户端服务器鉴别出不是本次通信的数据.

三、四次挥手

断开连接,四次挥手->  正常情况下        (   断开连接不一定是四次挥手)

连接本质上就是让通信双方保存对方的信息

每个客户端/服务器,都要保存很多的对端信息.

一旦多了,就需要使用 " 数据结构 " 

断开连接的本质目的,就是为了把对端的信息,从数据结构中给删除掉/释放掉.

fin=>finish( 结束 )

四次挥手,不一定非得是客户端先发fin,服务器也可能先发fin.

调用socket.close()就会触发FIN(FIN也是由系统内核完成的)

如果进程直接结束,也会触发FIN

四、状态的切换

连接管理过程中,涉及到了TCP状态的切换.

状态描述的是某个实体,现在在干嘛.

TCP服务器和客户端都要有一定的数据结构来保存这个连接信息.

在这个数据结构中其中就有一个属性叫做 " 状态 "

操作系统内核根据状态的不同,决定当前应该干什么.

LISTEN状态:表示服务器这边创建好serverSocket了,并且绑定端口号完成了.

ESTABLISHED:已确定的,客户端和服务器连接已经建立完毕,(三次握手完成了)

CLOSE_WAIT:接下来代码中需要调用close来主动发起FIN   (   收到FIN进入这个状态)

TIME_WAIT:表示本端给对方发起FIN之后,对端也要给我发FIN,此时本段进入TIME_WAIT给最后一个ACK的重传留有一定的时间.   (   主动断开连接,发送FIN进入这个状态   )

如果发现服务器上出现大量CLOSE_WAIT,可能是代码中忘记关闭socket.

TIME_WAIT存在的意义,主要是防止最后一个ACK丢包.

如果服务器没有收到最后一个ACK,就会进行重传.

TIME_WAIT也不会无休止的等待,他也有一个时间上限.

五、滑动窗口

滑动窗口,是TCP中非常有特点的机制.

确认应答,超时重传,连接管理  => 可靠传输

可靠传输,其实付出了代价 -> 传输效率,单位时间,能传输的数据量变少了.

确认应答机制,每次发送方收到一个ACK才会发送下一个数据,这使得消耗大量的时间来等待ACK,此处消耗的时间是非常多的.

滑动窗口的提出,就是为了解决这种问题,滑动窗口可以保证可靠传输的基础上,提高效率,虽然通过这个机制提高,但是效率不可能高于UDP这种不需要可靠性的.但是比什么都不做有所提升.

引入了滑动窗口,批量传输.把多次请求的等待时间,使用同一份时间来等,减少了总等待时间.

1001到5001,这四分数据已经批量传出去了,传输出这四份数据之后,就等待ack,暂时先不传了.

就把白色的区域称为 " 窗口大小 "

批量发送了四个数据,就会对应四个ACK,此时四个ACK的到达顺序也不一定是同时到达,而是有先有后.

这时候就等待ACK,接收到一个ACK就再发送一个数据.

这种发送/返回ACK的速度都很快,直观上就感觉像是滑动的效果.

所以上述的过程就被称为了滑动窗口.

如果滑动窗口中出现丢包,滑动窗口会怎么样呢?

1. ACK丢了

比如说,数据都收到了,但是1001的ACK丢了,但是2001的ACK没丢,这时候不会有什么影响.

因为2001的ACK就包含了1001ACK的内容,告诉另一方1001之前的内容也收到了.

2. 数据丢了

数据丢了,不然要进行重传.

比如,如果说1001的数据丢了,那么后面发送的ACK都会从1001开始,告诉另一方1001到2000的数据丢了,还没有收到.

在上述重传的过程中,整体的效率是非常高的,这里的重传做到了 " 针对性" 的重传,哪个丢了就重传哪个,已经收到的数据,是不必重复发送的.

整体效率没有额外损失的,就把这种重传称为 " 快速重传 ".

确认应答    超时重传    滑动窗口   快速重传   并不冲突,而且是同时存在的.

如果当前传输过程是按照滑动窗口,就按照快速重传保证可靠性,此时判定丢包的标准就是看连续有多个ACK索要同一个数据.

如果当前传输过程不是按照滑动窗口,此时仍然按照超时重传保证可靠性,此时判定丢包的标准是达到超时时间还没有ACK到达.

滑动窗口中也有确认答应,只不过,把等待策略稍作调整,转成批量的了.

批量的前提是,短时间内发送了很多.

如果数据太少,此时窗口滑动不起来,就退化成了确认应答.

六、流量控制

通过滑动窗口可以提高传输效率,窗口大小越大,更多的数据服用同一块时间等待,效率就更高.

( 批量传多少数据不需要等待ACK,此时数据的量就称为 " 窗口大小 "

窗口大小不能无限大,数据发送的速度不能无限大,接收方的缓冲区是有大小的,缓冲区如果满了,就会发生丢包的情况.

就好像一个蓄水池一样,当蓄水速度超过放水速度,就有可能倒是水池满了

所以速度太快就会导致缓冲区被填满,导致丢包.如果缓冲区满了,丢的包就算重传也没有,反而会浪费硬件资源.

与其让接收方满了,你不发,不如提前感知到就减慢速度,让发送方发送的速度和接收方处理数据的速度能一致.

就是让接收方反过来控制发送方的速度.

通过这个字段来个发送方反馈发送速度.

这个字段再普通报文中无意义,再ACK报文中才有意义.

通过这个大小反馈给发送方接下来要发送的窗口设置成多少合适.

接收方就会按照自己接收缓冲区剩余空间的大小,作为ACK中的窗口大小的数值,下一步发送方就会根据这个数值来调整自己的窗口大小.

这个16位窗口,大小是否就是64位?

TCP报头的选项中,还包含了一个参数,叫做窗口扩展因子.

实际上要设置的窗口大小是16位窗口大小*2^窗口扩展因子.

相关文章:

网络原理-三

一、连接管理 建立连接,断开连接 建立连接,TCP有连接的. 客户端执行 socket new Socket(SeverIP,severPort); -> 这个操作就是在建立连接. 上述只是调用socket api,真正建立连接的过程,实在操作系统内核完成的. 内核是怎样完成上述的 " 建立连接 "过程的…...

使用Ollama搭建一个免费的聊天机器人

0 概述 Ollama是一个能在本机运行大语言模型的软件,它提供命令行和API的交互方式,对于需要考虑数据隐私的情景,可以方便的使用Ollama部署大语言模型,并在此基础上开发RAG等应用,而无需调用OpenAI等开放API。Ollama基本…...

计算机网络之快重传和快恢复以及TCP连接与释放的握手

快重传和快恢复 快重传可以让发送方尽早得知丢失消息, 当发送消息M1,M2,M3,M4,M5后,假如消息M2丢失,那么按照算法会发送对M2报文前一个报文M1的重复确认(M1正常接受到,已经发送了确认),然后之后收到M4,M5,也会发送两…...

vue 引用第三方库 Swpier轮播图

本文全程干货,没有废话 1.使用 npm 安装 swiper,使用 save 保存到 packjson 中 npm install --save swiper 2、把 swiper看成是第三方库或者是组件,然后按照,引用,挂载组件,使用组件三步法。 3、在 script…...

RabbitMQ-直连交换机(direct)使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 目录 1、概述 2、直连交换机 3、多重绑定 4、具体代码实现 4.1 生产者部分 4.2 消费者部分 5、运行代码 6、总结 1、概述 直连交换机,可以实现类似路由的功能,消息从交换机发送到哪个队列…...

942. 增减字符串匹配 - 力扣

1. 题目 由范围 [0,n] 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s &#xff0c;其中: 如果 perm[i] < perm[i 1] &#xff0c;那么 s[i] I 如果 perm[i] > perm[i 1] &#xff0c;那么 s[i] D 给定一个字符串 s &#xff0c;重构排列 pe…...

2024华为OD机试真题-机器人搬砖-C++(C卷D卷)

题目描述 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头, 要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格, 机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损…...

【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景

目录 一、核心功能 二、优势 三、核心概念 四、工作原理 五、交换机类型 六、消息确认 七、持久性和可靠性 八、插件和扩展 九、集群和镜像队列 十、客户端库 十一、管理界面 十二、应用场景 RabbitMQ是一个基于AMQP协议的消息队列中间件&#xff0c;提供高可用、可…...

Mysql 技术实战篇

命令行 导出 - -h localhost&#xff1a;指定MySQL服务器的主机地址为本地主机。如果MySQL服务器在其他主机上&#xff0c;请将localhost替换为相应的主机地址。 - -u username&#xff1a;指定连接MySQL服务器的用户名。将username替换为您的有效用户名。 - -p&#xff1a;提…...

App自动化测试_Python+Appium使用手册

一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;支持模拟器和真机上的原生应用、混合应用、Web应用&#xff1b;基于Selenium二次开发&#xff0c;Appium支持Selenium WebDriver支持的所有语言&#xff08;java、 Object-C 、 JavaScript 、p hp、 Python等&am…...

k8s-部署对象存储minio

环境信息 minio版本 :最新 k8s 版本1.22 使用nfs作为共享存储 一.单节点安装包部署 脚本部署&#xff0c;一键部署&#xff0c;单节点应用于数据量小&#xff0c;一些缓存存储&#xff0c;比如gitlab-runner的产物数据&#xff0c;maven的打包依赖数据 #!/bin/bash# 步骤…...

go常用命令

创建一个module(逻辑概念) #The go mod init command initializes and writes a new go.mod file in the current directory, in effect creating #a new module rooted at the current directory. #specify a module path that serves as the module’s name. go mod initclon…...

【中年危机】程序猿自救指南

中年危机&#xff0c;一个听起来就充满挑战的词汇&#xff0c;它不仅仅是一个年龄的标记&#xff0c;更是一个个人成长和职业发展的转折点。 构架个人品牌&#xff1a; 学会打造IP个人品牌是职业生涯中的重要资产。在中年时期&#xff0c;你已经积累了丰富的经验和知识&#x…...

vueRouter路由总结

https://blog.csdn.net/qq_24767091/article/details/119326884...

算法工程师需要学习C++的哪些知识?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;以下是算法工程师需要学习的一些…...

CTF网络安全大赛简单的web抓包题目:HEADache

题目来源于&#xff1a;bugku 题目难度&#xff1a;简单 题目 描  述: > Wanna learn about some types of headache? > Lets dig right into it! 下面是题目源代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"&…...

Qt Creator创建Python界面工程并打包为可执行exe文件

Qt Creator创建Python界面工程并打包为可执行exe文件_qtcreator创建python工程-CSDN博客...

基于单片机的步进电机控制系统的研究

摘要: 步进电机控制作为一种电机控制系统的重要模式,属于现代数字化控制的重要手段,其应用已经相当广泛。步进电机属于感应电机类,利用电子电路将直流电分为分时供电、多相时序供电控制电流,利用这种电流为电机供电,驱使电机工作。步进电机不能够在常规模式下使用,必须通过双环…...

BioPorto胰高血糖素样肽-1抗体(GLP-1)

丹麦BioPorto Diadnostics公司致力于提供世界领先的GLP-1抗体。基于结合GLP-1位点的不同&#xff0c;他们筛选出了不同的抗GLP-1抗体。有的抗体可以同时结合GLP-1的活性形式和非活性形式&#xff0c;有的专门结合生物活性形式的GLP-1。在开发和检测GLP-1相关治疗的过程中&#…...

Go 语言字符串及 strings 和 strconv 包

在 Go 语言编程中&#xff0c;字符串是最基本、最常用的数据类型之一。无论是处理用户输入、读取文件内容&#xff0c;还是生成输出&#xff0c;字符串操作无处不在。为了方便开发者对字符串进行各种操作&#xff0c;Go 语言提供了强大的 strings 包和 strconv 包。strings 包包…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...