TCP的连接管理机制(三次握手与四次挥手)

简介: TCP的连接管理机制(三次握手与四次挥手)

为啥要三次握手与四次挥手


相比于UDP, TCP是有连接的, 这个连接就体现在这了.


三次握手就是TCP建立连接, 四次挥手就是TCP断开连接.


三次握手


握手是指通信双方进行网络交互.

三次握手就相当于是 客户端与服务器间通过三次交互来建立连接关系.

(建立连接关系, 本质就是双方记录对方信息)


要了解三次握手, 首先我们还得来了解 syn报文 与 ack报文.


syn 与 ack


syn 称为同步报文段, 意思是一方要向另一方申请建立连接.

ack 是确认字符, 表示发来的数据已经接收无误.


报文具体结构是怎样的呢?


dfcc634e1729447aa2bc10bd3e96bc2a.png

什么样的报文是 syn 报文呢?

观察TCP报头结构, 我们可以看到在 16为窗口大小 左边有六个特殊比特位, 这些比特位默认为0, 如果为 1, 则表示其特殊含义.

比如, 第二位是 ack, 如果这一位为 1, 则表示当前数据报是一个应答报文.

同样的, 第五位是 syn, 如果为 1, 则表示当前数据报是一个同步报文.

如果一个TCP数据报, 第二位和第五位都是1, 那么就是 ack + syn 报文.


三次握手具体流程


如下图 :

c7a0de10f5d644c1addfddcfa6d78347.png


  1. 客户端请求同步, 也就是发送 syn.
  2. 服务器接收到 syn, 就需要进行应答, 就发送了 ack, 同时也要与客户端请求同步, 就发送了 syn, 因为是同时发生的, 所以就包含在了一个数据报中, 也就是一次握手了.
  3. 客户端接收到数据报后, 也要返回一个响应, 表示收到数据报, 就返回 ack.


其实三次握手就相当于投石问路, 测试客户端与服务器是否具有发送与接收数据的能力.

这是后续可靠传输的基础.

我们可以类比成两个人在网上进行语音通话 :


当甲乙双方连上麦后, 就得测试一下是否有问题.

首先甲说一句 : “听得到我说话吗?”

乙听到后就得响应甲, 说 : “听到了, 你听到我说话吗?” (这里乙就知道了, 甲的发送能力没问题, 乙的接收能力也没问题)

甲听到乙说话后, 就再回一句 : “听到了” (这里甲就知道了, 乙的接收发送能力没问题, 甲的接收发送也没问题)

最后就是乙收到甲的消息, 明白了甲的接收能力没问题, 乙的发送也没问题.

至此, 甲乙双方都测试出了两方的发送与接收没问题.


注意 :


上述过程是内核自动完成, 应用程序干预不了.

等到三次握手完成后, 就建立连接了, 服务器的 accept 把建立好的连接从内核拿到应用程序中.


四次挥手


就是双方断开连接, 来看下图 :


4c287115ee57489fa80cf88b0570857e.png


  1. 客户端向服务器发送 fin(结束报文), 通知服务器 “我要与你断开连接了”.
  2. 服务器收到后, 就返回 ack, 就是响应服务器的通知, 相当于 “我知道了”.
  3. 服务器执行到了 clos 方法后也发送通知, 说 “我也要与你断开连接了”.
  4. 客户端收到后返回 ack 响应, 相当于说 “好的”.

我们这情况很类似与三次握手, 是否可以把四次挥手变为三次挥手呢? (将ack与fin和并)

其实, ack 与 fin 是有一定的概率和并的, 但通常情况下不能和并.

为什么三次握手的第二次握手能和并, 而这里就不行呢?


三次握手, ack 和 syn 都是在同一时机触发的 (都是内核来完成的)

四次挥手, ack 与 fin 的触发时机不同.


ack 是内核完成的, 在收到 fin 的第一时间会返回.

fin 则是应用程序代码控制的, 在调用 socket 的 close 的方法的时候才会返回 fin.


如果趁着 ack 还没发就 close, 则可以进行和并.


其实客户端之所以发送 fin, 也是因为客户端进程执行到了 close 方法(即使代码中没有调用 close 方法, 在进程结束时也会自动进行执行 close), 释放资源.

此时客户端进程虽然结束了, 但是 tcp 连接还在, 内核还是会把 tcp 连接继续维护, 直到四次挥手完成. 服务这边也是一样.


注意


建立连接, 一定是客户端先发起.

断开连接, 双方都有可能先发起.


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
11月前
|
Java 中间件 调度
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
402 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
|
运维 监控 安全
|
监控 负载均衡 网络协议
TCP重传与超时机制:解锁网络性能之秘
TCP重传与超时机制:解锁网络性能之秘
4078 0
|
编解码 开发工具 计算机视觉
鸿蒙5.0版开发:命令行工具(mediatool工具)
在HarmonyOS 5.0的开发中,命令行工具mediatool基于FFmpeg库,提供了丰富的媒体处理功能,如视频和音频的转码、封装格式转换、提取媒体信息等。本文详细介绍mediatool的功能和使用方法,并提供代码示例。
608 6
|
存储 安全 程序员
|
JavaScript API
一文搞懂Vue3中watch和watchEffect区别和用法!
前言 使用过 Vue 的小伙伴,不管时 Vue2 还是 Vue3,我相信你都用过 Vue 中的监听器。监听器的作用就和它的名字一样:用来监听某个东西是否发生变化!我们很多需求都会用到监听器 watch,但是 Vue2 和 Vue3 中的监听器的用法有些许不一样,这就让一些从 Vue2 转 Vue3 的小伙伴不太适应,所以,我们今天就来好好学一学 Vue3 中的监听器如何使用!
2167 0
一文搞懂Vue3中watch和watchEffect区别和用法!
|
网络协议 安全
揭秘TCP背后的秘密:为何三次握手是连接的灵魂,四次挥手是告别的艺术,让数据传输稳如老狗!
【8月更文挑战第4天】TCP为何需三次握手和四次挥手?三次握手确保连接建立时双方均准备好并确认序列号,过程包括:客户端发SYN包;服务器回应SYN+ACK;客户端再回ACK确认,确保可靠通信。四次挥手则确保连接终止时双方能安全、有序地结束数据传输,包括客户端发FIN包;服务器回应ACK并可能继续发送数据;完成后发FIN包;客户端最终确认,确保无数据丢失或状态不一致。
255 9
|
网络协议
【网络原理】TCP 协议中比较重要的一些特性(一)
【网络原理】TCP 协议中比较重要的一些特性(一)
341 0
|
网络协议 算法
TCP 三次握手和四次挥手
TCP 三次握手和四次挥手
340 0
TCP 三次握手和四次挥手
|
设计模式 算法 JavaScript
祖传代码:代码背后的历史与文化价值
祖传代码:代码背后的历史与文化价值
266 0

热门文章

最新文章