三次握手与四次挥手

简介: 三次握手与四次挥手

虽然书本上学过,但是太理论讲不出来,自己理解一下写写4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com)

三次握手过程😀

过程图

总结性的理解

为了方便起见,我们简单的定义一下:

  • :这是一个打招呼的语句,类似打电话,在上图代表SYN
  • 你好:这是一个代表确认收到的消息,就像打电话收到听到对方说话后的回应。在上图代表ACK
  • 两者约定你好数量需要对应,才是正确的接收,否则对方就是假冒者!说出 “滚!
  • :代表拒绝或者关闭连接

于是整个三次握手的过程就变为了

客户端 时间 服务端
"喂?"
"喂?你好!"
“你好!……”
可以总结出一些特点:
  • 第三次握手是可以携带数据的,前两次握手是不可以携带数据的
  • 序列号和确认号是保证TCP通信稳定性的关键因素

为什么是三次握手?不是两次

下面讨论一下两次握手的情况。在这种情况下,服务端听到了 喂? 就立马进入连接就绪状态;客户端听到服务端的"喂?你好!" 后也进入连接就绪状态。

  1. 三次握手才可以阻止重复历史连接的初始化(主要原因) 考虑一个场景,客户端先说了 喂? 因为网络太差了,服务端很久都没听到。
    于是客户端又说了 喂喂?,这时网络恢复了(或者第一个终于传到了),服务端赶紧说了一声 你好,然后进入连接就绪状态听接下来讲什么
    但是客户端认为你没有按照我们的约定说你好你好,于是认为他是假冒者,说出了。服务器听到后,只能无奈断开连接。
    过了好久,服务端终于听到了喂喂?,赶紧说了一声 你好你好!,然后进入连接就绪状态听接下来讲什么。这次没出问题,客户端听到
  2. 三次握手才可以同步双方的初始序列号
  3. 三次握手才可以避免资源浪费

为什么不是四次?

三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数

小结

TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用「两次握手」和「四次握手」的原因:

  • 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
  • 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数

四次挥手过程😘

过程图

可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手

这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。

为什么挥手需要四次?

再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACKFIN 一般都会分开发送,因此是需要四次挥手。

为什么 TIME_WAIT 等待的时间是 2MSL?

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL 字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。

比如,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 FIN 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。

可以看到 2MSL时长 这其实是相当于至少允许报文丢失一次。比如,若 ACK 在一个 MSL 内丢失,这样被动方重发的 FIN 会在第 2 个 MSL 内到达,TIME_WAIT 状态的连接可以应对。

TIME_WAIT 过多有什么危害?

过多的 TIME-WAIT 状态主要的危害有两种:

  • 第一是占用系统资源,比如文件描述符、内存资源、CPU 资源、线程资源等;
  • 第二是占用端口资源,端口资源也是有限的,一般可以开启的端口为 32768~61000,也可以通过 net.ipv4.ip_local_port_range参数指定范围。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8月前
|
前端开发 网络协议 JavaScript
|
2月前
|
网络协议
三次握手,四次挥手
【10月更文挑战第25天】三次握手和四次挥手是 TCP 协议中确保可靠网络通信的重要机制,它们通过一系列的交互过程,保证了连接的正确建立和有序关闭,以及数据的可靠传输和资源的合理释放,从而为网络应用提供了稳定、可靠的通信基础。
|
8月前
|
网络协议
TCP三次握手和四次挥手
TCP三次握手和四次挥手
|
8月前
|
网络协议
TCP的三次握手和四次挥手
TCP的三次握手和四次挥手
45 0
|
8月前
|
缓存 网络协议 数据处理
TCP中的三次握手和四次挥手
我们知道TCP是运输层的面向连接的可靠的传输协议。**面向连接的**,指的就是在两个进程发送数据之前,必须先相互“握手”,确保两进程可以进行连接。并且这个传输是点对点的,即一个TCP连接中只有一个发送方和接收方;**可靠的**,指的是在任何网络情况下,在TCP传输中数据都将完整的发送到接收方。
73 0
TCP中的三次握手和四次挥手
|
8月前
|
网络协议 算法
TCP 三次握手和四次挥手
TCP 三次握手和四次挥手
96 0
TCP 三次握手和四次挥手
|
8月前
|
移动开发 网络协议 API
三次握手与四次挥手在具体函数上的体现
三次握手与四次挥手在具体函数上的体现
56 0
|
8月前
|
网络协议
理解三次握手与四次挥手
理解三次握手与四次挥手
56 0
|
网络协议
TCP——三次握手和四次挥手
TCP——三次握手和四次挥手
141 0
TCP——三次握手和四次挥手