TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络

news2024/12/27 6:31:07

本篇是关于3次握手和四次挥手的详细解释~

如果对你有帮助,请点个免费的赞吧,谢谢汪。(点个关注也可以!)

如果以下内容需要补充和修改,请大家在评论区多多交流~。

目录

1. TCP头部:

2. 三次握手

2.1. 3次握手的必要原因:

2.2. 具体步骤:

2.3. 细节:

2.3.1. 第一次握手:

2.3.2. 第二次握手:

2.3.3. 第三次握手:

2.4. 影响TCP三次握手过程的因素:

网络延迟:

丢包率:

网络拥塞:

防火墙和网络安全策略:

系统资源限制:

TCP参数设置:

NAT(网络地址转换)和负载均衡器:

中间网络设备问题:

操作系统和网络栈问题:

应用程序设计:

DoS(拒绝服务)攻击:

3. 4次挥手

3.1. 步骤

3.2. 为什么客户端在TIME-WAIT阶段要等2MSL?

3.2.1. 确保最后的ACK被接收:

3.2.2. 处理网络中延迟的报文:

4. TCP如何保证可靠性传输?

4.1. 通过三次握手建立可靠的连接:

4.1.1. 同步序列号(SYN):

4.1.2. 确认(ACK):

4.2. 通过应答确认和重传机制确认数据准确到达:

4.2.1. 序列号(Seq):

4.2.2. 应答确认(Ack):

4.2.3. 超时重传:

4.2.4. 流量控制:

4.3. 通过四次挥手实现断开连接时信息传输的完整性:

结束(FIN):

确认(ACK):

终止确认:

5. TCP重传机制具体是如何运作的?

5.1. 超时重传(RTO - Retransmission Timeout)

5.2. 快速重传(Fast Retransmit)

5.3. 选择性重传(Selective Repeat)

5.4. 计时器管理

5.5. 流量控制与拥塞控制

5.5.1. 总结


1. TCP头部:

  • Seq(序列号):序列号是TCP头部的一个32位字段,用于标识从发送端发送的数据字节流中的每一个字节。每个TCP段都有一个序列号,用于确保数据能够按照正确的顺序重新组装。对于建立连接的SYN包和结束连接的FIN包,即使它们不携带数据,也会有序列号。
  • Ack(应答号):应答号是TCP头部的一个32位字段,用于指示发送端期望接收的下一个序列号。当发送ACK包时,Ack字段会设置为接收方期望从对方收到的下一个序列号。这表明所有到这个序列号为止的数据都已经成功接收。
  • SYN(同步序列编号):SYN标志是在TCP三次握手中的第一个包中设置的,用于开始一个新的连接。它告诉接收方发送方将开始一个新的序列号,用于后续的数据传输。
  • FIN(结束):FIN标志用于结束一个TCP连接。当一方完成数据发送后,它会发送一个设置了FIN标志的包,以请求关闭连接。
  • PSH(推送):PSH标志指示接收方应该立即将数据推送到应用程序,而不是将其缓存起来。这通常用于需要立即处理的数据,如交互式输入。
  • ACK(确认):ACK标志用于确认包的接收。除了最初的SYN包外,TCP协议要求所有的数据传输包都应该设置ACK标志。

这些标志和字段是TCP协议如何保证可靠传输的关键组成部分。在TCP头部,这些标志可以单独设置,也可以组合设置,以指示不同的控制信息。例如,在三次握手的第二次握手时,服务器会发送一个SYN-ACK包,这个包同时设置了SYN和ACK标志。

2. 三次握手

TCP(传输控制协议)使用三次握手过程来建立可靠的连接

2.1. 3次握手的必要原因:

  1. 同步序列号:客户端和服务器都需要知道对方的初始序列号,以便正确地排序数据段。在三次握手中,双方通过发送和确认序列号来同步这些信息。

  2. 确认双方的接收和发送能力:三次握手确保了双方都有能力发送和接收数据。在第一次握手时,客户端发送一个SYN包,如果服务器能够接收到这个包,那么它就知道客户端的发送能力是正常的。

      在第二次握手时,服务器发送一个SYN-ACK包,客户端如果能够接收到,就知道服务器的发送能力是正常的。

       客户端发送一个ACK包,服务器接收到后,就知道客户端的接收能力也是正常的。

      3. 防止已失效的连接请求突然又传送到了服务端

