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

news2025/1/16 22:01:25
11.3.4确认应答机制

​ 1.双方通信时要返回确认应答报文,保证对方发送的报文是有效的;尽管整个通信过程中无法保证数据全部可靠,但是可以保证单个方向发送的数据是可靠的;

​ 发送的报文要设置序号,如果是应答报文要设置确认序号;

11.3.5超时重传机制

​ 当报文超时或者丢包就要进行重传;丢包分为消息报文丢失和应答报文丢失;

​ 当一个报文发送出去且没有收到应答之间,这段时间是不知道报文是丢了还是还在发送的过程当中;所以必须要设置一段特殊的时间间隔,在时间间隔之内没有收到应答就认为丢包了,就进行报文重传,这种策略叫做超时重传;

​ 如果补发多次没有成功,主机就会判定网络出现了问题,连接自动断开;

​ 由于超时重传,所以接收方一定会收到多个相同的报文,导致数据不可靠,所以需要进行去重;使用序号就可以实现去重;

超时时间设置

​ 1.对于网络情况好就需要时间间隔要短;时间过长就需要等待很长的时间才重传,效率太慢;

​ 2.网络情况较差,如果设置的时间间隔较长,就会导致发一个报文就需要进行重传,产生大量的重复报文,需要进行大量的去重,使得重传和去重变成了一种负担;

​ 为了保证TCP通信的高性能,时间间隔的设置是动态的,与网络状况是有关的;Linux中超时以500ms为一个单位进行控制,每次超时重传的时间间隔都是500ms的整数倍;默认是500ms,如果重传一次之后仍然得不到应当,就等待2*500ms后再进行重传,还是得不到应答就等待4*50ms,以此类推,当达到某一重传次数时,本机的TCP就会认为网络或者对端主机出现了异常,然后断开连接;

11.3.6连接管理机制

​ TCP通信是基于连接的,在连接建立和断开的过程中会进行三次握手和四次挥手;

​ 三次握手和四次挥手的原因是,保证双方互相给对方发送消息的可靠性;其实本质上是每次发送过去的报文要保证可靠性,都要有一个应答;如果数据报文不完整,则会导致功能不完整,应答不完整就会导致数据不可靠,甚至导致报文重传还需要进行去重;

​ 是三次握手而不是四次握手是因为,通信的前提是双方都建立连接,一方建立连接另一方不建立是无意义的,所以双方都要同步的发起建立连接请求,使用捎带应答的方式提高了通信效率;而四次挥手不是三次挥手是因为,双方断开连接是需要协商的,是有时间差的;即一方完成了通信的需求,但是另一方还未完成,需要继续通信,就不可以断开连接,只有双方都完成了通信才可以断开连接,才可以使用捎带应答的方式实现"类似的三次握手",但是这种情况占少数,不采用这种方式;

三次握手的原因

​ 1.三次握手有效的保证了客户端和服务器各自至少进行了一次收和发并且是可靠的,测试了连接是否通畅;

​ 2.没有应答机制,会导致服务端直接建立连接并且承担风险,影响其他客户端;

​ 如果是一次握手并且一次握手就使得双方建立连接,客户端就会存在先建立连接,然后一直向服务端发送建立连接请求的(SYN洪水)情况,这时服务端就会建立一大批连接的结构体并管理起来,但是实际上只是用一个连接资源管理就可以了,这样就会导致资源的闲置和浪费;

​ 3.奇数次握手保证了,握手失败的连接成本嫁接到了客户端,而不是服务端接收风险,降低了对其他客户端的影响;使用三次握手使得保证可靠性的同时建立连接的成本最小;

​ 如果是两次握手,会存在服务端返回确认应答并建立连接,客户端收到应答建立连接;服务端先建立了连接,不管客户端是否异常都会默认维护连接一段时间;如果客户端异常断开了,那么这些连接实际上是无效的,无法进行通信的;因为服务器是一对多的,服务器出现了问题,所有的客户端就都不可以使用了,不应该让服务器来承担风险;三次握手保证了是让客户端先建立了连接,这样就让风险由客户端来承担,影响就减少了;

