【第七天】TCP三次握手四次挥手 HTTP的keep-Alive和TCP的keepalive

news2024/9/21 21:44:23

TCP三次握手四次挥手

既然要了解这些,首先我们要清楚一个概念,半连接队列和全连接队列:
在TCP三次握手中,Linux内核会维护两个队列来管理连接请求。
这两个队列的存在是为了处理并发连接请求,确保服务端能够有效管理新的请求。
半连接队列(SYN Queue)
当服务端收到客户端的SYN请求时,此时双方都还没有完全建立连接,它会把半连接状态的连接放在半连接队列。
全连接队列(Accept Queue):
当服务端收到客户端的ACK响应时,意味着三次握手成功完成,服务端会将该连接从半连接队列移动到全连接队列。如果没有收到客户端的ACK响应,会进行重传,重传的时间是指数级增长的。如果重传次数超过系统规定的最大次数,则会将这个连接从半连接队列里删除。

然后是SYN:
SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。

建立连接三次握手:

TCP三次握手的过程:

在这里插入图片描述

  1. 客户端向服务端发送带有SYN(SEQ=x)标志的数据包,然后客户端进入SYN_SEND状态,等待服务器确认。
    在此过程中,客户端确认不了什么,服务端能够确认:自己接收正常,对方发送正常。
  1. 服务端发送带有SYN+ACK(SEQ=y,ACK=x+1)标志的数据包到客户端,然后服务端进入SYN_RECV状态。
    在此过程中,客户端确认:自己发送接收正常,对方发送接收正常。服务端确认:自己接收正常,对方发送正常。
  1. 客户端发送带有ACK(y+1)标志的数据包到服务端,然后客户端和服务端都进入ESTABLISHED状态,完成三次握手。
    在此过程中,客户端确认:自己发送接收正常,对方发送接收正常。服务端确认:自己发送接收正常,对方发送接收正常。

为什么要三次?

三次握手的目的就是建立可靠的连接,归根结底就是双方确认自己与对方发送接收数据是否正常。
第一次握手:客户端确认不了什么;服务端确认了自己接收正常,对方发送正常。因为服务端收到了客户端的信息。
第二次握手:客户端确认了自己发送接收正常,对方发送接收正常;服务端还是只确认了自己接收正常,对方发送正常。客户端是接收到了服务端的反馈信息,也就能确认双方的接收发送状态,而服务端还没有收到来自客户端的信息,所以也就只能确认自己能接收,对方能发送。
第三次握手:客户端确认自己发送接收正常,对方发送接收正常;服务端确认自己发送接收正常,对方发送接收正常。因为服务端接到了来自客户端的反馈信息,说明了自己发送的信息到了客户端,客户端也接收处理了。

不能是两次或者四次吗?

三次握手才能确保双方具备接收和发送的能力。两次握手可能会导致资源浪费。没有第三次握手,那么服务端就无法确认客户端是否接收到了自己的回复,所以服务端每收到一个SYN,就要去主动向客户端建立一个连接。假设一次握手用1个单位资源,那么一次三次握手的连接要用3单位资源。如果使用两次握手的连接的话,服务端和客户端要建立可靠连接,就得都向对方进行两次握手连接,要消耗4单位资源。这样就导致了资源的浪费。而四次握手的话可以被优化成3次握手,因为3次握手就已经确保了双方具备接收和发送能力了。

断开连接四次挥手

在这里插入图片描述

挥手过程:

  1. 第一次挥手:客户端发送一个FIN(SEQ=x)标志的数据包到服务端,用来关闭客户端到服务端的数据传送。然后客户端进入FIN-WAIT-1状态。
  2. 第二次挥手:服务端收到FIN(SEQ=x)后,发送一个ACK(ACK=x+1)标志的数据包到客户端。然后服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。
  3. 第三次挥手:服务端发送一个FIN(SEQ=y+1)标识的数据包到客户端,请求关闭连接,然后服务端进入LAST-ACK状态。
  4. 第四次挥手:客户端发送ACK(ACK=y+1)标志的数据包到服务端,然后客户端进入TIME_WAIT状态,服务端在收到ACK(ACK=y+1)后,进入CLOSE状态。如果此时客户端等待2MSL后仍没有收到回复,则证明服务端已经正常关闭,随后客户端也关闭连接。
    只要四次挥手没有结束,客户端和服务端就可以继续传输数据