如果一个旧的连接请求(可能因为网络延迟而长时间滞留)突然到达服务器,通过三次握手可以防止这种情况建立一个错误的连接。因为服务器在接收到SYN后,会发送一个SYN-ACK,如果客户端没有对应的请求(即它没有发送过SYN),它就不会发送ACK,因此连接不会建立。

2.2. 具体步骤:

  • 第一次握手:客户端发送一个SYN包到服务器,以开始一个新的连接。

  • 第二次握手:服务器接收到SYN包,会应答一个SYN-ACK包,表示已经收到了客户端的SYN,并准备好建立连接。

  • 第三次握手:客户端收到服务器的SYN-ACK包后,会向服务器发送一个ACK包,确认连接建立。

这个过程确保了双方都准备好数据传输,并且减少了因网络延迟或错误而导致的资源浪费。两次握手不足以完成这些任务,因为它不能防止旧的连接请求干扰新的连接建立。

2.3. 细节:

2.3.1. 第一次握手:

客户端发送一个TCP同步序列编号(SYN)包到服务器,以开始一个新的连接。

在这个SYN包中,序列号(seq)被设置为一个初始值J(通常是随机生成的)。

发送完SYN包后,客户端进入SYN_SENT状态,等待服务器的确认。

2.3.2. 第二次握手:

服务器收到客户端的SYN包后,会发送一个确认包(ACK)回去。

服务器在ACK包中设置确认号(ack)为客户端的序列号J加1,表示收到了序列号为J的SYN包。

同时,服务器也会发送自己的SYN包,其中包含自己的初始序列号K。

服务器此时进入SYN_RECV状态,等待客户端的确认。

2.3.3. 第三次握手:

客户端收到服务器的SYN+ACK包后,会发送一个确认包(ACK)作为响应。

在这个ACK包中,确认号(ack)被设置为服务器的序列号K加1。

发送完这个ACK包后,客户端进入ESTABLISHED状态,表示客户端到服务器的连接已经建立。

服务器在收到这个ACK包后,也进入ESTABLISHED状态,此时双方都准备好开始数据传输。

2.4. 影响TCP三次握手过程的因素:

网络延迟:

网络延迟会影响握手的速度。如果网络延迟较大,那么SYN包和ACK包的往返时间(RTT)会增加,导致建立连接的时间变长。

丢包率:

如果网络中的丢包率较高,SYN或ACK包可能在传输过程中丢失,需要重传,这会延长握手过程。

网络拥塞:

网络拥塞会导致数据包传输延迟或丢失,从而影响握手过程。

防火墙和网络安全策略:

防火墙或其他网络安全设备可能会限制或过滤SYN包,这可能导致握手失败。

系统资源限制:

如果服务器资源有限(如内存不足),它可能无法处理大量的并发握手请求,导致连接建立失败。

TCP参数设置:

诸如TCP窗口大小、SYN重传次数、SYN超时时间等TCP参数的设置也会影响握手过程。

NAT(网络地址转换)和负载均衡器:

NAT设备和负载均衡器可能会改变数据包的流向,影响握手的正常进行。

中间网络设备问题:

路由器、交换机等网络设备如果出现问题,如配置错误或硬件故障,也可能影响握手过程。

操作系统和网络栈问题:

操作系统的网络栈如果有bug或配置不当,可能会影响TCP握手的执行。

应用程序设计:

如果应用程序在建立TCP连接时没有正确处理异常情况,可能会导致握手失败。

DoS(拒绝服务)攻击:

SYN Flood等DoS攻击会发送大量伪造的SYN包,导致服务器资源耗尽,无法处理正常的握手请求。

3. 4次挥手

