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

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

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


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


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

微信图片_20221211143046.png



三次握手

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


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描述符



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2天前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
20 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
17天前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
47 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
10天前
|
前端开发 网络协议 安全
【网络原理】——HTTP协议、fiddler抓包
HTTP超文本传输,HTML,fiddler抓包,URL,urlencode,HTTP首行方法,GET方法,POST方法
|
10天前
|
域名解析 网络协议 关系型数据库
【网络原理】——带你认识IP~(长文~实在不知道取啥标题了)
IP协议详解,IP协议管理地址(NAT机制),IP地址分类、组成、特殊IP地址,MAC地址,数据帧格式,DNS域名解析系统
|
10天前
|
存储 JSON 缓存
【网络原理】——HTTP请求头中的属性
HTTP请求头,HOST、Content-Agent、Content-Type、User-Agent、Referer、Cookie。
|
10天前
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
10天前
|
XML JSON 网络协议
【网络原理】——拥塞控制,延时/捎带应答,面向字节流,异常情况
拥塞控制,延时应答,捎带应答,面向字节流(粘包问题),异常情况(心跳包)
|
13天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
60 1
|
10天前
|
网络协议 算法 Java
【JavaEE】——初始网络原理
局域网,广域网,局域网连接方式,交换机,集线器,路由器,网络通信,五元组(源IP,源端口,目的IP,目的端口,协议),协议分层,TCP/IP五层网络协议,封装和分用,交换机和路由器的封装和分用
|
2月前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。