【网络原理】❤️Tcp 连接管理机制❤️ “三次握手” “四次挥手”的深度理解, 面试最热门的话题,没有之一, 保姆式教学 !!!

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

引言

在数字化时代,我们几乎无时无刻不在与网络进行着无声的对话。无论是在线购物、视频会议,还是简单的网页浏览,背后都离不开一种看似简单却又极其复杂的技术------ 传输控制协议(TCP)。

它确保了数据的可靠传输,是网络通信的基石。然而,TCP连接的建立和终止过程,即所谓的 "三次握手"和"四次挥手",却充满了技术细节和策略考量。本文将深入探讨这一过程,揭示其背后的原理和重要性,为读者提供一个全面的视角,以理解网络通信的这一核心机制。

目录

  1. 三次握手和四次握手的初识

  2. 三次握手

  3. 四次挥手

一. 三次握手和四次挥手的初识

在Tcp 中有一种特殊的连接管理机制, 我们称之为 "三次握手, 四次挥手"

在Tcp中, 握手和挥手只是代表 连接 的含义。

上回我们说到, 对于网络上的连接来说:

连接并不是物理上的用绳子来连接。

而是 双方都保存对方 的 信息 称之为 "连接"
双方都不保存对方 的 信息 称之为 "断开连接"
三次握手 就是 建立连接 的过程, 四次挥手 就是 断开连接 的过程。

下面跟着小编来深度学习面试常考内容------三次握手,四次挥手吧~ 💖 💖 💖 💖

二. 三次握手

1. 三次握手的流程步骤

首先,客户端向服务器发送请求: 会发送一个 Syn 的标志位 的数据报, 并设置 syn = 1 ,就是告诉服务器 这个客户端想和它进行连接。
于是, 当服务器接收到了 客户端发来是 Syn 的数据报, 就会开始 建立连接 , 并且返回一个 应答报文 Ack 和 一个 Syn 的数据报。 发送 Ack 是代表反馈给 客户端已经接收你需要连接的请求了, 发送 Syn 是告诉客户端: 服务器也想和该客户端建立连接
由于这两次 SynAck 是接收到 客户端发来的 Syn 时就会发送的, 所以 Tcp 就会把 这两次发送合并成一次发送 , 以此提高 连接效率 。
最后当接收到对方的 Ack 就感知到了 对方已经连接好了 ,同时接收到了 Syn 并且自己也连接好就返回 Ack 给对方, 让对方也感受到 两端都连接好了 。

鱼式疯言

补充细节

  1. 上面的栗子是客户端作为发送方, 但是在一些情况下, 服务器也可以作为发送方。

  2. syn 全英文: synchronized 翻译: 同步化

在 多线程 中, 是 含义, 用于解决 线程安全问题
在 Tcp 中, 是 同步化 的含义, 小编的理解就是 ; 用于 同步连接 的消息
3. 有小伙伴问了, 如果是在 三次握手 的期间, 出现了 丢包情况 , 依然还是会进行 超时重传的 , 仍然是可以保证三次握手的 正常进行 的。

2. 三次握手的 "三次"

有小伙伴就问了?

为啥 三次握手,不是两次握手 呢?

其实从上面的流程中, 可以看出 三次握手

第一次: 客户端 发送 Syn 的数据包来表示希望服务器进行连接, 可以认为是 连接的开始 。
第二次: 服务器返回 Ack 并且发送 Syn 希望对端连接么,可以认为是 连接的进行 。
第三次: 客户端确定接受了上述的 所有需求并完成 ,所以返回 Ack 表示 , 可以认为的是 连接的结束 。

三者缺一不可, 一旦 缺少一步 , 连接很有 可能会失败

为啥是 三次握手, 不是四次握手 呢?

主要原因还是因为第二次的发送过程, 系统内核为了提升效率,就把需要反馈给 客户端的 Ack 和 发送给 客户端请求连接的 Syn

就好比小爱同学很懒, 有一天她在看电视, 突然觉的很渴, 但是自己又不想起来, 就等下次。 等他想上厕所了, 于是就 上完厕所顺便喝水 , 从而 提高效率

就像上面

这里就可以多 减少一次发送的次数 , 从而 加快两个端口的连接 。

3. 三次握手的优势

  1. 投石问路 , 用于保证通信链路的 完整传输

栗子说明

不知道小伙伴们有没有坐过早班的 第一趟地铁 , 是不是都是没什么人呢!

但是早班的第一趟地铁并不是第一趟的, 在第一趟之前, 还有一趟 提前开一趟空车

开空车的原因: 用于 检查通信链路的完整 ,保证链路不出意外 , 如果是空车还能 及时的调整 , 如果承载有人的车就会调整就很不方便了, 以此提前的空车就起到 投石问路 的效果

  1. 确定通信双方的 发送能力接收能力

假设有一天我和女神 联机打游戏

首先小编作为发送方, 女神作为接收方

我: 喂,听得到吗?

当女神听到这句话,就知道了,我的麦克风和女神的耳机是没有问题的 。
然后女神就要回了, 在回我的同时也可以顺便检查女神的麦克风和我的耳机是否正常。

女神: 听的到, 你听得到我吗?

当我听到这句话了,前面的我问的是, 听得到吗? 当她回我听得到, 说明我的麦克风和她的耳机都是没有问题的 , 然后她再问我听得到吗? 于是我听到了, 说明 她的麦克风和我的耳机都是没有问题的。

我说: 听得到,我们可以说话了。

最后都说明 两边的耳机和麦克风都没有问题 , 最后我要把这个消息传送回女神, 就可以让两边都感知到 连接没有问题, 正常通信 了。

这里的 耳机 就代表 接收能力, 这里的 麦克风 就代表 发送能力

