从另一个视角理解TCP握手、挥手与可靠传输

本文将深入探讨 TCP 协议中三次握手、四次挥手的原理,以及其保证可靠传输的机制。

一、三次握手:为何是三次,而非两次?

建立 TCP 连接的过程犹如一场严谨的 “对话”,需要经过三次握手才能确保通信双方的可靠连接。

三次握手的具体流程

第一次握手:客户端率先向服务端发送带有 SYN(SEQ=x)标志的数据包,随后进入 SYN_SEND 状态,此时客户端如同一位等待回应的信使,它不清楚服务端的任何状况。而服务端接收到该数据包后,确认了客户端具备发送能力,同时也确认自身接收功能正常。

第二次握手:服务端回应客户端,发送带有 SYN + ACK (SEQ=y, ACK=x + 1) 标志的数据包,进入 SYN_RECV 状态。客户端接收到此数据包后,不仅确认自己的发送和接收功能正常,还确认了服务端的发送和接收同样正常。

第三次握手:客户端再次向服务端发送带有 ACK (ACK=y + 1) 标志的数据包,随后客户端和服务端双双进入 ESTABLISHED 状态,至此三次握手完成,双方可以开启数据传输之旅。此时,双方都明确彼此的发送和接收功能均处于正常状态。

两次握手的缺陷

网络环境复杂多变,丢包问题时有发生。若仅进行两次握手,当第二次握手时服务端发给客户端的确认报文丢失,就会出现严重问题。此时,服务端认为连接已建立并准备接收和处理数据,而客户端由于未收到确认报文,不会发送数据,并且会忽略服务端后续的数据。然而,若采用三次握手,即便客户端发送的确认报文丢失,服务端在一段时间内未接收到,就会重新发起第二次握手,从而保障连接建立的可靠性。

二、四次挥手:为什么断开连接需要4次?

当数据传输任务完成,TCP 连接的断开同样需要遵循严谨的流程,即四次挥手。

四次挥手的详细步骤

第一次挥手:客户端向服务端发送带有 FIN(SEQ=x)标志的数据包,表明客户端到服务端的数据传送即将结束,随后客户端进入 FIN - WAIT - 1 状态。这就像是客户端告知服务端:“我这边的数据已经发送完毕啦”。

第二次挥手:服务端收到客户端的 FIN 数据包后,向客户端发送 ACK (ACK=x + 1)标志的数据包,确认收到客户端的断开请求,服务端进入 CLOSE - WAIT 状态,客户端则进入 FIN - WAIT - 2 状态。此时,服务端可能还有数据需要继续发送。

第三次挥手:当服务端完成剩余数据的发送后,向客户端发送 FIN (SEQ=y) 标志的数据包,请求关闭连接,自身进入 LAST - ACK 状态。这一步相当于服务端回应客户端:“我这边的数据也发完了,我们可以断开连接了”。

第四次挥手:客户端收到服务端的 FIN 数据包后,发送 ACK (ACK=y + 1) 标志的数据包给服务端,然后进入 TIME - WAIT 状态。服务端收到 ACK 数据包后进入 CLOSE 状态。客户端在 TIME - WAIT 状态等待 2MSL(最长报文段寿命)后,如果没有收到其他回复,就可以确认服务端已正常关闭,随后客户端也关闭连接。在四次挥手未完成之前,客户端和服务端仍可继续传输数据。

为什么一定四次挥手

TCP 采用全双工通信模式,允许数据在两个方向上同时传输。因此,任何一方都可以在数据传送结束后发起连接释放的通知,待对方确认后进入半关闭状态。只有当双方都完成数据传输并确认后,才能完全关闭 TCP 连接。至于为何不能将服务端发送的 ACK 和 FIN 合并为一次,变成三次挥手,原因在于服务端收到客户端断开连接的请求时,可能还有一些数据尚未发送完毕。此时先回复 ACK,表示已接收到断开连接的请求,等到数据发送完成后再发送 FIN,以断开服务端到客户端的数据传送。

三、TCP 如何确保可靠传输?

为了保障数据在网络中的可靠传输,TCP 采用了一系列精妙的机制。

基于数据块传输

TCP 会将应用数据分割成其认为最适宜发送的数据块(报文),再传递给网络层。这就好比将一大箱货物合理地分装成多个小包裹,以便在复杂的网络道路上高效运输,提高传输效率。

数据包的排序与去重

