TCP三次握手和四次挥手

目录

TCP连接建立

问题思考

1.为什么要三次握手?

2.三次握手一定要保证成功吗?

TCP连接释放 

问题思考 ​

 1.理解TIME-WAIT状态

 2.理解CLOSE-WAIT状态

TCP连接建立

TCP建立连接的过程叫作握手,握手需要在客户和服务器之间交换三个TCP报文

现在A是客户端,B是服务器端,最初两端都处于CLOSED状态,假设A主动打开连接,B被动打开连接。

第一次握手

一开始B服务器端先创建传输控制块TCB(调用listen)后进入LISTEN状态,等待A客户端的连接请求。

A的客户端也是首先创建传输控制块TCB,此时A客户端打算建立TCP连接(调用connect),向B服务器端发送了一个请求连接报文段(即SYN = 1),同时初始序号seq=x,而该报文不能携带任何数据,这时,A客户端进入SYN-SENT状态。

第二次握手

B服务器端收到A客户端发送的请求连接报文段并同意建立连接,则B向A发送确认报文段。在确认报文段中SYN和ACK都置为1,确认序号ack=x+1,序号seq=y,这个报文段也不能携带任何数据。这时,B服务器端进入SYN-RCVD状态。此阶段B也可能拆分成两个报文发送给A,即先发送一个确认报文段(ACK=1,ack=x+1),再发送一个连接报文段(SYN=1,seq=y),结果都是一样的。

第三次握手

A客户端收到B的确认报文段后,还要向B发送一个确认报文段,该确认报文段中ACK=1,确认序号ack=y+1,序号seq=x+1,TCP标准规定,此报文段是可以携带数据的。这时,TCP连接已经建立,A进入ESTABLISHED状态,B收到A的确认后也进入ESTABLISHED状态,TCP建立连接成功。

问题思考

1.为什么要三次握手?

连接的本质其实就是内核的一种数据结构类型,建立连接成功的时候,就是在内存中创建对应连接对象,在对多个连接对象进行某种数据结构的组织。

所以要明白一个道理,维护连接是需要成本的(内存+CPU)

原因一:三次握手是确认双方主机状态和收发信道的是否通畅的最小次数,从而验证了全双工

 在三次握手中客户端必然会收到数据和发送数据,以此证明自己的收发信道的通畅,以及获得对方主机状态。服务端也必然会收到数据和发送数据,证明自己的收发信道的通畅,以及获得对方主机状态。

原因二:服务端可以嫁接同等的成本给客户端

(1)如果只进行一次握手

如果服务端收到来自大量SYN报文连接请求(SYN洪水),因为只需要一次握手就能建立连接,但是每次连接都需要创建对象并消耗资源,这样导致服务端的资源很快就会消耗完的,服务端因此就会挂掉,所以这肯定是不行的。

(2)如果只进行两次握手

和一次握手的情况类似,只要服务端发出ACK报文段,那么说明连接就建立起来了。如果服务端收到大量请求连接报文,并且逐一发送ACK报文段后,连接就建立成功,服务端还是要消耗大量资源。所以也不行。

(3)进行三次握手

如果服务端收到了大量请求连接报文,并逐一回复ACK+SYN报文段,此时服务端不会创建对应的连接对象,因为连接还没有建立成功。要想连接建立成功,客户端就需要发送大量ACK报文段,一旦客户端发送了ACK报文段后,会认为此时TCP连接已经建立成功,客户端就需要调用资源来维护该连接,这样服务端的成本就嫁接到客户端上了。

2.三次握手一定要保证成功吗?

不一定,因为最后一次发送的ACK报文段,客户端不能保证服务器端一定收到了该报文,所以有可能三次握手失败。

TCP连接释放 

假设现在数据传输完成,A先发出连接释放报文段并停止发送数据。

第一次挥手

A发送连接释放报文段,其首部的终止控制位FIN置1,序号seq=u,u为前面已传送数据的最后一个字节的序号加1。这时,A进入FIN-WAIT-1状态。

第二次挥手

B收到A的连接释放报文段后,发送确认报文段(ACK=1),确认序号ack=u+1,序号seq=v,v为前面已传送数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT状态,这时TCP连接处于半关闭状态,即从A到B这个方向的连接已经释放了,A已经没有数据发送给B了,但是B若有数据发送给A,A仍然要接收。

A收到B的确认报文段后,就进入了FIN-WAIT-2状态。

第三次挥手

B发出连接释放报文段(FIN=1),序号seq=w,假定B又发送了一些数据给A,那么B还必须重复上次已发送的确认序号ack=u+1,这时,B进入LAST-ACK状态。

