Linux网络原理及编程(5)——第十五节 TCP的连接(三次握手、四次挥手)

news2025/1/11 18:42:48

目录

三次握手

四次挥手

我们来重点说说两个状态:CLOSE_WAIT和TIME_WAIT

【CLOSE_WAIT】

【TIME_WAIT】


各位好,博主新建了个公众号《自学编程村》,拉到底部即可看到,有情趣可以关注看看哈哈,关注后还可以加博主wx呦~~~

本节我们来介绍TCP连接的建立和断开。我们主要介绍两个过程、两个状态。

两个过程即三次握手和四次挥手;两个状态指TIME_WAIT和COLSE_WAIT状态。

我们本节,会始终围绕着这张图来展开:

三次握手

我们还是按照列点是来分析,这样会使得条理比较清晰:

1、当客户端向服务器发起第一次请求(SYN)时,其自身就会处于一种SYN_SEND的状态(即等待发送)

2、处于listen状态的服务器接收到客户端发起的请求之后,会进入SYN_RCVD状态(即等待接收)

3、服务器向客户端发出SYN+ACK,服务器收到之后,由原来的SYN_SEND状态变为ESTABLISED(连接)状态。

4、当服务器收到这个ACK之后,便同样会进入到ESTABLISED状态

过程比较简单,就是上述那样。

【注意】

链接本身是有成本的:耗费空间+时间,而TCP是面向连接的,即三次握手成功之后,需要client和server共同维护

注意到,我们这里的ACK和SYN有一次压缩起来了,所以如果硬要说的话,是四次握手,但是其默认都是压缩起来了,所以我们就按照三次握手来说。

a.那为啥是要有三次握手?一次、两次、四次不行?

首先一次肯定是不行的,为什么呢?如果发出去一个SYN就算建立连接了,那这和udp有什么区别呢,即便服务器没有拿到这个SYN请求,我的客户端已经认为建立连接了?况且服务器连接的维护是需要成本的。如果一次就建立连接的话,如果一个恶意软件在短时间内对我进行大量的SYN,那我的服务器不就崩掉了?

b.那两次呢?

如果是这样的话,那服务器发回去一个ACK之后,它就直接认为自己建立连接了。这本质上和一次握手并没有什么差别。

一次和两次握手极容易收到SYN洪水攻击:无条件的发SYN就建立连接的话,那我大量的发SYN,服务器就直接挂掉了。

c.那为什么要三次呢?

我们说TCP是全双工的,所以,双方在通信之前,需要讲信道的状况验证一下是否通畅。即客户端和服务器都至少有一次收、有一次发。  故:用最小的成本验证全双工。

如果是四次握手的话,那前三次的报文丢失我们不怕,但是第四次的报文我们还是害怕丢失的,多这个一次就没有意义了。更多的也是一样的道理。(并且不要让服务器出现连接建立误判的清空,从而减少服务器的资源浪费)

我们再来说说四次挥手

四次挥手

首先,为什么要四次挥手?理由很简单:

TCP是全双工的,即服务器和客户端二者是双向的,地位是对等的。那么二者都要断开连接,客户端关闭后,服务器给个ACK,服务器关闭后,客户端再给个ACK。

即我们双方达成共识之后才可以断开连接。(一定是双方都断开了连接)

【四次挥手的状态变化】

1、当我将断开连接的FIN发出去之后,我就进入了FIN_WAIT_1状态

2、服务器返回ACK(这里的ACK还是可以携带数据的),然后服务器进入CLOSE_WAIT状态。(关闭等待)

 此时,我们认为客户端向服务器的通信信道关闭了,即客户端就不会再给服务器发送数据了。即在客户都应用层表现为close(sock)。

3、客户端在收到服务器的ACK后,就处于FIN_WAIT_2状态。

4、紧接着,服务器给客户端又发了一个FIN,表示服务器也要关闭自己到客户端的信道。这个时候,服务器进入到LAST_ACK状态

5、在客户端收到服务器的FIN之后,再次向服务器发送ACK,此时,客户端进入TIME_WAIT状态。

6、当客户端经历了一段时间之后,由TIME_WAIT状态进入CLOSE状态

我们来重点说说两个状态:CLOSE_WAIT和TIME_WAIT

主动断开的一方会最终进入TIME_WAIT状态,而另一方如果不关闭连接,则会处于CLOSE_WAIT状态。

【CLOSE_WAIT】

为什么会进入到CLOSE_WAIT状态?本质上就是因为你的代码有bug——没有把使用完的套接字关掉。这样会浪费大量的系统资源

(半关闭问题)

就是服务器先退出了。但是客户端还没有退出。

解决方法:很简单,把你的socket文件描述符close掉就行了。

【TIME_WAIT】

