三次握手与四次挥手

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

虽然书本上学过,但是太理论讲不出来,自己理解一下写写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
相关文章
|
6天前
|
前端开发 网络协议 JavaScript
|
5天前
|
网络协议
TCP的三次握手和四次挥手
TCP的三次握手和四次挥手
14 0
|
6天前
|
移动开发 网络协议 API
三次握手与四次挥手在具体函数上的体现
三次握手与四次挥手在具体函数上的体现
29 0
|
6天前
|
网络协议
理解三次握手与四次挥手
理解三次握手与四次挥手
25 0
|
9月前
|
网络协议
断开连接的四次挥手
网络请求时断开连接是咋么进行挥手的呢?
92 1
|
网络协议
TCP三次握手与四次挥手
TCP三次握手与四次挥手
131 0
|
网络协议
TCP三次握手、四次挥手
快速学习TCP三次握手、四次挥手
TCP三次握手、四次挥手
|
网络协议
TCP的三次握手与四次挥手
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个链接,通过四次挥手来关闭一个连接。当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据。
|
网络协议
三次握手-四次挥手
三次握手-四次挥手
90 0