本篇会加入个人的所谓鱼式疯言
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
引言
在数字化时代,我们几乎无时无刻不在与网络进行着无声的对话。无论是在线购物、视频会议,还是简单的网页浏览,背后都离不开一种看似简单却又极其复杂的技术—— 传输控制协议(TCP)。
它确保了数据的可靠传输,是网络通信的基石。然而,TCP连接的建立和终止过程,即所谓的 “三次握手"和"四次挥手”,却充满了技术细节和策略考量。本文将深入探讨这一过程,揭示其背后的原理和重要性,为读者提供一个全面的视角,以理解网络通信的这一核心机制。
目录
-
三次握手和四次握手的初识
-
三次握手
-
四次挥手
一. 三次握手和四次挥手的初识
在Tcp 中有一种特殊的连接管理机制, 我们称之为 “三次握手, 四次挥手”
在Tcp中, 握手和挥手只是代表 连接 的含义。
上回我们说到, 对于网络上的连接来说:
连接并不是物理上的用绳子来连接。
而是 双方都保存对方 的
信息
称之为“连接”
。
双方都不保存对方 的
信息
称之为“断开连接”
。
而
三次握手
就是 建立连接 的过程,四次挥手
就是 断开连接 的过程。
下面跟着小编来深度学习面试常考内容——三次握手,四次挥手吧~ 💖 💖 💖 💖
二. 三次握手
1. 三次握手的流程步骤
首先,客户端向服务器发送请求: 会发送一个
Syn
的标志位 的数据报, 并设置syn = 1
,就是告诉服务器 这个客户端想和它进行连接。
于是, 当服务器接收到了 客户端发来是
Syn
的数据报, 就会开始 建立连接 , 并且返回一个应答报文 Ack
和 一个Syn
的数据报。 发送Ack
是代表反馈给 客户端已经接收你需要连接的请求了, 发送Syn
是告诉客户端: 服务器也想和该客户端建立连接 。
由于这两次
Syn
和Ack
是接收到 客户端发来的 Syn 时就会发送的, 所以Tcp
就会把 这两次发送合并成一次发送, 以此提高 连接效率 。
最后当接收到对方的
Ack
就感知到了 对方已经连接好了 ,同时接收到了Syn
并且自己也连接好就返回Ack
给对方, 让对方也感受到 两端都连接好了 。
鱼式疯言
补充细节:
-
上面的栗子是客户端作为发送方, 但是在一些情况下, 服务器也可以作为发送方。
-
syn
全英文:synchronized
翻译: 同步化 ,锁 。
在 多线程 中, 是
锁
含义, 用于解决 线程安全问题 。
在 Tcp 中, 是
同步化
的含义, 小编的理解就是 ; 用于 同步连接 的消息
- 有小伙伴问了, 如果是在 三次握手 的期间, 出现了
丢包情况
, 依然还是会进行 超时重传的 , 仍然是可以保证三次握手的 正常进行 的。
2. 三次握手的 “三次”
有小伙伴就问了?
为啥 三次握手,不是两次握手 呢?
其实从上面的流程中, 可以看出 三次握手
第一次: 客户端 发送
Syn
的数据包来表示希望服务器进行连接, 可以认为是 连接的开始 。
第二次: 服务器返回
Ack
并且发送Syn
希望对端连接么,可以认为是 连接的进行 。
第三次: 客户端确定接受了上述的 所有需求并完成 ,所以返回
Ack
表示 , 可以认为的是 连接的结束 。
三者缺一不可, 一旦 缺少一步 , 连接很有 可能会失败
。
为啥是 三次握手, 不是四次握手 呢?
主要原因还是因为第二次的发送过程, 系统内核为了提升效率,就把需要反馈给 客户端的 Ack
和 发送给 客户端请求连接的 Syn
。
就好比小爱同学很懒, 有一天她在看电视, 突然觉的很渴, 但是自己又不想起来, 就等下次。 等他想上厕所了, 于是就 上完厕所顺便喝水 , 从而 提高效率 。
就像上面
这里就可以多 减少一次发送的次数
, 从而 加快两个端口的连接 。
3. 三次握手的优势
- 投石问路 , 用于保证通信链路的 完整传输
栗子说明 :
不知道小伙伴们有没有坐过早班的 第一趟地铁 , 是不是都是没什么人呢!
但是早班的第一趟地铁并不是第一趟的, 在第一趟之前, 还有一趟 提前开一趟空车。
开空车的原因: 用于 检查通信链路的完整 ,保证链路不出意外 , 如果是空车还能 及时的调整 , 如果承载有人的车就会调整就很不方便了, 以此提前的空车就起到 投石问路 的效果
- 确定通信双方的
发送能力
和接收能力
假设有一天我和女神 联机打游戏
首先小编作为发送方, 女神作为接收方
我: 喂,听得到吗?
当女神听到这句话,就知道了,我的麦克风和女神的耳机是没有问题的 。
然后女神就要回了, 在回我的同时也可以顺便检查女神的麦克风和我的耳机是否正常。
女神: 听的到, 你听得到我吗?
当我听到这句话了,前面的我问的是, 听得到吗? 当她回我听得到, 说明我的麦克风和她的耳机都是没有问题的, 然后她再问我听得到吗? 于是我听到了, 说明 她的麦克风和我的耳机都是没有问题的。
我说: 听得到,我们可以说话了。
最后都说明 两边的耳机和麦克风都没有问题 , 最后我要把这个消息传送回女神, 就可以让两边都感知到
连接没有问题
, 正常通信 了。
这里的 耳机 就代表 接收能力
, 这里的 麦克风 就代表 发送能力
。
通过上面的 三次握手
的方式, 就能形象的体现确认 发送能力和接收能力 是否 良好
。
- 防止前朝的剑斩当朝的官即: 防止 过时数据 的传输。
这句话就是说, 防止因为中间数据包传输 停滞了很久才返回 。
上述过程就是,防止有一段
数据包
在 中途迷路 了, 当经过一段期间,
在此的期间,就会出现了 两台主机的断连, 又出现了 两台主机重新连接 , 但是很有
可能在不同的应用程序
上运行了。
而在三次握手期间,每一次连接都会更新不同的
数据序号包
, 只需要比对 发送过来的数据序号包 和当前端口的序号
差异是不是很大, 如果很大的话, 就说明是前朝
的数据, 就进行 直接丢弃。
鱼式疯言
补充说明:
对于上面提及的 序列号, 并不是说都是从
1
开始的, 而是 每次连接 都是会设置 不同的序列号 , 以此来防止过时数据
的发送。
三. 四次挥手
1. 四次挥手的流程步骤
我们知道四次挥手的过程其实就是 关闭连接 的过程
我们假设主动断开连接的一方为 客户端
, 被动断开连接的一方为 服务器
。
首先: 由客户端 先设置 fin
的标志位为 1
, 并发送 给服务器, 希望服务器断开连接。
然后服务器接受到了 客户端 fin
的标志位为 1 的报文, 于是就触发了 ack
返回给客户端以确认 fin 的发送。
随后服务器也发送一个 fin
以此来表示 服务器也 希望客户端同时也关闭连接。
最后 客户端接收到了 , 也返回一个带有 ack
的报文。
鱼式疯言
服务器和客户端都有可能成为 主动发送到一方 或者 被动发送的一方 。
2. 四次挥手的 “四次”
有小伙伴问了, 为啥这次偏偏是四次挥手呢?
其实在断开连接的过程中, fin
与 ack
不同的是
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 是否被接收的。
总结
-
三次握手和四次挥手的初识: 三次握手是 建立连接 的过程, 四次挥手是
断开连接
的过程, 连接就是通信双方保存对方的信息的过程的理解。 -
三次握手: 三次握手的过程, 以及三次握手为何是三次, 和它的优势:
投石问路
, 确定通信双方接收和发送的能力 , 防止前朝的剑斩当朝的官。 -
四次挥手: 四次挥手的过程, 已经四次挥手为何是四次, 最后就是 断开连接前后过程中 的不同的状态表示。
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