为什么要四次挥手?

TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连续释放通知,对方确认后就完全关闭了TCP连接。
就如A和B打电话
第一次挥手:A:我说完了。(A放下电话,等B回复)
第二次挥手:B:我知道了。我还有话要说。你先别挂。(A放下电话,等B说)
第三次挥手:B:叽里呱啦。我也说完了。(B放下电话,等A回复)
第四次挥手:A:我知道了。(A回复了,B听到后就关电话,A等一小会儿,没听到B的声音,A也关掉电话)。

为什么不把服务端发送的ACK和FIN结合起来,变成三次挥手?

因为服务端也要发送数据,可能服务端收到客户端断开请求的时候,服务端的数据还没发送完。要是合并起来了,那就会导致服务端传数据传一半就断开了。

HTTP的Keep-Alive和TCP的Keepalive

HTTP多个TCP连接怎么实现?
多个TCP连接是靠服务器对Connect: keep-aliveHeader进行了支持。简而言之,就是完成了这个HTTP请求之后,不断开HTTP请求使用的TCP连接。
这样做的好处是连接可以被重新使用,之后发送HTTP请求的时候不需要重新建立TCP了解,以及如果维持连接,那么SSL的开销也可以避免。

HTTP的Keep-Alive是由应用层(用户态)实现的,称为HTTP长连接。
HTTP请求的建立过程是:建立TCP连接->请求资源->响应资源->释放连接。
每次这样建立连接都只能请求一次资源。而HTTP的Keep-Alive实现了使用同一个TCP连接来发送和接收多个HTTP请求/应答,避免了建立连接和释放连接的开销。

TCP的Keepalive是由TCP层(内核态)实现的,称为TCP保活机制。
就是给一个TCP设置一个定时任务用于倒计时,超时后触发任务,即发送一个探测报文给对端,用来判断对端是否存活

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

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

相关文章

设计模式17-适配模式

设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化?如何既能利用现…

《零散知识点 · SpringBoot 整合邮件功能》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

光伏气象仿真系统主要功能点

光伏电站的效能与经济效益受气象条件、地理位置、设计布局等多种因素影响显著。因此,光伏气象仿真系统应运而生,成为提升光伏项目规划、设计、运营管理水平的重要工具。该系统集成了气象数据分析、发电量分析、投融资分析、损耗估算分析及光伏设计等多项…

重磅惊喜!OpenAI突然上线GPT-4o超长输出模型!「Her」高级语音模式已开放测试

在最近的大模型战争中,OpenAI似乎很难维持霸主地位。虽然没有具体的数据统计,但Claude3.5出现后,只是看网友们的评论,就能感觉到OpenAI订阅用户的流失: Claude3.5比GPT-4o好用,为什么我们不去订阅Claude呢&…

【TS】基础(一)

