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

网络基础二——TCP可靠性实现机制补充2

验证客户端和服务端三次握手和四次挥手时的状态

三次握手

#include <sys/types.h>        
#include <sys/socket.h>
int listen(int sockfd, int backlog);
netstat ntp
//查看连接的状态

​ 将TCP服务端套接字设置为listen状态之后,此时服务端是处于LISTEN状态的;服务端没有使用accept接口时,在收到客户端的连接请求时双方会经历3次握手,最终都处于ESTABLISHED状态;即连接的建立和accept没有关系,三次握手是双方操作系统自动完成的

​ 当listen的第二个参数设为一时,能建立全连接的连接数是2;操作系统会将没有被上层accept的连接管理起来,对它们先描述再组织,并且以队列的方式管理这些连接结构;三次握手时每次形成的连接本质上就是创建一个连接结构体对象并将其链入到队列当中,而accept就是从队列中将连接取走和特定的文件关联起来,返回特定的文件描述符;listen的第二个参数+1表示已经建立好的连接队列的最大长度,这个队列叫做全连接队列;accept和连接入队还有全连接队列构成了CP模型;服务端三次握手完成或者建立连接成功就将连接入队列,如果队列满了就无法入队列了,就会将连接状态设置为SYN_RECV状态,换句话说就是因为全连接队列满了,服务端将客户端发送过来的第三次握手应答报文直接丢弃了;

​ 如果服务端长时间无法得到应答就会释放掉SYN_RECV状态的连接,这种连接叫做半连接;半连接也需要进行管理,所以也会存在半连接队列,节点并不会长时间维持;

​ 这样就出现了客户端和服务器连接不一致的问题;服务端直接将应答丢弃,但是确实是收到了应答,所以第二次握手是可靠的,知道客户端建立连接成功了,并不会发送RST标志位;对于客户端建立连接成功了,但是发送数据不成功,就转而继续开始进行三次握手;

​ 大量建立半连接会导致真正地SYN洪水;服务器资源有限制不会挂掉,但是其他客户端就无法正常的访问了;

​ 全连接队列长度不可以太长,因为上层处理繁忙时,就无法保证将全连接队列获取完,而队列长度过长就会导致资源闲置,维护还要有成本,而且变相地减少了上层空间,降低了处理的效率;而队列的存在可以保证,半连接变成全连接和全连接被上层处理可以并发运行;所以一般全连接队列的长度一般要设置为10左右;

四次挥手

​ 当客户端关闭连接时,服务端的连接会处于CLOSE_WAIT状态,由于服务端不关闭连接,会维持此状态维持一段时间,直到关闭连接时,才会将此状态改为LAST_ACK,收到应答后关闭连接;

​ 主动关闭连接的一方最终会先处于TIME_WAIT状态(连接没有完全断开),一般维持60-120s的时长,这时候就不可以重新绑定端口号,因为连接没有完全断开意味着IP和端口号还在被使用,并且一个端口号只能绑定一个进程,所以重启服务会失败,得等待60-120s;对于一个服务器不可以立即重启会产生很大的损失,所以需要修改此状态,进行地址复用;

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);//将TIME_WAIT的IP和端口号复用;
//第一个参数是要被修改属性的套接字,第二个参数一般是SOL_SOCKET表示在套接字层,第三个参数表示操作名字,如:复用IP和端口号,第四个参数表示将选项设置为有效;
int opt = 1;
setsockopt(listensockfd_, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &opt, sizeof(opt));
//这样就可以重新建立好连接了

​ 客户端能够立即重连是因为使用的是系统分配的随机端口号,所以重连时的端口号与上一次不一样,就不会出现绑定失败的情况;

​ MSL:数据报在网络中最多存活的时长;

​ TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(maximum segment lifetime)的时间后才能回到CLOSED状态;MSL在RFC1122中规定为两分钟,但是各操作系统的实现不同, 在Centos7上默认配置的值是60s;可以通过 cat /proc/sys/net/ipv4/tcp_fin_timeout 查看msl的值;