3.1. 步骤

  1. 第一次挥手

      主动方(可以是客户端或服务器)发送一个FIN包(FIN=1,seq=u),表示它已经完成发送数据,并希望关闭到被动方的连接。

      主动方发送完FIN包后,主动方进入FIN_WAIT_1状态,等待被动方的确认。

  1. 第二次挥手

      被动方收到FIN包后,发送一个ACK包(ACK=1, ack=u+1)作为响应,确认已经收到主动方的终止请求。

      被动方此时进入CLOSE_WAIT状态,这意味着被动方已经知道主动方想要关闭连接,但被动方可能还有数据需要发送。

     主动方收到这个ACK包后,进入FIN_WAIT_2状态,等待被动方发送剩余的数据并关闭连接。

  1. 第三次挥手

      在被动方发送完所有剩余的数据后,它发送一个FIN包(FIN=1, seq=w),请求关闭到主动方的连接。

      发送完FIN包后,被动方进入LAST_ACK状态,等待主动方的最后确认。

  1. 第四次挥手

      主动方收到被动方的FIN包后,发送一个ACK包(ACK=1, ack=w+1)作为响应,确认已经收到被动方的终止请求。

     主动方在发送完ACK包后,进入TIME_WAIT状态,这个状态会持续一段时间(通常是2倍的最大段生命周期MSL),以确保被动方收到最后的ACK包。

     被动方收到这个ACK包后,关闭连接,进入CLOSED状态。

     在TIME_WAIT状态结束后,主动方也会关闭连接,进入CLOSED状态。

     这个过程确保了双方都能优雅地关闭连接,并且所有未完成的数据传输都有机会完成。TIME_WAIT状态的存在是为了防止在网络中延迟的数据包影响后续的连接。

3.2. 为什么客户端在TIME-WAIT阶段要等2MSL?

3.2.1. 确保最后的ACK被接收:

      客户端在发送最后一个ACK确认报文后,不能立即断定服务器端已经收到了这个ACK。如果服务器端没有收到ACK,它可能会重新发送FIN报文。客户端在TIME_WAIT状态中等待2MSL,可以确保如果服务器端的FIN报文因为网络延迟而丢失,服务器端有足够的时间重新发送FIN,并且客户端可以再次发送ACK。

3.2.2. 处理网络中延迟的报文:

        在TCP连接中,可能会存在在网络中长时间延迟的报文。等待2MSL可以确保当前连接中所有延迟的报文都已经过期,从而不会影响后续可能建立的相同源地址和端口号的新连接。

       避免旧连接的报文影响新连接:如果客户端在发送完最后一个ACK后立即关闭连接,并且立即重新建立一个新的连接,那么理论上,网络中延迟的属于旧连接的报文可能会错误地被新连接接收。TIME_WAIT状态防止了这种情况的发生。

      MSL(Maximum Segment Lifetime)是TCP报文在网络中存在的最长时间,这个时间通常是根据网络的特性来设定的。2MSL的等待时间是一个保守的估计,它考虑了报文在网络中的最大存活时间以及往返时间。

     总结来说,客户端在TIME_WAIT状态等待2MSL是为了确保TCP连接的可靠终止,防止因为网络延迟或报文丢失导致的问题,并且保护后续可能建立的连接不受旧连接报文的影响。这也是为什么在TCP四次挥手过程中,客户端比服务器端晚进入CLOSED状态的原因。

4. TCP如何保证可靠性传输?

4.1. 通过三次握手建立可靠的连接:

4.1.1. 同步序列号(SYN):

       三次握手的过程确保了双方都知道对方的初始序列号,这样在后续的数据传输中,双方都可以根据序列号来正确地组装数据。

4.1.2. 确认(ACK):

      在三次握手中,每个方向上的SYN包都会得到一个ACK确认,这确保了连接的双方都准备好接收和发送数据。

4.2. 通过应答确认和重传机制确认数据准确到达:

4.2.1. 序列号(Seq):

        TCP为每个数据字节分配一个序列号,确保数据包在接收端能够按照正确的顺序被重新组装。

4.2.2. 应答确认(Ack):

        接收方收到数据后会发送一个ACK包,其中包含期望收到的下一个序列号。如果发送方没有在预期时间内收到ACK,它会重传数据。

4.2.3. 超时重传:

        如果发送方没有在指定的时间内收到确认,它会认为数据包可能已经丢失或出错,并会重新发送该数据包。

4.2.4. 流量控制:

        TCP使用滑动窗口机制来控制发送方的发送速率,以避免接收方因来不及处理而丢弃数据包。

4.3. 通过四次挥手实现断开连接时信息传输的完整性:

结束(FIN):

        当连接的一端完成数据发送后,它会发送一个FIN包来请求关闭连接。

确认(ACK):

        对端收到FIN包后,会发送一个ACK包作为响应,并进入关闭等待状态,等待剩余的数据传输完成。