TS基础学习 TS(TypeScript)TS的特性TS的优缺点优点缺点 TS和JS的区别TS常用类型原始类型数组类型别名 type联合类型 |函数对象接口 interface继承 extendsinterface和type的区别 类型断言枚举enum任意类型any TS(TypeScript) TS是JS类型的超集(在JavaScript的基础上…

为什么说脱离决策的数据分析都是无用功

如果你问我数据分析师最重要的能力是什么,我的回答是数据驱动决策,这是数据分析师最值钱的能力,没有之一。 因为数据的价值在于挖掘,与业务和市场进行关联,找到机会点。抛开这个,数据本身一文不值&#xf…

C语言笔记(第n版):知识清单

注:本文参考自【C reference - cppreference.com】和【C 语言参考 | Microsoft Learn】,颇有点借花献佛的意味…… C 程序是一系列包含声明的文本文件(通常为头文件和源文件)的序列。它们经过转换成为可执行程序,当操作…

Bugku ---Web---全题目解析 超详细步骤 持续更新

目录 1.Simple_SSTI_1 2.Simple_SSTI_2 3.滑稽 4.计算器 5.矛盾 6.GET ————————————————————分割线———————————————————— 1.Simple_SSTI_1 SSTI是服务器端模板注入 F12查看下源码 在 Flask 中,双大括号 {{ }} 用…

ElasticSearch父子索引实战

关于父子索引 ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的. 父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有…

Oracle LiveLabs实验:Improve application performance with True Cache

此实验申请地址在这里,时间为120分钟。 帮助见这里。 简介 参加本次动手实践研讨会,了解如何使用 True Cache 通过卸载查询和减少对主数据库的请求和连接数量来提高可扩展性。本次研讨会基于连接到配置了 True Cache 的主数据库的计算实例&#xff08…

从零手写实现 mybatis 系列(零)mybatis 核心特性

拓展阅读 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis。 第二节 从零开始手写 mybatis(二)mybatis interceptor 插件机制详解 第三节 从零开始手写 mybatis(三&#xff0…

最低工资标准数据(2001-2023年不等)、省市县,整理好的面板数据(excel格式)

时间范围:2001-2022年 具体内容:一:最低工资数据标准时间:2012-2021包含指标: 省份城市/区县小时最低工资标准(非全日制)月最低工资标准实施日期 样例数据: 二:各省最低…

Spring Cloud Gateway网关的高级特性之GatewayFilter Factories(路由过滤器)

1、GatewayFilter Factories(路由过滤器) 官方访问地址:点击这里 来自官方的解释如下图所示: 简单来说就是: 客户端向 Spring Cloud Gateway 发送请求。如果请求与某个路由匹配,则该请求会被传递给 Ga…

OpenEuler安装部署教程

目录 OpenEuler安装部署教程 MobaXterm一款全能的远程工具 yum安装软件 vim编辑器(了解) 防火墙 常用命令 网络工具netstat & telnet 进程管理工具top ps 磁盘free、fdisk 用户、组(了解) 权限(了解&am…

实验3-9 三天打鱼两天晒网

//实验3-9 三天打鱼两天晒网/* 中国有句俗语叫“三天打鱼两天晒网”。 假设某人从某天起&#xff0c;开始“三天打鱼两天晒网”&#xff0c; 问这个人在以后的第N天中是“打鱼”还是“晒网”&#xff1f; */#include<stdio.h> #include<math.h> int main(){int n; …

Photoshop的下载和安装教程

找到Adobe 的官网 https://www.adobe.com/cn/ 创建一个新的账户,如果你没有账户的话 后面安装步骤来注册 下载和安装 登录之后 点击 点击 点击 然后进行下载和安装 然后就是漫长的等待 安装完成 点击 这只是一个安装Photoshop的教程,也可以根据别人的安装包来进行安装

ThreadPoolExecutor工作原理及源码详解

一、前言 创建一个线程可以通过继承Thread类或实现Runnable接口来实现&#xff0c;这两种方式创建的线程在运行结束后会被虚拟机回收并销毁。若线程数量过多&#xff0c;频繁的创建和销毁线程会浪费资源&#xff0c;降低效率。而线程池的引入就很好解决了上述问题&#xff0c;…

万字详解 MapStruct Plus,带你快速上手!

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 前言一、为什么要用 MapStruct&#xff08;背景&#xff09;二、MapStruct Plus 的快速开始1. 引入依赖2. 指定对象映射关系3. 编写测试代码4. 运行结果5. 原理解析 三、自定义实体类中的属性转换1. 自定义一个类型…

【IO】使用父子进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,子进程结束后退出,父进程回收子进程的资源

1、使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半内容&#xff0c;子进程拷贝后一半内容&#xff0c;子进程结束后退出&#xff0c;父进程回收子进程的资源 #include <myhead.h>int main(int argc, const char *argv[]) {//判断输入的格式是否符合要求i…