​ 其实TCP服务端在第一次握手的时候是会建立连接的,只不过叫做半连接;大量的客户端与服务端进行第一次握手时,就会将服务端的连接资源消耗殆尽;黑客可以使用恶意程序控制多台机器,定期领取任务向服务端发起第一次握手,这些机器就叫做肉机;所以一些企业实际上是会设计一些策略,对大流量的访问进行限流,防止服务器挂掉;

四次挥手的原因

​ 四次挥手保证双方都可以得知对方不发数据的意愿;如果只有一方关闭了连接而另一方并没有,其实连接是没有被关闭的,这时候另一方就可以继续发送完数据再进行关闭;此时对方就会收到数据,最后整个连接才是真正地关闭了;换句话说,关闭连接其实是不想发送数据了,就会将发送缓冲区关闭,但是接收缓冲区还在,所以还具有读的功能;

​ 四次挥手其实就是,双方互相协商,主动断开连接的一方会发送FIN,状态设为FIN_WAIT_1,服务端收到报文后,将状态设为CLOSE_WAIT并且发送ACK,客户端收到应答报文后,就会将发送缓冲区关闭,将状态置为FIN_WAIT_2不会发送数据只是发送应答报文,这时候服务端可以继续发送数据,如果服务端要关闭连接就会发送FIN并将状态置为LAST_ACK,客户端收到后将自身设置为TIME_WAIT状态(一段时间后自动设为CLOSED状态),返回应答报文,服务端接收到应答就会将自身设置为CLOSED状态;

在这里插入图片描述

11.3.7验证客户端和服务端三次握手和四次挥手时的状态
#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左右;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一、持续集成介绍

持续集成介绍 一、什么是持续集成二、持续集成的流程三、持续集成的组成要素四、持续集成的好处 一、什么是持续集成 持续集成&#xff08;CI&#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干。持续集成的目的&#xff0c;就是让产品可…

《Java面试自救指南》(专题二)计算机网络

文章目录 力推的计网神课get请求和post请求的区别在浏览器网址输入一个url后直到浏览器显示页面的过程常用状态码session 和 cookie的区别TCP的三次握手和四次挥手七层OSI模型&#xff08;TCP/IP协议模型&#xff09;各种io模型的知识http协议和tcp协议的区别https和http的区别…

理解pytorch的广播语义

目录 什么是广播运算 广播的条件 示例 示例1 示例2 示例3 补1 示例4 原位运算 示例5 参与广播运算的两个tensor&#xff0c;必须是从右向左对齐 总结规律 两个tensor可以做广播运算的条件&#xff1a; 两个可以互相广播的tensor运算的步骤&#xff1a; 例子&#x…