终止确认:

        在双方都发送了FIN包并收到了对方的ACK确认后,连接最终会被关闭。这个过程确保了在连接关闭之前,所有的数据都已经传输完成。

        这些机制共同作用,确保了TCP传输的可靠性。通过序列号和确认机制,TCP能够处理数据包的丢失、重复和顺序错误问题,而三次握手和四次挥手过程则确保了连接的建立和终止都是清晰和可靠的。

5. TCP重传机制具体是如何运作的?

        TCP(传输控制协议)的重传机制是网络通信中确保数据可靠传输的关键部分。

5.1. 超时重传(RTO - Retransmission Timeout)

  1. 发送数据:当TCP发送一个数据段时,它会启动一个计时器。

  2. 等待确认(ACK):发送方等待接收方发送确认(ACK)消息。

  3. 计时器到期:如果在计时器到期之前没有收到预期的ACK,发送方认为该数据段可能已经丢失或出错。

  4. 重传数据:计时器到期后,发送方将重传该数据段,并重新启动计时器。

5.2. 快速重传(Fast Retransmit)

快速重传机制是在接收方连续收到三个重复的ACK时触发的,表明接收方期望的下一个数据段丢失了。

  1. 接收重复ACK:如果接收方收到一个已经接收过的数据段,它会发送一个重复的ACK,指示发送方下一个期望的数据序列号。

  2. 连续收到三个重复ACK:当发送方连续收到三个相同的重复ACK时,它会推断出接收方期望的下一个数据段丢失了。

  3. 触发快速重传:发送方立即重传丢失的数据段,而不是等待计时器到期。

5.3. 选择性重传(Selective Repeat)

选择性重传允许发送方只重传丢失的数据段,而不是从丢失的段开始重传所有后续的段。

  1. 接收方指示丢失的段:接收方可以使用SACK(选择性确认)选项来明确告诉发送方哪些数据段丢失了。

  2. 发送方重传丢失的段:发送方根据接收方的指示,只重传丢失的数据段。

5.4. 计时器管理

  • RTO计算:TCP使用各种算法来估算RTO,如Karn算法和Jacobson/Karels算法。这些算法旨在动态调整RTO,以适应网络条件的变化。

  • 退避策略:当数据段被重传时,TCP可能会增加RTO,以避免在网络拥塞时加剧问题。

5.5. 流量控制与拥塞控制

  • 流量控制:TCP使用滑动窗口机制来控制发送方的发送速率,以匹配接收方的处理能力。

  • 拥塞控制:TCP拥塞控制算法(如慢启动、拥塞避免、快速恢复)也会影响重传机制,以避免网络拥塞。

TCP重传机制确保了数据的可靠传输,通过上述机制,TCP能够适应网络延迟、丢包和数据错误的情况,从而提高整体的数据传输效率。当数据段丢失时,TCP会通过超时重传或快速重传来恢复丢失的数据,同时使用选择性重传来优化重传过程。这些机制与流量控制和拥塞控制相结合,使得TCP成为一个非常可靠的传输协议。

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

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

相关文章

智能化业务校验框架:动态设计与应用实践

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 (一)商品spu校验信息数据 (二)商品sku校验信息数据 (三)组包商品校验信息数据 (四)商品数据校验数据持有者 &…

蓝桥杯每日真题 - 第23天

题目:(直线) 题目描述(12届 C&C B组C题) 解题思路: 题目理解: 在平面直角坐标系中,从给定的点集中确定唯一的直线。 两点确定一条直线,判断两条直线是否相同,可通过…

设计模式---建造者模式

建造者模式 一种创建型设计模式,它允许你一步一步地构建复杂对象。通过使用建造者模式,你可以将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。说白点就是,解决了构造函数创建对象的问题。 适用于那种构造函…

【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

Python小黄人

文章目录 系列目录写在前面完整代码代码分析1. 初始化部分2. 身体部分3. 右眼睛部分4. 左眼睛部分5. 嘴巴部分6. 裤子部分7. 脚部部分8. 手部部分9. 头顶装饰部分10. 代码总结 写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码…

操作系统 | 学习笔记 | 王道 | 2.2处理机调度

2.2 处理机调度 文章目录 2.2 处理机调度2.2.1 调度的概念2.2.2 调度的目标2.2.3 调度的实现2.2.4 典型的调度算法错题总结: 2.2.1 调度的概念 调度的基本概念 处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效的原则&…

