当前位置: 首页 > news >正文

探讨TCP的可靠性以及三次握手的奥秘

🌟 欢迎来到 我的博客! 🌈

💡 探索未知, 分享知识 !💫

本文目录

    • 1. TCP的可靠性机制
      • 1.2可靠性的基础上,尽可能得提高效率
    • 2. TCP三次握手过程
    • 3. 为何不是四次握手?


在这里插入图片描述

在互联网的复杂世界中,TCP(传输控制协议)扮演着一个不可或缺的角色,确保我们的数据能够准确无误地在世界各地流动。它是一种面向连接的可靠的基于字节流 , 全双工的传输层通信协议。今天,我们将一起探索TCP的可靠性背后的原理,特别是那个让人好奇的问题:为什么是三次握手不是两次、也不是四次?

1. TCP的可靠性机制

TCP的设计目标是提供一种可靠的数据传输服务,在无法预测的网络环境中,这是一项挑战。以下是TCP确保数据可靠性的几种核心机制:

  • 确认应答:TCP对每个传输的字节赋予一个序号,用于跟踪数据包的顺序。接收方通过发送带有确认序号(ACK)的报文来告知发送方哪些数据已经被成功接收。确认序号接收方期望接收的下一个字节的序号。这样,即使数据包乱序到达,接收方也能根据序号重新排序,确保数据的完整性和顺序。

在这里插入图片描述

  • 超时重传:当发送方发送数据后,它会启动一个定时器,等待接收方的确认响应。如果在预定时间内没有收到确认序号(ACK),发送方会认为数据包丢失或出错,并重新发送该数据包。这个机制保证了数据能够在遇到丢包或错误时得到恢复。

情况① 数据直接丢了,接收方根本没有收到

在这里插入图片描述

情况① 接收方收到了,但是返回的ack丢了

在这里插入图片描述

1.2可靠性的基础上,尽可能得提高效率

  • 滑动窗口

要提高效率,每次等待ACK的时间就要花费不少时间,所以TCP引出了一个机制 : 通过滑动窗口实现批量传输

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上述批量传输数据的过程,被称为滑动窗口
  • 流量控制:TCP通过滑动窗口机制实现流量控制,动态调整发送方的发送速率以匹配接收方的处理能力。窗口大小指的是接收方能够接收但还未确认的数据量,这避免了接收方因处理不过来而导致的数据溢出。
滑动窗口,批量发送并不是数据越大就速度就越快,我们还要考虑到接受方.

如果你发的太快,瞬间就把接受方的缓冲区给打满了,接下来如果继续发送的话,就会造成丢包.这种情况不如发的慢一点.

在这里插入图片描述
在这里插入图片描述

这些机制共同作用,确保了TCP能在不稳定的网络环境中提供可靠且相对于比较快速的数据传输服务。

2. TCP三次握手过程

建立TCP连接的三次握手过程是这样的:

  1. SYN:客户端向服务器发送一个SYN(同步序列编号)报文,并进入SYN_SEND状态,等待服务器的响应。这个步骤启动连接过程,客户端告诉服务器它想建立连接,并提供初始的序号。
  2. SYN-ACK:服务器收到SYN报文后,会发送一个SYN-ACK报文,同时提供自己的初始序号,并确认客户端的序号。此时服务器进入SYN_RECV状态。
  3. ACK:客户端收到SYN-ACK报文后,发送一个ACK报文作为响应,确认服务器的初始序号。此时,TCP连接建立完成,数据传输可以开始。

在这里插入图片描述

如何来辨别是同步报文还是应答报文
在这里插入图片描述

3. 为何不是四次握手?

其实第二次的`syn + ack`,按通常一问一答的思路是发送ack报文之后,在发送syn报文来确认认对方的接收状态,但是为了提高效率便将syn和ack一并发送

三次握手的设计确保了在双方准备好发送和接收数据之前不会建立连接。如果采用两次握手,可能会遗漏对方的准备状态确认,导致单向通信或数据无法到达。而采用四次握手则造成没必要的开销.

http://www.lryc.cn/news/319541.html

相关文章:

  • openai常见的两个错误:BadRequestError和OpenAIError
  • 2核4g服务器够用吗?
  • 数据仓库数据分层详解
  • unity内存优化之AB包篇(微信小游戏)
  • 白话模电:3.三极管(考研面试与笔试常考问题)
  • LeetCode 395. 至少有K个重复字符的最长子串
  • C#重新认识笔记_ FixUpdate + Update
  • Django 解决新建表删除后无法重新创建等问题
  • Qt教程 — 3.3 深入了解Qt 控件:Input Widgets部件(2)
  • 数据分析-Pandas的直接用Matplotlib绘图
  • Jmeter---分布式
  • 安卓基础面试题
  • 如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境
  • Redis实现分布式锁源码分析
  • SCI 图像处理期刊
  • 数据结构-红黑树
  • 双指针、bfs与图论
  • RabbitMQ高级-高级特性
  • Word粘贴时出现“运行时错误53,文件未找到:MathPage.WLL“的解决方案
  • html元素基本使用
  • PHP+golang开源办公系统CRM管理系统
  • smartmontools-5.43交叉编译Smartctl
  • idea找不到或无法加载主类
  • 2.二进制的方式读写文件
  • Seata的详细解释
  • JS手写实现洋葱圈模型
  • 3.Windows下安装MongoDB和Compass教程
  • go反射实战
  • Docker 中 MySQL 的部署与管理
  • 基础练习题之函数