【TCP】连接管理:三次握手和四次挥手

简介: 【TCP】连接管理:三次握手和四次挥手

连接管理

  • 建立连接:三次握手
  • 断开连接:四次挥手
    网络中的握手/挥手,就是发送不携带业务数据(没有载荷,只有报头)的数据包,但是能起到“打招呼”这样的效果。次数就是指网络通信的次数。

建立连接:三次握手

此处建立连接发送的 SYN 是同步的意思,可以延伸成:客户端希望服务器和它统一步调,来完成手续的传输

建立连接是一个“双向的操作”,连接是“抽象的连接”,代表通信双方各自保存对方的信息

  • A 需要给 B 说:我想和你建立连接(A 想保存 B 的信息),之后返回应答(ACK
  • B 也需要给 A 说:我也想和你建立连接(B 想保存 A 的信息),之后返回应答(ACK
    本来是四次握手,但是中间两次合并了,就成了三次握手,合并是很重要、很有意义的,要是分两次发送,效率就会打折扣,因为每个数据包都需要进行一系列封装分用
  • 收到 ACK/SYN 都会使报头中的对应值由 0 变为 1

三次握手的意义

三次握手要解决什么问题?为什么要三次握手?意义何在?

三个方面:

  1. 投石问路的效果,初步验证通信的链路是否畅通
    先通过一些没什么业务意义的报文,来验证一下这个路是不是通的,这是进行可靠传输的“前提条件

例如:地铁需要在每天开始第一班车之前,空跑一趟,进行“链路畅通的验证”

  1. 可以确认通信双方的发送能力和接受能力是否都正常
    除了关注中间的路线,还要关注两头的双方的接法能力是否正常

例如:你要和朋友一起玩游戏,事先你们先要确保双方的耳机和麦克风都是正常的

  1. 第一次挥手:
    - 你这边仍然都不了解双方的能力
    - 朋友那边听到“嘿”,意味着他知道了你的麦克风正常他的耳机正常。但他不知道我的耳机和他的麦克风是否正常
  2. 第二次挥手:
    - 朋友说“嘿嘿”,他仍不确定他自己的麦克风和我的耳机是否正常
    - 你听到了“嘿嘿”,你就知道了你的耳机正常朋友的麦克风正常。由于你们事先约定好了,他一定要在听到你说“嘿”之后再回复,所以你也就知道了你的麦克风正常他的耳机正常。此时,你就知道了双方的耳机和麦克风都是正常的
    - 你的验证完成
  3. 第三次挥手:
    - 我再说“嘿嘿嘿”,把我掌握的信息同步给他
    - 朋友听到“嘿嘿嘿”,由于我们实现约定好我一定是在听到他说 "嘿嘿"之后我再回复。因此,他听到了“嘿嘿嘿”,意味着他刚才说的“嘿嘿”被我收到了,他也就知道了他的麦克风正常你的耳机正常
    - 朋友的验证完成
  • 针对 TCP 来说,必须要通过三次握手来验证双方的发送和接收能力。但其他协议就不一定是三次了
  1. 让通信双方在进行通信之前,对通信过程中需要用到的一些关键参数进行协商

TCP 通信时,起始数据的序号,就是通过三次握手协商确定的(换而言之,TCP 序号并不是从 1 开始的)

  • 每次建立连接,TCP 的起始序号都不同,而且故意差别很大
  • 避免出现“前朝的剑,斩本朝的官
  • A 和 B 后来又建立连接,虽然还是 A B 两个主机之间的连接,但可能变成不同的应用程序了
  • 在传输业务数据的过程中,可能有某个数据包“迷路”了,饶了一大圈,最终才到达对端。当他到达的时候,已经“改朝换代了”,已经不是原来那个连接了
  • 针对这样的“迟到”的数据包,就要将其丢弃掉,不能按照正常的流程处理这里的数据了,避免其在新的程序中产生负面的影响
  • 对于 B 来说,就要区分当前收到的数据是“本朝”还是“前朝”的
    这样,就可以给每个连接都协商不同的起始序号,如果发现收到的数据和起始序号以及和最近收到的数据序号差别都很大的话,就视为这个数据就是“前朝”的数据

网上有些资料说“TCP 的可靠性是通过三次握手体现的”,这句话是有些问题的

  • 三次握手对于可靠性,是有一定的支持的
  • 但是不能说可靠性就是三次握手体现的
  • 因为三次握手只是建立连接的时候进行的,一旦连接建立好了之后,数据开始传输了,就和三次握手没关系了
  • 传输数据过程中的可靠性是通过“确认应答”和“超时重传”来体现的

断开连接:四次挥手

优雅地断开连接,双方各自删除掉保存的对方的信息

断开连接不一定是“客户端主动”,服务器也可以主动断开

  • 通信双方各自给对方发送FIN,各自给对方返回ACK
  • A:“B 兄,我要把你删了“==> FIN
  • B:“好的“==> ACK
  • B:“A 兄,那我也把你给删了哦”==> FIN
  • A:“好的”==> ACK

三次握手和四次挥手的执行区别

三次握手,只有三次是因为中间两次的交互合并在一起了。但对于四次握手来说,中间两次却不一定能合并(大概率是不能)

  • 因为对于三次握手来说,中间的两次(ACK+SYN)都是在内核中由操作系统负责进行的,时间都是在收到 SYN 之后,此时同一时机,就可以合并了
  • 对于四次挥手来说,ACK是由内核控制的(就是说系统只要收到FIN就会立刻返回一个ACK),但是FIN的触发则是通过应用层程序调用close / 进程退出来触发的
  • 代码中:socket.close() ==>系统内部:发送 FIN
  • 如果代码没有执行 close(),系统内部就不会发送 FIN,所以中间发送 ACKFIN 之间是有时间间隔

TCP的状态

  • LISTEN:服务器进入的状态,服务器把端口绑定好,就相当于进入了 LISTEN 状态,此时服务器就已经初始化完毕,准备好随时迎接客户端了(手机开机,信号良好,随时可以有人打电话
  • ESTABLISHEDTCP 连接建立完成(保存好了对方的信息了),接下来就可以进行业务数据的通信了(电话接通,可以说话
  • CLOSE_WAIT:被动断开连接的一方会进入的状态,先收到FIN的一方。等待代码执行close方法。
  • 如果发现服务器这边存在大量的 CLOSE_WAIT 状态的 TCP 连接,说明了什么?
  • 说明此时服务器代码可能有 bug,排查 close 是否写了或者是否执行到了
  • TIME_WAIT:主动断开连接的一方会进入的状态,此处的TIME_WAIT按照时间来等待,达到一定时间后,连接也就释放了
  • 为什么不直接释放呢?
  • TCP 传输过程中,任何一个数据都会丢包,但丢包重传就好了,只要此处的连接还在,就能很好的处理这里的重传操作。保留 TIME_WAIT 状态就是为防止最后一个 ACK 丢包,这样即使丢包了也能进行重传
  • 如果最后一个 ACK 丢包了,此时 B 这边就会重传一次 FIN,需要 A 这边再发一次 ACK,但能够再发一次 ACK 的前提是 A 这边的连接还没有释放(如果连接释放了,就不知道对方的信息,无法返回任何数据了)
  • 如果 TIME_WAIT 状态保留了一段时间后,也没有收到重传的 FIN,就说明刚才的 ACK 应该就是到了,就可以释放这里的连接了
  • TIME_WAIT 存在的时间称为 2MSLMXL ==>数据包在网络传输中消耗的最大时间))


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
开发者
UOS系统如何给软件签名
UOS系统如何给软件签名
UOS系统如何给软件签名
|
6月前
|
数据可视化 Java 开发工具
在分支回滚后,如何恢复被回滚的代码?
在分支回滚后,如何恢复被回滚的代码?
1099 8
|
10月前
|
存储 人工智能 缓存
DeepSeek 开源周第三弹!DeepGEMM:FP8矩阵计算神器!JIT编译+Hopper架构优化,MoE性能飙升
DeepGEMM 是 DeepSeek 开源的专为 FP8 矩阵乘法设计的高效库,支持普通和混合专家(MoE)分组的 GEMM 操作,基于即时编译技术,动态优化矩阵运算,显著提升计算性能。
1029 3
DeepSeek 开源周第三弹!DeepGEMM:FP8矩阵计算神器!JIT编译+Hopper架构优化,MoE性能飙升
|
Windows
在VsCode上调试Cocos2d-x lua项目
在VsCode上调试Cocos2d-x lua项目
1501 0
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
331 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
存储 NoSQL MongoDB
Redis在中国火爆,为何MongoDB更受欢迎国外?
本文介绍了Redis和MongoDB的基本概念及其在GitHub Star、DB-Engines Ranking和Google Trends中的数据对比。Redis是一个基于内存的键值对存储数据库,适合快速读写场景;MongoDB则是面向文档的数据库,支持大规模数据存储和复杂查询。全球范围内,MongoDB的搜索热度高于Redis,但在中国市场,Redis更受欢迎,因其高性能和低延迟特性满足了中国互联网公司对高并发的需求。总结部分分析了两者的特点及适用场景,并结合中美两国的行业背景解释了其受欢迎程度的不同原因。
420 1
计算机组成原理——浮点数加减运算&强制类型转换
计算机组成原理——浮点数加减运算&强制类型转换
1606 0
计算机组成原理——浮点数加减运算&强制类型转换
|
设计模式 C++
C++设计模式:面试题精选集
C++设计模式:面试题精选集
554 0
|
网络协议 网络架构
字节填充与0比特填充以及数据链路的基本问题
字节填充与0比特填充以及数据链路的基本问题
1144 0
|
弹性计算 大数据 测试技术
2024年阿里云服务器价格表来了,最低61元一年起!
2024年阿里云服务器价格表来了,最低61元一年起!云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服务器30元3个月,幻兽帕鲁4核16G和8核32G服务器配置,云服务器ECS可以选择经济型e实例