​ 1.TIME_WAIT等待两个MSL时间是因为要让历史数据在网络中消散(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);序号一般是随机的,防止黑客的恶意攻击和历史保温的影响;

​ 2.让断开连接四次挥手具有较好的容错性;

最大存在时长不等于最大传送时长;还包括了异常的路由阻塞时间;一般TIME_WAIT时长为60-120秒;如果没有accept可能就会没有TIME_WAIT状态,直接关闭;

11.3.7流量控制

​ 流量控制不仅保证了可靠性,而且提高了效率;捎带应答也是保证可靠性并且提高效率;

​ 流量控制,发送方通过接收到接收方发送过来的报头(16位窗口大小)知道接收方接收缓冲区剩余空间的大小,进而调整发送速度;

​ 对于第一次发送数据报文时,也要保证发送的数据量是合理的;因为正式通信交换数据之前,要通过进行三次握手来可靠的建立连接,这期间是发送了报文的,通信双发都可以得知对方接收缓冲区的剩余空间大小,也可以携带16位窗口大小;

​ 第三次握手的时候其实是可以携带数据的,即可以是携带应答;

​ 当接收方的接收缓冲区写满了,发送发继续发送报文会产生丢包,为了大规模的减少这种问题,就需要进行流量控制;1.发送方会定期的向接收方发送窗口探测(仅仅是一个报头,不携带数据,所以丢失不会产生大影响),当发送方收到窗口探测应答,则说明有空间了或者接收端返回了上次数据报文的应答也可以说明有空间了;2.接收方会主动发送窗口更新消息(也是一种报头);

​ 以上两种方式一起使用选择最优的,一定程度上提高了效率,而且两种方式提高了容错性;

​ 如果两种方式是执行了一定次数后还没有成功就会认为网络异常并且关闭连接;

​ TCP窗口大小(接收缓冲区的大小)默认最大就是65535字节,但是可以配合TCP首部40字节的选项窗口扩大因子M使用,实际的窗口大小就是窗口字段的值左移M位,这还与操作系统实际提供多大的缓冲区有关;

11.3.8滑动窗口

​ 如果串行的发送数据报文加确认应答,确实可以保证可靠性,但是效率太低;所以除了控制使用串行的方式,常规都是使用并行的方式发送一批数据报文后才接受一批确认应答;没有收到应答就会使用超时重传机制;

​ 为了保证数据的可靠性需要在设置的特殊时间间隔里将大量的发送数据报文管理起来;这些数据报文本来就存在于发送缓冲区,没必要专门再拷贝一份的方式维护,只需要将发送缓冲区进行划分即可;

​ 可以简单地划分为三部分从左往右依次为已发送已确认区域,已发送未确认区域,待发送区域;对于已发送已确认的区域是可以被覆盖的;已发送未确认区域可以继续发送数据,即支持发送一批数据,如果没有收到应答就继续维护此数据,如果收到了应答就将此数据移动到已发送已确认区域,表示此数据已经被清理掉;已发送未确认区域就叫做滑动窗口

​ 滑动窗口是发送缓冲区的一部分;

​ 滑动窗口的数据是可以直接发送给接收方的,这样就可以一次性发送一批数据报文,等到接收到应答时,在将数据移动到另一个区域,不再维护;如果没有收到应答,就可以进行补发;

​ 滑动窗口的大小默认是接收方的16位窗口大小,但是还需要考虑到网络的情况;

​ 对于发送缓冲区区域的划分可以使用双指针的方式(数组下标)如:win_start,win_end,来划分成三个区域;维护发送缓冲区其实就是修改这些特殊下标缓冲区;

​ 收到确认就是应答就是将start右移,如果接收方的接收缓冲区变大了,就将end右移使得滑动窗口变大;这样的过程就像是在滑动;换句话说滑动的本质就是指针的右移;

​ 网络是不支持发送大块数据的,只能分段发送;