对于最后一个ACK,其也是有可能丢失的。

可是在发送完ACK后,假如没有这个TIME_WAIT,客户端会认为连接已经断开,然后释放连接资源。那这个ACK丢失了怎么办?我们的服务器会进行超时重传。可是这个时候客户端已经把连接关了。那么这个服务器会一直挂在LAST_ACK的状态,就会浪费服务器的资源。

所以就衍生出了TIME_WAIT。就是客户端(主动断开连接的一方)先等等,等待的意义:

(1)防止最后一个ACK丢失,进而尽快释放服务器的资源;(2)等待历史数据在网络上消散,即有可能通信结束的报文优先收到,之前还有数据(历史数据)没有被客户端收到。

(等待的时间是通信一个来回最多花费的时间:2MSL)

如果服务器重传了若干次都没有响应,那其也就强行关闭了。(但是这种情况是比较小的)

 在server的TCP连接没有完全断开之前不允许重新监听, 某些情况下可能是不合理的:

 1、服务器需要处理非常大量的客户端的连接(每个连接的生存时间可能很短, 但是每秒都有很大数量的客户端来请求).

2、这个时候如果由服务器端主动关闭连接(比如某些客户端不活跃, 就需要被服务器端主动清理掉), 就会产生大量TIME_WAIT连接.

3、由于我们的请求量很大, 就可能导致TIME_WAIT的连接数很多, 每个连接都会占用一个通信五元组(源ip,源端口, 目的ip, 目的端口, 协议). 其中服务器的ip和端口和协议是固定的. 如果新来的客户端连接的ip和端口号和TIME_WAIT占用的链接重复了, 就会出现问题

 

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

好啦,本节的内容就到这里啦~~

原创不易,如果觉得写的不错,就点个赞呗~~~笔芯~~~~

下面是笔者的微信公众号,也欢迎来关注呀~~~

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

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

相关文章

Linux CENTOS安装mysql8 64位

1. 查看系统中是否已经安装了mariadb 执行:yum list installed | grep mariadb 若已经存在,则删除 执行: yum remove mariadb 2.下载需要安装的压缩文件,从官网下载,文件为名字为 mysql-8.0.31-linux-glibc2.12-x86_6…

S7-1200和1500PLC与条码枪建立TCP_IP通信的具体方法示例

S7-1200和1500PLC与条码枪建立TCP_IP通信的具体方法示例 今天和大家分享西门子S7-1200和1500PLC如何获取条码枪的扫描数据,这种案例中一般PLC作为TCP/IP的客户端(只接收数据,不发送数据),条码枪作为TCP/IP的服务器。 如下图所示,在指令—通信—开放式用户通信中可以找到相关…

洞察 | 软件定义汽车时代下,汽车制造产业的应对策略

汽车产业作为先进制造行业,伴随着数字化技术,电气化技术的迭代正快速的成长,而随着智能汽车、自动驾驶概念的提出,整车制造的软硬件复杂度也在持续提升,软件定义汽车转型已成整体汽车制造产业的共识。 据中国软件行业…

成长任务| 挑战代码画颗圣诞树

🎄立即投稿🎄 📌活动规则 圣诞将至,这次来试试用代码过圣诞吧~挑战圣诞树的一万种画法! √ 使用代码画一颗#圣诞树#,将你的代码文件通过本页面投稿,审核通过即可参与活动 √ 可使用任意编程语言&#xff…

【解纠缠表示:图像增强】

DRLIE: Flexible Low-Light Image Enhancement via Disentangled Representations (DRLIE:基于解纠缠表示的柔性弱光图像增强) 解纠缠表示 弱光图像增强(Low-light image enhancement (LIME))是将亮度不理想的图像转化…

为了彻底弄懂CSS中的1px究竟有多长,我翻出了家里的卷尺

CSS是描述HTML文档如何显示的,在显示的过程中,HTML元素的长宽、间距、字体大小等等,都需要通过长度尺寸单位来表示。我们常常会说:字体大小16像素, 间距10个像素。这里的像素,就是CSS中的长度尺寸单位。一个…

软件测试行业真的不行了吗?那出路到底在哪?

下面这张图片,想必大家应该都知道~~~ 其实每个人都在金字塔里面,只不过大家的高低位置不同,当然,越在底层的人越多,越在高层的人越少~ 这也符合“二八定律”,“优胜劣汰”,“适者生存”~ 当你的…

c++中的this指针