TCP 为每个数据包分配一个唯一的序列号,如同给每个小包裹贴上特定的标签。接收端依据这些序列号对接收到的数据进行排序,并去除重复序列号的数据,从而确保数据的准确性和有序性。

校验和机制

TCP 会计算并维护首部和数据的检验和,这就像是给每个包裹贴上一个质量检测标签。若接收到的报文段检验和出现差错,TCP 会果断丢弃该报文段,并且不确认收到此报文段,以此保证数据的完整性。

重传机制

基于计时器的重传(超时重传):数据包发送出去后,TCP 会启动一个计时器。若在规定时间内未收到对方的确认应答(ACK),就如同包裹寄出后长时间没有收到收件人的确认,TCP 会重新发送该数据包。

快速重传:当接收端发现数据包失序时,会立即向发送端发送重复的 ACK 报文。发送端在收到多个重复的 ACK 后,无需等待计时器超时,就会迅速重传丢失的数据包,大大提高了重传的效率。

SACK(选择性确认):在快速重传的基础上,接收端会返回最近收到的报文段的序列号范围,这样发送端就能清楚地知道哪些数据包已经成功到达服务器,从而精准地重传丢失的数据。

D - SACK(重复 SACK):D - SACK 在 SACK 的基础上更进一步,额外携带信息告知发送方哪些数据包被重复接收了,帮助发送方更全面地了解网络状况,优化重传策略。

流量控制

TCP 连接的双方都设有固定大小的缓冲空间。接收端通过滑动窗口协议,如同调节一扇窗户的开合程度,只允许发送端发送接收端缓冲区能够接纳的数据量,以此防止数据拥堵,避免数据包丢失。

拥塞控制

TCP 在发送数据时,会充分考虑两个关键因素:接收方的接收能力和网络的拥塞程度。接收方的接收能力通过滑动窗口来体现,表示接收方还有多少缓冲区可用于接收数据;网络的拥塞程度则由拥塞窗口表示,这是发送方根据网络状况自行维护的一个值,反映了发送方认为可以在网络中顺利传输的数据量。发送方发送数据的大小取滑动窗口和拥塞窗口的最小值,这样既能确保不超过接收方的接收能力,又能避免对网络造成过度拥塞。

资料:计算机网络面试必备知识点详解-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Docker compose 部署的夜莺V6版本升到V7版本的详细步骤、常见问题解答及相关镜像下载地址

环境说明 夜莺官网:首页 - 快猫星云Flashcat 夜莺安装程序下载地址:快猫星云下载中心 夜莺v7.7.2镜像(X86架构): https://download.csdn.net/download/jjk_02027/90851161 夜莺ibex v1.2.0镜像(X86架构…

JavaScript【4】数组和其他内置对象(API)

1.数组: 1.概述: js中数组可理解为一个存储数据的容器,但与java中的数组不太一样;js中的数组更像java中的集合,因为此集合在创建的时候,不需要定义数组长度,它可以实现动态扩容;js中的数组存储元素时,可以存储任意类型的元素,而java中的数组一旦创建后,就只能存储定义类型的元…

永久免费!专为 Apache Doris 打造的可视化数据管理工具 SelectDB Studio V1.1.0 重磅发布!

作为全球领先的开源实时数据仓库, Apache Doris Github Stars 已超过 13.6k,并在 5000 余家中大型企业生产环境得到广泛应用,支撑业务核心场景,成为众多企业数据分析基础设施不可或缺的重要基座。过去,Apache Doris 用…

数字万用表与指针万用表使用方法及注意事项