相关文章:

网络基础二——TCP可靠性实现机制补充2

验证客户端和服务端三次握手和四次挥手时的状态 三次握手 #include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog);netstat ntp //查看连接的状态​ 将TCP服务端套接字设置为listen状态之后&#xff0c;此时服务端是处于L…...

SSM项目实战——哈哈音乐(四)前台模块开发

1、项目准备 ①导入依赖和前端资源 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.x…...

Hadoop-入门

资料来源&#xff1a;尚硅谷-Hadoop 一、Hadoop 概述 1.1 Hadoop 是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop…...

HarmonyOS(鸿蒙)——单击事件

2.4 实现ClickedListener接口并重写onClick方法 2.5 实现onClick方法中的具体逻辑&#xff0c;以此完成点击事件的相关业务操作 三、测试 3.1 登录远程模拟器 3.2 运行项目 四、精选好文 一、简介 1.1 什么是组件 组件就是文本、按钮、图片等元素的统称 1.2 什么是事件 …...

c# wpf template itemtemplate+dataGrid

1.概要 2.代码 <Window x:Class"WpfApp2.Window8"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend…...

总结UDP协议各类知识点

前言 本篇博客博主将详细地介绍UDP有关知识点&#xff0c;坐好板凳发车啦~ 一.UDP特点 1.无连接 UDP传输的过程类似于发短信&#xff0c;知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b; 2.不可靠传输 没有任何的安全机制&#xff0c;发送端发…...

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 &#xff0c;而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…...

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录 1.前言2.mping工具编译3.mping工具使用3.1 参数说明3.1 组播播发&#xff08;-s&#xff09;3.1 组播播发&#xff08;-r&#xff09;3.3 Linux下mping测试 4.Linux组播udp_sender及udp_reciver使用4.1 udp_sender源码4.1 udp_reciver源码4.3 编译方法4.4 测试使用4.4…...

Linux基础篇:文件系统介绍——根目录下文件夹含义与作用介绍

Linux文件系统介绍——文件夹含义与作用 Linux文件系统是一个组织和管理文件的层次结构。它包括了目录、子目录和文件&#xff0c;这些都是按照一定的规则和标准进行组织的。以下是Linux文件系统的一些关键组成部分&#xff1a; 1./bin&#xff1a; 该目录包含了系统启动和运…...

vulhub中Apache Solr RemoteStreaming 文件读取与SSRF漏洞复现

Apache Solr 是一个开源的搜索服务器。在Apache Solr未开启认证的情况下&#xff0c;攻击者可直接构造特定请求开启特定配置&#xff0c;并最终造成SSRF或任意文件读取。 访问http://your-ip:8983即可查看Apache Solr后台 1.访问http://your-ip:8983/solr/admin/cores?indexI…...

PHP在线加密系统网站源码

源码介绍 PHP在线加密系统网站源码&#xff0c;这个是sg的加密,免费可用(目前)并不会收费 源码说明&#xff1a;下载直接上传即可 下载地址 蓝奏云下载&#xff1a;https://wfr.lanzout.com/i6c331togiji...

【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法

文章目录 前言位图什么是位图简单实现一个自己的位图位图的应用场景 布隆过滤器位图的缺陷及布隆过滤器的提出布隆过滤器的概念简单实现一个自己的布隆过滤器布隆过滤器的优缺点布隆过滤器的应用场景 海量数据处理 前言 哈希思想的在实际中的应用除了哈希表这个数据结构之外还…...

蓝桥杯(5):python动态规划DF[2:背包问题]

1 0-1背包介绍【每件物品只能拿1件或者不拿】 1.1 简介 贪心是不可以的&#xff01;&#xff01;&#xff01; 1.2 状态 及状态转移 转移解释&#xff1a;要么不选 则上一个直接转移过来【dp[i-1][j]】&#xff0c;要么是选这个之后体积为j 则上一个对应的就是【dp[i-1][j-wi]…...

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机&#xff1a;新零售时代的便捷消费革命 在新零售的浪潮中&#xff0c;智能无人售货机作为一个创新的消费模式&#xff0c;已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求&#xff0c;还能通过建立多样化和多层次的消费体…...