算法与数据结构(1)

一:数据结构概论 数据结构分为初阶数据结构(主要由C语言实现)和高阶数据结构(由C实现) 初阶数据结构当中,我们会学到顺序表、链表、栈和队列、二叉树、常见排序算法等内容。 高阶数据结构当中&#xff0…

【Android】EventBus的使用及源码分析

文章目录 介绍优点基本用法线程模式POSTINGMAINMAIN_ORDEREDBACKGROUNDASYNC 黏性事件 源码注册getDefault()registerfindSubscriberMethods小结 postpostStickyunregister 介绍 优点 简化组件之间的通信 解耦事件发送者和接收者在 Activity、Fragment 和后台线程中表现良好避…

深度学习笔记——生成对抗网络GAN

本文详细介绍早期生成式AI的代表性模型:生成对抗网络GAN。 文章目录 一、基本结构生成器判别器 二、损失函数判别器生成器交替优化目标函数 三、GAN 的训练过程训练流程概述训练流程步骤1. 初始化参数和超参数2. 定义损失函数3. 训练过程的迭代判别器训练步骤生成器…

成都睿明智科技有限公司抖音电商服务的新引擎

在这个短视频风起云涌的时代,抖音不仅成为了人们休闲娱乐的首选,更是商家们竞相角逐的电商新蓝海。在这片充满机遇与挑战的海域中,成都睿明智科技有限公司如同一艘装备精良的航船,引领着众多企业向抖音电商的深水区进发。今天&…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展,而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 (PCB) 的检测和分析。本文…

Jenkins的使用

文章目录 一、Jenkins是什么\有什么用\与GitLab的对比二、Jenkins的安装与配置Jenkins的安装方式在Linux上安装Jenkins:在Windows上安装Jenkins:配置Jenkins: (可选)配置启动用户为root(一定要是root吗??…

图论入门教程:GTM173 Graph Theory

这是本图论的入门教材,Graph Theory Fifth Edition,隶属于著名的GTM系列,作者是Reinhard Diestel。这是本对新人友好的教材,之前本科上离散数学的课时,因为涉及到图论,而学校的课堂又太水让我心生不满&…

QT5 Creator (Mingw编译器) 调用VS2019 (阿里云 oss C++库) 报错的解决方法

方法就是不要用VS2019编译,要用MINgw32编译。 编译命令如下: cmake -G "MinGW Makefiles" ^-DCMAKE_MAKE_PROGRAMD:\qt\Tools\mingw810_32\bin\mingw32-make.exe ^-DCMAKE_C_COMPILERD:\qt\Tools\mingw810_32\bin\gcc.exe ^-DCMAKE_CXX_COMP…

反向传播、梯度下降与学习率:深度学习中的优化艺术

目录 反向传播:神经网络的学习机制 梯度下降:优化算法的基石 学习率:平衡速度与稳定性的关键 学习率的调整策略 固定学习率 学习率衰减 自适应学习率 梯度消失与梯度爆炸 结语 在深度学习的领域中,构建一个有效的神经网络…

论文笔记(五十九)A survey of robot manipulation in contact

A survey of robot manipulation in contact 文章概括摘要1. 引言解释柔顺性控制的概念:应用实例: 2. 需要接触操控的任务2.1 环境塑造2.2 工件对齐2.3 关节运动2.4 双臂接触操控 3. 接触操控中的控制3.1 力控制3.2 阻抗控制3.3 顺应控制 4. 接触操控中的…

881.救生艇

目录 题目过程 题目 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 过程 cla…

【汇编】逻辑指令

文章目录 一、逻辑运算指令(一)各逻辑运算指令格式及操作(1)逻辑非指令 NOT(2)逻辑与指令 AND(3)逻辑或指令 OR(4)异或指令 XOR(5)测试…

网页开发的http基础知识

请求方式-GET:请求参数在请求行中,没有请求体,如:/brand/findAll?nameoPPo&status1。GET请求大小在浏览器中是有限制的请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的 HTTP请求&#xf…

如何做好一份技术文档

如何做好一份技术文档 以下是本人的一些微不足道的经验,希望可以与大家互相交流学习 方向一:技术文档的规划布局 确定整体架构 创建一份优秀技术文档的第一步是规划其整体架构。一个好的架构应能引导读者理解文档的内容,同时提供一个逻辑清…