三次握手与四次挥手

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

虽然书本上学过,但是太理论讲不出来,自己理解一下写写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参数指定范围。


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2天前
|
前端开发 网络协议 JavaScript
|
2天前
|
网络协议
|
2天前
|
网络协议
TCP的三次握手和四次挥手
TCP的三次握手和四次挥手
12 0
|
2天前
|
网络协议
TCP三次握手 四次挥手
TCP三次握手 四次挥手
|
2天前
|
移动开发 网络协议 API
三次握手与四次挥手在具体函数上的体现
三次握手与四次挥手在具体函数上的体现
28 0
|
2天前
|
网络协议
理解三次握手与四次挥手
理解三次握手与四次挥手
25 0
|
2天前
|
缓存 网络协议 数据处理
TCP中的三次握手和四次挥手
我们知道TCP是运输层的面向连接的可靠的传输协议。**面向连接的**,指的就是在两个进程发送数据之前,必须先相互“握手”,确保两进程可以进行连接。并且这个传输是点对点的,即一个TCP连接中只有一个发送方和接收方;**可靠的**,指的是在任何网络情况下,在TCP传输中数据都将完整的发送到接收方。
53 0
TCP中的三次握手和四次挥手
|
2天前
|
网络协议 算法
TCP 三次握手和四次挥手
TCP 三次握手和四次挥手
33 0
TCP 三次握手和四次挥手
|
网络协议
TCP——三次握手和四次挥手
TCP——三次握手和四次挥手
107 0
TCP——三次握手和四次挥手
|
网络协议
TCP三次握手与四次挥手
TCP三次握手与四次挥手
130 0