Java | Leetcode Java题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; class Solution {public int myAtoi(String str) {Automaton automaton new Automaton();int length str.length();for (int i 0; i < length; i) {automaton.get(str.charAt(i));}return (int) (automaton.sign * automaton.ans);} …

Scala第二十章节(Akka并发编程框架、Akka入门案例、Akka定时任务代码实现、两个进程间通信的案例以及简易版spark通信框架案例)

Scala第二十章节 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用工具包。Akka是…

MySQL 导入库/建表时/出现乱码

问题描述&#xff1a; 新建不久的项目在使用Navicat for MySQL进行查看数据&#xff0c;发现表中注释的部分乱码&#xff0c;但是项目中获取的数据使用不会。 猜测因为是数据库编码和项目中使用的不一样&#xff0c;又因为项目的连接语句定义了需要编码&#xff0c;故项目运行…

Golang实现一个聊天工具

简介 聊天工具作为实时通讯的必要工具&#xff0c;在现代互联网世界中扮演着重要的角色。本博客将指导如何使用 Golang 构建一个简单但功能完善的聊天工具&#xff0c;利用 WebSocket 技术实现即时通讯的功能。 项目源码 点击下载 为什么选择 Golang Golang 是一种高效、简…

win10+Intel显卡安装配置stable-diffusion-webui绘画网页

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

【opencv】教程代码 —video(3) 视频背景剔除

bg_sub.cpp 这段代码的功能是把视频中的背景和前景分离&#xff0c;提取出前景的运动物体。根据用户选择的不同的模式&#xff0c;可以选择基于MOG2或者基于KNN的方法来进行背景减除。在处理每一帧图像的过程中&#xff0c;首先使用背景减除模型对图像帧进行处理&#xff0c;得…

ChatGPT 与 OpenAI 的现代生成式 AI(下)

原文&#xff1a;Modern Generative AI with ChatGPT and OpenAI Models 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 七、通过 ChatGPT 掌握营销技巧 在本章中&#xff0c;我们将重点介绍营销人员如何利用 ChatGPT&#xff0c;在这一领域中查看 ChatGPT 的主要用例…

[RK3128_LINUX5.1] 关于 RetroArch 使用

问题描述 查看文档 docs\cn\Linux\ApplicationNote\Rockchip_Use_Guide_Linux_RetroArch_CN.pdf&#xff0c;描述为实验 make menuconfig 后勾选选项 Libretro cores and retroarch -> retroarch 但是SDK中并没有这个选项 解决方案&#xff1a; 目前发布的buildroot SDK…

4核8G服务器配置性能怎么样?4核8G12M配置服务器能干啥?

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

flex:1是干嘛的

直接上图&#xff1a; flex:1实际代表的是三个属性的简写&#xff0c;如上图所示。 其中flex-grow是用来增大盒子的&#xff0c;比如&#xff0c;当子盒子的宽度小于父盒子的宽度&#xff0c;父盒子的剩余空间可以 利用flex-grow来设置子盒子增大的占比&#xff1b; flex-shri…

每日五道java面试题之ZooKeeper篇(二)

目录&#xff1a; 第一题. 客户端注册 Watcher 实现第二题. 服务端处理 Watcher 实现第三题. ACL 权限控制机制第四题. Chroot 特性第五题. 客户端回调 Watcher 第一题. 客户端注册 Watcher 实现 &#xff08;1&#xff09;调用 getData()/getChildren()/exist()三个 API&…

腾讯云4核8g服务器价格,CVM和轻量哪个优惠?

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

PTA L2-046 天梯赛的赛场安排

天梯赛使用 OMS 监考系统&#xff0c;需要将参赛队员安排到系统中的虚拟赛场里&#xff0c;并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们&#xff0c;以便发放比赛账号。为了尽可能减少教练和监考的沟通负担&#xff0c;我们要求赛场的安排满…

深入浅出 -- 系统架构之单体架构

单体架构&#xff08;Monolithic Architecture&#xff09; 单体架构的定义 单体架构&#xff08;Monolithic Architecture&#xff09;是一种传统的软件架构模式&#xff0c;将整个应用程序作为一个单一的、统一的单元进行开发、部署和扩展。在单体架构中&#xff0c;所有的功…

Linux 关闭防火墙命令(新手)

关闭防火墙 查看防火墙状态 systemctl status firewalld.service 临时关闭防火墙&#xff08;重启失效&#xff09; systemctl stop firewalld.service 永久关闭防火墙 systemctl disable firewalld.servicesudo systemctl enable firewalld&#xff0c;这种方式输入命令…

设计模式——抽象工厂模式02

如果是工厂模式是对同一类商品进行抽象然后生产。 那么抽象工厂模式是对工厂的抽象&#xff0c;每个工厂都能生产多种产品&#xff0c;不同工厂生产的商品性质相同&#xff0c;但外观&#xff0c;品牌会略有差异。 设计模式&#xff0c;一定要敲代码理解 商品抽象 public in…