4月04日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 地震预警App被曝收10元年费&#xff0c;回应称仅限苹果系统 &#x1f30d; 2024清明档首日票房破2亿 &#x1f30b; 浙江省杭州市余杭区设立2亿元网络微短剧发展基金 &#x1f381; 抖音拟以超 7.5 亿元收购海联金汇旗下…...

C++数据结构——顺序表——数值统计

C数据结构——顺序表——数值统计 接着上一篇的顺序表模板。 输入数组&#xff0c;统计数组中的负数、零、正数的个数。第一个数字,表示数组有几个数,当n为0时&#xff0c;输入结束&#xff0c;不做处理。 例如&#xff1a; 输入6 0 1 2 3 -1 0 输出1 2 3 int main() {int n;…...

Linux+HA高可用24X7的安全保证

一&#xff0e; 介绍作为服务器&#xff0c;需要提供一定的24X7的安全保证&#xff0c;这样可以防止关键节点的宕机引起系统的全面崩溃。利用OpenSource开源软件&#xff0c;完成系统的高可靠双机热备方案。基于linux的 HA软件可靠稳定&#xff0c;比使用商业版本的HA软件降低成…...

【Tomcat】Apache官方结束Tomcat 8.5分支版本技术支持

根据 Apache 官方发布的声明&#xff0c;Apache官方将于2024年3月31日后正式结束对于Tomcat 8.5这个分支版本的技术支持&#xff0c;包括以下几点&#xff1a; 1&#xff09;不太可能继续为 8.5 分支发布新的版本&#xff1b; 2&#xff09;仅影响 8.5 分支的漏洞将不会被解决&…...

Go 源码之读写锁 sync.RWMutex

Go 源码之读写锁 sync.RWMutex 文章目录 Go 源码之读写锁 sync.RWMutex一、简介二、源码(一)RWMutex数据结构(二)Lock(三)Unlock(四)TryRLock(五)Rlock(六)RUnlock三、常见问题1. 什么是CAS,什么是原子操作2. 写操作是如何阻止写操作的3. 写操作是如何阻止读操作的…...

大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编程实践

大数据实验统计 1、Hadoop安装及使用&#xff1b; 一&#xff0e;实验内容 Hadoop安装使用&#xff1a; 1&#xff09;在PC机上以伪分布式模式安装Hadoop&#xff1b; 2&#xff09;访问Web界面查看Hadoop信息。 二&#xff0e;实验目的 1、熟悉Hadoop的安装流程。 2、…...

PyTorch搭建Informer实现长序列时间序列预测

目录 I. 前言II. InformerIII. 代码3.1 输入编码3.1.1 Token Embedding3.1.2 Positional Embedding3.1.3 Temporal Embedding 3.2 Encoder与Decoder IV. 实验 I. 前言 前面已经写了很多关于时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从i…...

firefox切换本地服务和全球服务的方法

方法1&#xff1a;“设置”>“同步">“切换全球/本地服务器” https://jingyan.baidu.com/article/1974b2898523bbb5b1f774e2.html 方法2&#xff1a;地址栏输入about:config&#xff0c;搜索首选项名称里输入identity.fxaccounts.autoconfig.uri&#xff0c;填入…...

Windows下用CMake编译PugiXML及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 PugiXML是什么&#xff1f; PugiXML 是一个用于解析和操作 XML 文档的 C 库。它提供了简单易用的接口&#xff0c;能够高效地加载…...

python-基础篇-字符串、列表、元祖、字典-列表