在电子测量领域,万用表是极为常用的工具,数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项,能确保测量的准确性与安全性。下面为您详细介绍: 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […

深度学习Dropout实现

深度学习中的 Dropout 技术在代码层面上的实现通常非常直接。其核心思想是在训练过程中,对于网络中的每个神经元(或者更精确地说,是每个神经元的输出),以一定的概率 p 随机将其输出置为 0。在反向传播时,这…

AtCoder AT_abc406_c [ABC406C] ~

前言 除了 A 题,唯一一道一遍过的题。 题目大意 我们定义满足以下所有条件的一个长度为 N N N 的序列 A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\dots,A_N) A(A1​,A2​,…,AN​) 为波浪序列: N ≥ 4 N\ge4 N≥4(其实满足后面就必须满足这…

Java Web 应用安全响应头配置全解析:从单体到微服务网关的实践

背景:为什么安全响应头至关重要? 在 Web 安全领域,响应头(Response Headers)是防御 XSS、点击劫持、跨域数据泄露等攻击的第一道防线。通过合理配置响应头,可强制浏览器遵循安全策略,限制恶意行…

如何停止终端呢?ctrl+c不管用,其他有什么方法呢?

如果你在终端中运行了一个程序(比如 Python GUI tkinter 应用),按下 Ctrl C 没有作用,一般是因为该程序: 运行了主事件循环(例如 tkinter.mainloop()) 或 在子线程中运行,而 Ctrl …

深入解析 React 的 useEffect:从入门到实战

文章目录 前言一、为什么需要 useEffect?核心作用: 二、useEffect 的基础用法1. 基本语法2. 依赖项数组的作用 三、依赖项数组演示1. 空数组 []:2.无依赖项(空)3.有依赖项 四、清理副作用函数实战案例演示1. 清除定时器…

Ubuntu 更改 Nginx 版本

将 1.25 降为 1.18 先卸载干净 # 1. 完全卸载当前Nginx sudo apt purge nginx nginx-common nginx-core# 2. 清理残留配置 sudo apt autoremove sudo rm -rf /etc/apt/sources.list.d/nginx*.list修改仓库地址 # 添加仓库(通用稳定版仓库) codename$(…

如何在 Windows 10 或 11 中安装 PowerShellGet 模块?

PowerShell 是微软在其 Windows 操作系统上提供的强大脚本语言,可用于通过命令行界面自动化各种任务,适用于 Windows 桌面或服务器环境。而 PowerShellGet 是 PowerShell 中的一个模块,提供了用于从各种来源发现、安装、更新和发布模块的 cmdlet。 本文将介绍如何在 PowerS…

NBA足球赛事直播源码体育直播M33模板赛事源码

源码名称:体育直播赛事扁平自适应M33直播模板源码 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:NBA足球赛事直播源码体育直播M33模板赛事…

【Python】魔法方法是真的魔法! (第二期)

还不清楚魔术方法? 可以看看本系列开篇:【Python】小子!是魔术方法!-CSDN博客 【Python】魔法方法是真的魔法! (第一期)-CSDN博客 在 Python 中,如何自定义数据结构的比较逻辑&…

Qt 强大的窗口停靠浮动

1、左边: 示例代码: CDockManager::setConfigFlags(CDockManager::DefaultOpaqueConfig); CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); dockManager new CDockManager(this); // Disabling the Internal Style S…

Linux进程异常退出排查指南

在 Linux 中,如果进程无法正常终止(如 kill 命令无效)或异常退出,可以按照以下步骤排查和解决: 1. 常规终止进程 尝试普通终止(SIGTERM) kill PID # 发送 SIGTERM 信号(…

使用tensorRT10部署低光照补偿模型

1.低光照补偿模型的简单介绍 作者介绍一种Zero-Reference Deep Curve Estimation (Zero-DCE)的方法用于在没有参考图像的情况下增强低光照图像的效果。 具体来说,它将低光照图像增强问题转化为通过深度网络进行图像特定曲线估计的任务。训练了一个轻量级的深度网络…

SLAM定位常用地图对比示例

序号 地图类型 概述 1 格栅地图 将现实环境栅格化,每一个栅格用 0 和 1 分别表示空闲和占据状态,初始化为未知状态 0.5 2 特征地图 以点、线、面等几何特征来描绘周围环境,将采集的信息进行筛选和提取得到关键几何特征 3 拓扑地图 将重要部分抽象为地图,使用简单的图形表示…

【图像生成1】Latent Diffusion Models 论文学习笔记

一、背景 本文主要记录一下使用 LDMs 之前,学习 LDMs 的过程。 二、论文解读 Paper:[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models 1. 总体描述 LDMs 将传统 DMs 在高维图像像素空间(Pixel Space&#x…

通信安全堡垒:profinet转ethernet ip主网关提升冶炼安全与连接

作为钢铁冶炼生产线的安全检查员,我在此提交关于使用profinet转ethernetip网关前后对生产线连接及安全影响的检查报告。 使用profinet转ethernetip网关前的情况: 在未使用profinet转ethernetip网关之前,我们的EtherNet/IP测温仪和流量计与PR…

TIFS2024 | CRFA | 基于关键区域特征攻击提升对抗样本迁移性

Improving Transferability of Adversarial Samples via Critical Region-Oriented Feature-Level Attack 摘要-Abstract引言-Introduction相关工作-Related Work提出的方法-Proposed Method问题分析-Problem Analysis扰动注意力感知加权-Perturbation Attention-Aware Weighti…