第四次挥手

A收到B的连接释放报文段后,A就必须向B发出确认报文段(ACK=1),确认序号ack=w+1,自身序号seq=u+1,这时,A进入TIME-WAIT状态,此时TCP连接还没有释放,A需要等待2MSL(Max Segment Life, 报文最大生存时间)时间后,才会进入CLOSED状态。

B收到A的确认报文段后,就进入了CLOSED状态。

问题思考

 1.理解TIME-WAIT状态

TIME_WAIT期间仍然不能再次监听同样的端口号,因为虽然四次挥手已经完成,但是主动断开连接的一方要维持一段时间的TIME_WAIT状态,在该状态下,其地址信息,IP,端口号依旧是被占用的,所以你断开又立马连接会连接失败的。

MSL在RFC793中建议设为2分钟,但是不同的操作系统实现的不同,在Centos7上默认配置的值是60s。
可以通过 cat /proc/sys/net/ipv4/tcp_fin_timeout 查看MSL的值。

 为什么进入TIME-WAIT状态必须等待2MSL的时间呢?

原因一:保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失。否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的。

原因二:保证最后一个报文段可靠到达。假设最后一个ACK报文段丢失, 那么服务器会再重发FIN+ACK报文段。这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发FIN+ACK报文段。

解决TIME_WAIT状态引起的bind失败的方法


现实中服务端需要处理非常多的客户端的连接(每个连接的生存时间可能很短,但是每秒都有大量的客户端发来请求)。这个时候如果由服务端主动关闭连接(比如某些客户端不活跃,就需要被服务端主动清理掉), 就会产生大量TIME_WAIT连接,由于我们的请求量很大, 就可能导致TIME_WAIT的连接数很多, 每个连接都会占用一个通信五元组(源ip,源端口, 目的ip, 目的端口, 协议)。 其中服务器的ip、端口和协议是固定的,如果新来的客户端连接的ip、端口号和TIME_WAIT占用的连接重复了,就会出现问题。

使用setsockopt()设置socket描述符的 选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个socket描述符

2.理解CLOSE-WAIT状态

对于服务器上出现大量的 CLOSE_WAIT 状态, 原因就是服务器没有正确的关闭 socketfd,导致四次挥手没有正确完成. 这是一个BUG. 只需要加上对应的 close 即可解决问题。

 

如有写的不好或错误的地方,希望能指正,谢谢。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode-简单题】844. 比较含退格的字符串

文章目录 题目方法一:单指针方法二:双指针方法三:栈 题目 方法一:单指针 首先每次进入循环处理之前需要对第一个字符进行判断,若是退格符,直接删掉,结束此次循环fast从0开始,如果fa…

无涯教程-JavaScript - COUPNCD函数

