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.mzph.cn/news/75412.shtml

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

相关文章

tomcat的优化

TOMCAT的优化 tomcat的优化主要是从三个方面进行的,第一个是 tomcat配置的优化第二是对JVM虚拟机的优化第三是对Linux系统内核的优化,配置文件中的优化主要在tomcat中server.xml文件夹内 tomcat配置文件的优化 1、 maxThreads: Tomcat 使用…

调用微信公众号创建会员卡接口报错48001

调用文档:1.新版会员卡介绍 | 微信开放文档 接口地址: HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_tokenACCESS_TOKEN 错误描述:48001 {"errcode":48001,"errmsg":"api unauthorized hi…

Fastjson反序列化漏洞

文章目录 一、概念二、Fastjson-历史漏洞三、漏洞原理四、Fastjson特征五、Fastjson1.2.47漏洞复现1.搭建环境2.漏洞验证(利用 dnslog)3.漏洞利用1)Fastjson反弹shell2)启动HTTP服务器3)启动LDAP服务4)启动shell反弹监听5)Burp发送反弹shell 一、概念 啥…

U3D外包开发框架及特点

U3D(Unity3D)是一款流行的跨平台游戏开发引擎,用于创建2D和3D游戏以及交互性应用程序。U3D有许多常用的开发框架和库,这些框架和库可以扩展其功能,使开发人员更轻松地构建游戏和应用程序。以下是一些常用的U3D开发框架…

【计算机网络】 确认应答机制与超时重传

文章目录 ACK机制——确认应答机制超时重传 ACK机制——确认应答机制 当我们客户端发送了一个数据,seq是1100,那么服务端在收到时就会回一个ack101的ACK包,代表101之前的包我都收到了,下面请你从101继续发送。然后客户端就会发送1…

2.linux的组管理和权限管理

一、组管理 1.Linux组的介绍 在linux中每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者,所有组,其他组的概念 ①所有者 ②所在组 ③其他组 ④改变用户所在组 2.文件/目录 所有者 哪个用户创建了文件,就…

【webrtc】时间戳reordered 重新排序、环绕的判断

inter_frame_delay_.CalculateDelay( ) 计算传输抖动值 webrtc源码分析(6)- jitter delay计算详解 大神对这块的使用,内涵外延,有深入细致的讲解。输入rtp时间戳、到达时间(当前系统时间?)-- 在rtp的时间戳的处理上,inter_frame_delay_.CalculateDelay( ) 计算传输抖动值…

《向量数据库指南》——向量数据库的底层原理是什么?

向量数据库的底层实现原理可以根据具体的数据库系统和索引方法而有所不同。不同的向量数据库可能使用不同的数据结构和算法来支持高效的向量存储和相似性搜索。以下是一些常见的底层实现原理和概念: 1、向量存储: 数据结构:向量数据库通常使用数据结构来存储向量数据。这些数…

Java测试(10)--- selenium

1.定位一组元素 (1)如何打开本地的HTML页面 拼成一个URL :file: /// 文件的绝对路径 import os os.path.abspath(文件的绝对路径) (2)先定位出同一类元素(tag name,name&…

DGA行为转变引发了对网络安全的担忧

Akamai的研究人员发现,在域名系统(DNS)流量数据中,动态种子域生成算法(DGA)家族的行为发生了令人担忧的变化。这一发现揭示了恶意行为者如何调整他们的策略来延长他们的指挥与控制(C2)通信通道的寿命,以保护他们的僵尸网络。 从技术角度来看…

计算机网络基础知识(非常详细)

1. 网络模型 1.1 OSI 七层参考模型 七层模型,亦称 OSI(Open System Interconnection)参考模型,即开放式系统互联,是网络通信的标准模型。一般称为 OSI 参考模型或七层模型。 它是一个七层的、抽象的模型体&#xff…

SpringMVC实现增删改查

文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties:配置文件1.3 generatorConfig.xml:代码生成器1.4 spring-mybatis.xml :spring与mybatis整合的配置文件1.5 spring-context.xml :上下文配置文件1.6 spring-mvc-xml:…

2023高教社杯数学建模B题思路代码 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播, 在不同界面上产生反射, 利用这一原理,从测量船换能器垂直向海底发射声波信 号,并记录从声波发射到…

什么是SpringMVC以及SpringMVC框架的优点

它是基于MVC开发模式的框架,用来优化控制器.它是Spring家族的一员.它也具备IOC和AOP. 什么是MVC? 它是一种开发模式,它是模型视图控制器的简称.所有的web应用都是基于MVC开发. M:模型层,包含实体类,业务逻辑层,数据访问层 模型 模型(Model):就是业务流程/状态…

Pytest模式执行python脚本不生成allure测试报告

1.安装allure 下载allure的zip安装包 将allure.zip解压到python的lib目录中 将allure的bin路径添加到环境变量path中(注意:配置环境变量后,一定要重启电脑。因为环境变量没生效,我搞了半天在pycharm不能生成报告,在cmd中可以生成…

Swift页面添加水印

本文主要讨论的是给图片或者视图添加全屏水印。比较常见的是添加单个水印,这个比较好处理,网络上也有很多参考的方法。本文实现的是铺满的全屏水印,具体参考效果如下: 实现思路: 1、根据水印文本以及相应样式生成水印图片,水印图大小根据文本计算而来 2、生成需要铺满水…

SpringBoot【基础篇】

一、快速上手 按照要求,左侧选择web,然后在中间选择Spring Web即可,选完右侧就出现了新的内容项,这就表示勾选成功了 关注:此处选择的SpringBoot的版本使用默认的就可以了,需要说一点,SpringBo…

PHPWord 模板输出checkbox复选框和checked已勾选状态,以及 模板替换时数据如何分行

PHPWord 模板输出checkbox复选框和checked已勾选状态,以及 模板替换时数据如何分行 期望目标 和 模板配置复选框代码数据分行显示在使用PHPWORD模板替换时,经常会有 动态渲染选择项 和 选择项需要被勾选的要求,以及动态数据分行显示等要求。 本文根据 空复选框、勾选复选框…

[Linux 基础] linux基础指令(1)

文章目录 1、Linux下基本指令1.ls指令2.pwd指令3.cd指令4.touch指令5.mkdir指令6.rmdir指令 && rm指令7.man指令8.cp指令9.mv指令10.cat指令11.more指令12.less指令 Linux学习笔记从今天开始不断更新了。第一篇我们从基础指令开始学起。 1、Linux下基本指令 好多人都说…

创建开机自启的脚本

在启动许多ros节点时有多种方式,我推荐使用launch来启动所有的节点,这也是一种规范的方式。以后会慢慢向这个方向靠。 除此之外还可以通过创建的脚本来启动: 脚本位置不限,只需要: sudo gedit xxx.sh在里面添加相应的…