文章目录 2.3.2列表2.3.2.1列表介绍2.3.2.1.1列表的格式2.3.2.1.2打印列表 2.3.2.2列表的增删改查2.3.2.2.1列表的遍历2.3.2.2.1.1使用for循环2.3.2.2.1.2使用while循环 2.3.2.2.2添加元素("增"append, extend, insert)2.3.2.2.2.1append 2.3.2.2.2.2extend2.3.2.2.2…...

Qt控件样式设置其一(常见方法及优缺点)

如果你对Qt有基本的了解&#xff0c;应该知道它的一大优点是跨平台&#xff0c;可以在不同的系统中编译运行。但在我看来&#xff0c;Qt还有另外一个优点&#xff0c;就是制作界面比较方便和灵活&#xff0c;能够实现主流静态效果的桌面应用。&#xff08;如果需要实现比较灵动…...

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准&#xff1a; 用例表达清楚&#xff0c;无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…...

最优算法100例之33-字符串/数字的排列组合问题

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 字符串/数字的排列组合问题 void dfs(int deep){if(deep == n){//输出}for(int i = 0; i < n; i++){if(flag[i] == 0){d[d…...

Java面试题:请解释Java中的多线程编程?

Java中的多线程编程允许 concurrently 执行多个线程&#xff0c;从而可以同时执行多个任务&#xff0c;提高程序的效率和响应性。在Java中&#xff0c;线程可以通过以下两种主要方式来实现&#xff1a; 继承 Thread 类实现 Runnable 接口 继承 Thread 类 class MyThread ext…...

acwing算法提高之图论--最小生成树的扩展应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用最小生成树算法&#xff08;prim或kruskal&#xff09;解决的扩展题目。 2 训练 题目1&#xff1a;1146新的开始 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm>usin…...

政安晨:【Keras机器学习实践要点】(十七)—— 利用 EfficientNet 通过微调进行图像分类

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a; 使用 EfficientNet 和在图…...

wordpress 关键词 插件/网络推广网络营销外包

上一节主要介绍jdk和ssh的安装和配置&#xff0c;本节主要介绍Hadoop环境变量的配置 1Hadoop安装 1.1下载Hadoop安装包&#xff0c;本文以0.2版本为例 1.2把安装包放到home/lqy/Downloads目录下 1.3使用tar xvf hadoop-0.20.2.tar.gz解压安装包 2Hadoop文件配置 2.1配置had…...

php怎么做超链接到其他网站/长沙网络公司排名

目录导入excel文件Series对象创建一个Series对象手动设置Series索引Series的索引获取Series的索引和值DataFrame对象遍历DataFrame数据创建一个DataFrame对象导入外部数据导入.xls或.xlsx文件数据合并数据合并&#xff08;使用Merge方法&#xff09;数据合并&#xff08;使用Co…...

做网站开发想转行做医药销售/51外链代发网

关联引用概念 利用 OC 语言的动态性&#xff0c;借助运行时&#xff08;runtime&#xff09;的功能&#xff0c;我们可以为已存在的实例对象增加实例变量&#xff0c;这个功能叫做关联引用。 添加、检索和断开关联 objc_setAssociatedObject(id _Nonnull object, const void * …...

黔东南企业网站建设/网站交易

COM 的查看工具 OLE/COM Objects Viewer 注&#xff1a;使用时若提示找不到IViewers.dll可以下载从这里 下载该.dll - 参考 - http://www.mediamonkey.com/wiki/index.php/Scripting_Tips_&_Tricks...

做网站树立品牌形象/网页设计框架

今天有个小伙伴在群里问text为什么长度是0&#xff0c;会不会影响存数据失败&#xff0c;这里就有各个类型的详细说明TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT的区别:储存不区分大小写的字符数据TINYTEXT 最大长度是 255 (2^8 - 1) 个字符。TEXT 最大长度是 65535 (2^16 - 1) 个字…...

石家庄网站建设外贸/百度推广网页版

namespace Coldairarrow.Util {public class ErrorResult : AjaxResult{public ErrorResult(string msg "操作失败!", int errorCode 0){Msg msg;Success false;ErrorCode errorCode;}} }...