1.this指针的引入 首先我们看下面这一段代码 class Date { public:void DateSet(int year, int month, int day){_year year;_month month;_day day;}void print(){cout << _year << "-" << _month << "-" << _day <…

论文速递:一种用于视觉定位的基于NLP思路的直线特征匹配算法

标题&#xff1a;Line as a Visual Sentence:Context-aware Line Descriptor for Visual Localization 作者&#xff1a;Sungho Yoon1 and Ayoung Kim2∗ 摘要 在机器人以及计算机视觉领域&#xff0c;除了通过使用图像匹配的特征点计算多视图几何来求解问题&#xff0c;还可…

12月的第一波驱动,来看看支持哪款游戏吧!

真的停不下来&#xff01;2022年的最后一个月&#xff0c;新游戏仍然在发力&#xff0c;《极品飞车&#xff1a;不羁》、《巫师 3&#xff1a;狂猎》、《传送门RTX版》都在12月正式上线&#xff01; 为了提供更好的游戏体验&#xff0c;英伟达、AMD、英特尔三巨头更是马不停蹄…

时间轮算法HashedWheelTimer

文章目录一.HashedWheelTimer是什么?二.能干什么?为什么需要这个东西?优点适用场景三.怎么用?使用步骤1.引入pom2.使用举例四.时间轮原理五.使用注意点1.一个HashedWheelTimer对象只有一个worker线程2.每次添加的任务只会执行一次3.时间轮的参数非常重要4.所有的任务都是顺…

rabbitmq基础1——消息中间件概念、Rabbitmq的发展起源和基本组件的作用流程

文章目录一、消息中间件1.1 概念1.2 作用1.2.1 消息队列持久化1.2.2 消息队列分发策略1.2.3 消息队列的高可用和高可靠1.2.3.1 一主多从共享集群1.2.3.2 一主多从同步集群1.2.3.3 多主多从同步集群1.2.3.4 多主转发集群1.2.3.5 Master-slave与Breoker-cluster组合方案1.3 初识A…

实战总结!18种接口优化方案的总结

之前工作中&#xff0c;遇到一个504超时问题。原因是因为接口耗时过长&#xff0c;超过nginx配置的10秒。然后 真枪实弹搞了一次接口性能优化&#xff0c;最后接口从11.3s降为170ms。本文将跟小伙伴们分享接口优化的一些通用方案。 1. 批量思想&#xff1a;批量操作数据库 优化…

Windows环境监控Linux服务器资源grafana+prometheus+mysql_exporter

Windows环境监控Linux服务器资源grafanaprometheusmysql_exporter 1.安装mysql (1)在虚拟机中下载wget命令 yum -y install wget(2)在线下载mysql安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm(3)安装MySQL rpm -ivh mysql57-communi…

信仰崩了?Preact 开始采用 Vue3 的响应式设计

前言 不知大家有没有听过Preact这个框架&#xff0c;就算没听过Preact那也应该听过React吧&#xff1f; 一字之差&#xff0c;preact比react多了个p&#xff01;&#xff08;听起来咋不像啥好话呢&#xff09; 这个P代表的是 Performance&#xff0c;高性能版React的意思。P…

一篇博客详解朴素贝叶斯解分类问题

目录 回归问题 正则化Regularization 分类问题—类别之间是独立的 为什么不用回归解分类问题以概率的形式解分类问题 抽盒机率→分类机率正态分布覆盖 原理高斯分布函数 极大似然估计求最优参数 朴素贝叶斯法 用同一个协方差三步骤 模型的简化 回归问题 大概内容与之前的类…

工业ESD防静电闸机系统帮助您实现静电监控自如!

如何有效检测、消除静电&#xff0c;对元器件品质进行有效管控&#xff1f;现在工厂常用的设备有腕带接地、电阻测试仪&#xff0c;ESD防静电系统&#xff0c;但是这些都是在我们生产的同时去监控处理掉静电&#xff0c;那么有没有一种能直接从人体根源消除掉静电的系统呢&…

Postman 的简单使用

什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求。可以对网页进行简单的基本信息调试。Postman最早是作用chrome浏览器插件存在的&#xff0c;但是2018年初Chrome停止对Chrome应用程序的支持。所以现在Postman提供了独立的安装包&#xff0c;不再依赖于Chrome浏览…

MySQL innodb引擎架构分析-Buffer Pool

文章目录系列文章目录前言一、Buffer Pool是什么&#xff1f;二、Buffer Pool是如何工作的&#xff1f;1. free链2. flush链根据脏页的情况(阈值)和相关配置刷新自适应刷脏3. Lru升级链总结参数&#xff1a;innodb_buffer_pool_size参数&#xff1a;innodb_buffer_pool_instanc…

避免重要数据泄露的8种方式

得益于国家的大力支持&#xff0c;我国数字化经济已开启高速发展模式&#xff0c;数据已经成为企业不可或缺的重要资产&#xff0c;相对应的数据安全风险问题也随之而来。 数据泄露不仅给企业带来了财产损失&#xff0c;也给企业带来了极大的声誉威胁。以下是日常生活中企业和…