描述 COUPNCD函数返回一个数字,该数字表示结算日期之后的下一个息票日期。 语法 COUPNCD (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMa…

OSPF路由计算

1、Router LSA LSA 链路状态通告,是OSPF进行路由计算的主要依据,在OSPF的LSU报文中携带,其头重要字段及解释: LS Type(链路状态类型):指示本LSA的类型。 在域内、域间、域外…

OpenResume简历解析官方技术文档(翻译)

OpenResume简历解析官方技术文档(翻译) 本文是对OpenResume建立解析器官方技术文档《Resume Parser Playground》的翻译。 相关连接: OpenResume官网 OpenResume简历解析器的官方地址 OpenResume的Github 简历解析测试环境 该测试环境展示了 OpenResume 简历…

vue页面添加水印(可用于H5,APP)

vue页面添加水印 背景实现新建vue组件使用效果 尾巴 背景 最近实现了一个小功能,就是给页面添加背景水印。实现思路就是定义一个宽高充满屏幕的组件,然后使用绝对定位并通过层级控制让水印显示在页面的最前端。 实现 代码相对简单,相信有点…

2023-9-11 高斯消元解异或线性方程组

题目链接&#xff1a;高斯消元解异或线性方程组 #include <iostream> #include <algorithm>using namespace std;const int N 110;int n; int a[N][N];int gauss() {int c, r;for(c r 0; c < n; c ){int t r;for(int i r; i < n; i )if(a[i][c]){t i;b…

超图聚类论文阅读1:Kumar算法

超图聚类论文阅读1&#xff1a;Kumar算法 《超图中模块化的新度量&#xff1a;有效聚类的理论见解和启示》 《A New Measure of Modularity in Hypergraphs: Theoretical Insights and Implications for Effective Clustering》 COMPLEX NETWORKS 2020, SCI 3区 具体实现源码见…

vue checkbox-group和checkbox动态生成,问题解决

源码 <el-checkbox-group v-model"form[keyItem.name]"><el-checkboxv-for"(checkboxItem,cindex) in keyItem.options.split(,)":key"cindex":label"checkboxItem"></el-checkbox></el-checkbox-group> 我是…

不关闭Tamper Protection(篡改保护)下强制卸载Windows Defender和安全中心所有组件

个人博客: xzajyjs.cn 背景介绍 由于微软不再更新arm版本的win10系统&#xff0c;因此只能通过安装insider preview的镜像来使用。而能找到的win10 on arm最新版镜像在安装之后由于内核版本过期&#xff0c;无法打开Windows安全中心面板了&#xff0c;提示如下&#xff1a; 尝…

——二叉树

二叉树种类 二叉树有两种主要的形式&#xff1a;满二叉树和完全二叉树。 满二叉树 如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 完全二叉树 在完全二叉树中&#xff0c;除了最底层节点可能没…

buuctf web 前5题

目录 一、[极客大挑战 2019]EasySQL 总结&#xff1a; 二、[极客大挑战 2019]Havefun 总结&#xff1a; 三、[HCTF 2018]WarmUp 总论&#xff1a; 四、[ACTF2020 新生赛]Include 总结&#xff1a; 五、[ACTF2020 新生赛]Exec 总结&#xff1a; 一、[极客大挑战 2019]…

VPS使用环境受限?亚马逊云科技Amazon Lightsail为开发者提供更多选择

对于开发者而言&#xff0c;当你想构建系统架构时&#xff0c;你的面前就出现了两种选择&#xff0c;选择一是花时间去亲手挑选每个亚马逊云科技组件&#xff08;云服务器、存储、IP地址等&#xff09;&#xff0c;然后自己组装起来&#xff1b;选择二是只需要一个预先配置且预…

C语言经典100例题(51-54)--学习使用按位与 ,按位或 |,按位异或 ^和按位取反~

目录 题目 问题分析 按位与操作符&#xff08;&&#xff09; 按位或操作符&#xff08;|&#xff09; 按位异或操作符&#xff08;^&#xff09; 按位取反操作符&#xff08;~&#xff09; 代码及运行结果 题目 学习使用按位与& ,按位或 |,按位异或 ^和按位取反…

解决微信开发者工具企业微信小程序模式下模拟器白屏问题

前一天晚上没有关电脑&#xff0c;第二天发现电脑自己重启了&#xff0c;然后微信开发者工具就出了问题&#xff0c;在企业微信小程序模式下&#xff0c;模拟器出现了白屏&#xff0c;只有上方title可以正常显示。点击模拟器右上角三个点都不出弹出菜单&#xff0c;并且在调试器…

初识Nacos

前言 Nacos是一个用于微服务架构下的服务发现和配置管理以及服务管理的综合解决方案&#xff08;官网介绍&#xff09;&#xff0c;这里的服务发现其实就是注册中心&#xff0c;配置管理就是配置中心&#xff0c;而服务管理是二者的综合&#xff1b; Nacos特性 1.服务发现与…

李宏毅机器学习笔记:RNN循环神经网络

RNN 一、RNN1、场景引入2、如何将一个单词表示成一个向量3种典型的RNN网络结构 二、LSTMLSTM和普通NN、RNN区别 三、 RNN的训练RNN与auto encoder和decoder 四、RNN和结构学习的区别五、pytorch实现RNN与LSTM5.1为何 H o u t h i d d e n s i z e H_{out}hidden_size Hout​hi…

一个集成的BurpSuite漏洞探测插件1.1

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0c…

Mysql数据库基础总结:

什么是数据库&#xff1a; 数据库&#xff08;DataBase&#xff09;&#xff1a;存储和管理数据的一个仓库。 数据库类型分为&#xff1a;关系型数据库和非关系型数据库。 关系型数据库&#xff08;SQL&#xff09;&#xff1a;存储的数据以行和列为格式&#xff0c;类似于e…

手写Mybatis

Mybatis核心配置文件就是为了配置Configration 因此要首先会解析Mybatis核心配置文件 首先使用dom4J解析Mybatis核心配置文件 新建模块演示dom4j解析.xml 目录放错了 无所谓 引入依赖 从原来项目可以拷贝过来 就些简单配置就好 解析核心配置文件和解析xxxMapper.xml映射文件…

vue学习之属性绑定

内容渲染 采用 &#xff1a;进行属性渲染创建 demo3.html,内容如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…