通过上面的 三次握手 的方式, 就能形象的体现确认 发送能力和接收能力 是否 良好

  1. 防止前朝的剑斩当朝的官 即: 防止 过时数据 的传输。

这句话就是说, 防止因为中间数据包传输 停滞了很久才返回 。

上述过程就是,防止有一段 数据包 在 中途迷路 了, 当经过一段期间,
在此的期间,就会出现了 两台主机的断连 , 又出现了 两台主机重新连接 , 但是很有 可能在不同的应用程序 上运行了。
而在三次握手期间,每一次连接都会更新不同的 数据序号包 , 只需要比对 发送过来的数据序号包 和 当前端口的序号 差异是不是很大, 如果很大的话 , 就说明是 前朝 的数据, 就进行 直接丢弃

鱼式疯言

补充说明

对于上面提及的 序列号, 并不是说都是从 1 开始的, 而是 每次连接 都是会设置 不同的序列号 , 以此来 防止过时数据 的发送。

三. 四次挥手

1. 四次挥手的流程步骤

我们知道四次挥手的过程其实就是 关闭连接 的过程

我们假设主动断开连接的一方为 客户端 , 被动断开连接的一方为 服务器

首先: 由客户端 先设置 fin 的标志位为 1并发送 给服务器, 希望服务器断开连接。

然后服务器接受到了 客户端 fin 的标志位为 1 的报文, 于是就触发了 ack 返回给客户端以确认 fin 的发送。

随后服务器也发送一个 fin 以此来表示 服务器也 希望客户端同时也关闭连接

最后 客户端接收到了 , 也返回一个带有 ack 的报文。

鱼式疯言

服务器和客户端都有可能成为 主动发送到一方 或者 被动发送的一方

2. 四次挥手的 "四次"

有小伙伴问了, 为啥这次偏偏是四次挥手呢?

其实在断开连接的过程中, finack 不同的是

ack 是 系统内核 去调度的, 当有一端 有报文发送时 , 就会触发 ack 报文的返回给发送的那一方。
fin 是 应用程序 调度的, 只有当 程序执行到 close() 方法/ 进程结束时 , 才会发送 fin
上次的调用过程是不一样的, 所以触发的时间是很有可能不相同, 很有可能被动关闭的一方先接收到 fin 就直接返回ack , 而程序需要执行多行代码, 才会执行到 close() , 才会发送 fin

所以两者一般情况下是不能合并的 , 所以才有 中间两次的发送 。

鱼式疯言

一般情况下不能合并, 并不是说一定不能合并 , 在一些特殊的协议中就更有可能出现 三次挥手 的情况。

3. 连接的不同状态

在不同连接的状态下, Tcp也会呈现的不同状态。 用于确保 建立连接 和 关闭连接 的可靠。

下面小编重要是介绍以下几个状态: ESTABLISHED , CLOSE_WAIT , TIME_WAIT

<1>. ESTABLISHED

这是两端都 都建立好了连接 , 可以进行业务上的 正常通信 的状态。

也就相当于双方都接通好了电话 , 可以 正常打电话 的状态。

<2>. CLOSE_WAIT

这是 被动关闭连接的一端 , 就会进入这个状态, 接收到 fin 之后, 等待代码执行到 close 方法。

鱼式疯言

如果发送 服务器这端 出现了大量的 CLOSE_WAIT 的状态, 就表示代码 执行不到 close 方法 , 就说明服务器这端代码出现了 BUG 了。

<3>. TIME_WAIT

这是 主动关闭连接的一端 , 就会进入这个状态, 就进入 等待系统设置好的一段时间 , 延迟过了 系统设置好的时间 才执行 close 方法 。

之所以设置一个等待的时间, 就是为了防止返回到 ack 丢包 , 如果一旦 ack 丢包 , 当 主动断开连接的一方 就会在系统设置好的一定时间里等待 , 对端就会进行 重传操作 ,重新发送 fin , 就需要主动断开连接的一方 重新发送 ack
对于能不能重新发送ack 的前提是, 这端是还没断开连接的, 所以主动连接的一方就需要在一定时间内等待, 保证 连接断开的完整性 。

鱼式疯言

一般而言

设置的等待时间为: 2*MSL

MSL 即为 数据包在网络通路传递过程中所需要消耗的最大时间 , 所以 2 倍的MSL 是可以检查 ack 是否被接收的

总结

  • 三次握手和四次挥手的初识: 三次握手是 建立连接 的过程, 四次挥手是 断开连接 的过程, 连接就是通信双方保存对方的信息的过程的理解。

  • 三次握手: 三次握手的过程, 以及三次握手为何是三次, 和它的优势: 投石问路 , 确定通信双方接收和发送的能力 , 防止前朝的剑斩当朝的官

  • 四次挥手: 四次挥手的过程, 已经四次挥手为何是四次, 最后就是 断开连接前后过程中 的不同的状态表示。

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

相关推荐
理想不理想v6 分钟前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
方方怪40 分钟前
与IP网络规划相关的知识点
服务器·网络·tcp/ip
sszmvb12341 小时前
测试开发 | 电商业务性能测试: Jmeter 参数化功能实现注册登录的数据驱动
jmeter·面试·职场和发展
测试杂货铺1 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
王佑辉1 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
真忒修斯之船1 小时前
大模型分布式训练并行技术(三)流水线并行
面试·llm·aigc
weixin_442643422 小时前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统
ZL不懂前端2 小时前
Content Security Policy (CSP)
前端·javascript·面试
阑梦清川2 小时前
JavaEE初阶---网络原理(五)---HTTP协议
网络·http·java-ee
测试界萧萧2 小时前
外包干了4年,技术退步太明显了。。。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展