【Linux网络】详解TCP协议(1)

news2024/11/16 12:05:19
图片名称
🎉博主首页: 有趣的中国人

🎉专栏首页: Linux网络

🎉其它专栏: C++初阶 | C++进阶 | 初阶数据结构

在这里插入图片描述

小伙伴们大家好,本片文章将会讲解 TCP协议 的相关内容。


如果看到最后您觉得这篇文章写得不错,有所收获,麻烦点赞👍、收藏🌟、留下评论📝。您的支持是我最大的动力,让我们一起努力,共同成长!

文章目录

  • `1. TCP 协议简介`
    • ==<font color = blue><b>🎧1.1 TCP 协议段格式🎧==
    • ==<font color = blue><b>🎧1.2 TCP 解包和分用🎧==
  • `2. TCP 确认应答机制(ACK)和捎带应答`
    • ==<font color = blue><b>🎧2.1 什么是确认应答机制🎧==
    • ==<font color = blue><b>🎧2.2 TCP 通信模式🎧==
    • ==<font color = blue><b>🎧2.3 捎带应答🎧==
  • `3. 超时重传机制`
    • ==<font color = blue><b>🎧3.1 超时重传发生的 2种 情况🎧==
    • ==<font color = blue><b>🎧3.2 总结序号的 3个 作用🎧==



1. TCP 协议简介


TCP传输控制协议)是一个面向连接的协议,保证数据在网络中 可靠、顺序地传输 。它通过 建立连接、数据传输和断开连接 三个阶段来管理数据的传输过程。TCP 使用 确认机制、重传机制、流量控制和拥塞控制等技术,以确保数据包的完整性和顺序。

  • 连接建立:TCP 通过三次握手(SYN、SYN-ACK、ACK)建立连接,确保双方准备好数据传输。

  • 数据传输:数据被分割成段,每个段都有序号和确认号。接收方确认每个段的接收,确保数据完整性。

  • 流量控制:使用滑动窗口机制控制发送方的数据量,避免接收方溢出。

  • 拥塞控制:通过算法(如慢启动、拥塞避免)调节发送速率,防止网络拥堵。

  • 连接断开:通过四次挥手(FIN、ACK、FIN、ACK)关闭连接,确保数据传输完毕。

🎧1.1 TCP 协议段格式🎧


TCP 协议段格式简略图

在这里插入图片描述


TCP 协议段格式解释

  • 源/目的端口号:表示数据是从哪个进程来, 到哪个进程去;
  • 32 位序号/32 位确认号:后面详细讲;
  • 4 位 TCP 报头长度:表示该 TCP 头部有多少个 32 位 bit(有多少个 4 字节);
    • 每一位最大表示值为 权值 * 4
    • 所以TCP 头部最大长度是 15 ∗ 4 = 60 ( B y t e ) 15 * 4 = 60(Byte) 154=60(Byte)

  • 6 位标志位:
    • URG:紧急指针是否有效;
    • ACK:确认号是否有效;
    • PSH:提示接收端应用程序立刻从 TCP 缓冲区把数据读走;
    • RST:对方要求重新建立连接;我们把携带 RST 标识的称为复位报文段;
    • SYN:请求建立连接; 我们把携带 SYN 标识的称为同步报文段;
    • FIN:通知对方, 本端要关闭了, 我们称携带 FIN 标识的为结束报文段。

  • 16 位窗口大小:后面再说;
  • 16 位校验和:发送端填充, CRC 校验。接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含 TCP 首部, 也包含 TCP 数据部分。
  • 16 位紧急指针:标识哪部分数据是紧急数据;
  • 40 字节头部选项:暂时忽略。

🎧1.2 TCP 解包和分用🎧


我们可以从四位首部长度中知道 TCP 首部长度是多少:

  • 假设首部长度是 0011 表示的二进制位,即 3 3 3,那么首部长度就是 3 ∗ 4 = 12 ( B y t e ) 3 * 4 = 12 (Byte) 34=12(Byte)

  • 如果首部长度是 1111 表示的二进制位,即 15 15 15,那么首部长度就是 15 ∗ 4 = 60 ( B y t e ) 15 * 4 = 60(Byte) 154=60(Byte)

    • 如果总长度 大于 20Byte,说明要在选项中读取 首部长度 - 20 字节
  • 类似地,如何反向计算出对应的二进制位呢?假设头部长度是 28 Byte

    • x ∗ 4 = 28 x * 4 = 28 x4=28 解得 x = 7 x = 7 x=7
    • 7 有二进制表示解释 0111
    • 所以首部长度就是0111


2. TCP 确认应答机制(ACK)和捎带应答


🎧2.1 什么是确认应答机制🎧


在这里插入图片描述
在上图中,假如 主机A 要给 主机B 发送信息,那么怎么保证 主机B 收到了信息呢?

  • 那么 主机A 肯定是要收到 主机B 的应答,就表明 主机B 收到了信息;
  • 因此在报头中就存在一个标志位ACK表明我发送的这一条信息是应答。
  • 如果 主机A 没有收到消息就说明数据丢包了。
    • 这里没收到消息可能有两种情况,主机A 发送给 主机B 的时候就发生了丢包;
    • 还有一种情况就是 主机B 确实收到了 主机A 的消息并且发送了ACK给主机A,但是返回信息的过程中数据丢包了;
    • 这两种情况统一成 主机A 未收到ACK就为丢包。

32位序号和确认序号

在这里插入图片描述

当发送数据的时候,发送方会用到序号,当接收方接收到数据发送ACK的时候,会用到32位序号,那么什么是序号和确认序号呢?

  • 实际上我们可以将TCP的发送缓冲区和接收缓冲区假想成数组,这样就每个数据就天然有了一个下标,而发送方的序号就是要发送数据的最后一个下标;
  • 类似地,接收方发送ACK的时候也会有确认序号了,默认情况下确认序号等于序号加1;
    • 因为确认序号的定义是告诉发送方这个序号之前的所有数据我都已经接收到了;
    • 告诉发送方下一次发送要从哪个序号开始发送。

🎧2.2 TCP 通信模式🎧


通信方式1:

在这里插入图片描述


通信方式2:

在这里插入图片描述

  • 上面两种方式是 TCP 常见的通信方式,一个是每次发一条数据然后等待应答,收到应答之后再发送数据;
  • 另一种方式是一次发送多次数据,然后等待接收方发送多次应答(这种方式下一篇文章会详细说明)

🎧2.3 捎带应答🎧


为什么要有两个序号

很多人可能有一个问题,就是为什么报头种要同时拥有序号和确认序号,如果只有一个序号,不是同样可以告诉发送方某个序号之前的所有数据接收方都已经接收到了,并提醒发送方从下一次从哪个序号开始发送吗?

这里先说一点:

  • 首先因为 TCP是支持全双工 的,如果接收方除了想发送 ACK,还想发送正文数据,就需要序号和确认序号了。
    • 发送 ACK 需要确认序号;
    • 发送正文数据就需要序号了。

我们把这种应答方式叫做 捎带应答。


3. 超时重传机制


🎧3.1 超时重传发生的 2种 情况🎧


在这里插入图片描述

  • 主机 A 发送数据给 B 之后, 可能因为网络拥堵等原因, 数据无法到达 主机 B;
  • 如果 主机 A 在一个特定时间间隔内没有收到 B 发来的确认应答, 就会进行重发;

但是, 主机 A 未收到 B 发来的确认应答, 也可能是因为 ACK 丢失了:

在这里插入图片描述

  • 如果是这种情况,接收方就会接收到很多的重复数据,所以 TCP 就需要认识这些重复的数据,并且把重复的丢弃掉;
  • 这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果;

那么, 如果超时的时间如何确定?

  • 最理想的情况下, 找到一个最小的时间, 保证 “确认应答一定能在这个时间内返
    回”;
  • 但是这个时间的长短, 随着网络环境的不同, 是有差异的;
  • 如果超时时间设的太长, 会影响整体的重传效率;
  • 如果超时时间设的太短, 有可能会频繁发送重复的包。

TCP 为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超
时时间。

  • Linux 中(BSD UnixWindows 也是如此), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍;
  • 如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传;
  • 如果仍然得不到应答, 等待 4*500ms 进行重传。 依次类推, 以指数形式递增;
  • 累计到一定的重传次数, TCP 认为网络或者对端主机出现异常, 强制关闭连接。

🎧3.2 总结序号的 3个 作用🎧


  1. 构建确定序号(一般是序号加1);
  2. 接收方的去重操作需要用到序号;
  3. 保证发送方的数据按需放到接收方的缓冲区中。

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

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

相关文章

力扣每日一题 有序数组的平方 双指针 逆向思维

Problem: 977. 有序数组的平方 &#x1f468;‍&#x1f3eb; 灵神题解 class Solution {public int[] sortedSquares(int[] nums) {int n nums.length;int [] ans new int[n];int p n-1;int i 0;int j n-1;while(p > 0){int x nums[i] * nums[i];int y nums[j] * n…

结构体小知识

目录 前言1.结构体数组1.1结构体数组理解1.2结构体数组知识运用1.3 -> 操作符 2. 知识拓展 前言 本期blog是对上一期指针知识的知识补充&#xff0c;如果各位大佬感兴趣的话&#xff0c;可以结合起来一起看&#xff01; 1.结构体数组 1.1结构体数组理解 结构体数组在本…

关系的规范化与范式详解

在数据库设计中&#xff0c;关系的规范化是确保数据结构合理性、减少冗余和异常的关键步骤。如果你是一个数据库设计的初学者&#xff0c;这篇文章将为你深入浅出地讲解 关系规范化 和 范式 的核心概念&#xff0c;并通过简洁的示例帮助你加深理解。 关系的规范化&#xff1a;…

JavaScript进阶day1

目录 1.作用域 1.1 局部作用域 1.2 全局作用域 1.3 作用域链 1.4 JS垃圾回收机制 1.4.1 什么是垃圾回收机制&#xff1f; 1.4.2 内存的生命周期 1.4.3 算法说明 1.5 闭包 1.6 变量提升 2.函数进阶 2.1 函数提升 2.2 函数参数 2.2.1 动态参数 2.2.2 剩余参数 2.…

GB2312编码(加2020H、8080H原理)

区位码、内码、国标码 转换及原理 背景答题思考相关资料 背景 问题: 某汉字的国标码为5650H&#xff0c;那么它的机内码为&#xff08; B &#xff09;。A E6E0H B D6D0H C C6C0H D 8080H答题 思考 为什么要加上2020H和8080H&#xff1f;区位码、内码、国标码怎么转换非常简单…

【硬件知识】关于RAM的“那些事”

文章目录 一、DRAM&#xff08;动态随机存取存储器&#xff09;二、SRAM&#xff08;静态随机存取存储器&#xff09;三、DRAM和SRAM的差异与区别 一、DRAM&#xff08;动态随机存取存储器&#xff09; 工作原理&#xff1a;DRAM使用电容来存储数据。每一位数据通过一个电容和…

【深度学习讲解笔记】第1章-机器学习基础

1.机器学习是什么 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;&#xff0c;顾名思义就是让机器学会做一件事情&#xff0c;比如语音识别&#xff0c;机器听一段声音&#xff0c;产生这段声音对应的文字。或是识别图片中有几个人&#xff0c;几辆车。这些…

2024年语音识别转文字工具的崛起

无论是繁忙的会议记录、远程教学的即时笔记&#xff0c;还是日常生活的语音备忘&#xff0c;只需轻轻一说&#xff0c;便能瞬间转化为清晰可编辑的文字&#xff0c;这种便捷与高效无疑为现代生活增添了无限可能。本文将带你深入探索语音识别转文字工具的奥秘。 1.365在线转文字…

【Python篇】matplotlib超详细教程-由入门到精通(上篇)

文章目录 第一部分&#xff1a;基础概念与简单绘图1.1 matplotlib 简介1.2 创建第一个折线图1.3 图表的基本组成元素 第二部分&#xff1a;图表样式与修饰2.1 修改图表样式2.2 添加图例2.3 调整坐标轴与刻度 第三部分&#xff1a;绘制不同类型的图表3.1 散点图 (Scatter Plot)3…

使用 Homebrew 在 macOS 上安装 Conda

Homebrew 是一个流行的 macOS 包管理器&#xff0c;可以帮助你安装和管理各种软件包。 以下是使用 Homebrew 安装 Conda 的步骤&#xff1a; 1. 安装 Homebrew 如果你还没有安装 Homebrew&#xff0c;可以通过以下命令安装&#xff1a; /bin/bash -c "$(curl -fsSL htt…

《机器学习》—— XGBoost(xgb.XGBClassifier) 分类器

文章目录 一、XGBoost 分类器的介绍二、XGBoost&#xff08;xgb.XGBClassifier&#xff09; 分类器与随机森林分类器&#xff08;RandomForestClassifier&#xff09;的区别三、XGBoost&#xff08;xgb.XGBClassifier&#xff09; 分类器代码使用示例 一、XGBoost 分类器的介绍…

微信小程序 自定义组件

1. 微信小程序 自定义组件 微信小程序支持组件化开发&#xff0c;这有助于我们复用代码&#xff0c;提高开发效率。下面我将给出一个简单的微信小程序组件化示例&#xff0c;包括一个自定义组件的创建和使用。 1.1. 创建自定义组件 首先&#xff0c;在项目的 components 目录…

建筑二次供水的基本概念

什么是二次供水&#xff1f; 二次供水是城市供水的主要组成部分&#xff0c;是指集中式供水在入户之前经再度储存、加压和消毒后&#xff0c;通过管道输送给用户的供水方式。 为什么要使用二次供水&#xff1f; 由于市政供水的服务水压通常只能达到较低的楼层&#xff0c;而…

部分库函数及其模拟

前言&#xff1a;当我们学习c/c库函数的时候&#xff0c;我们可以用网站 cplusplus.com - The C Resources Network 来进行查阅&#xff0c;学习。 目录 库函数&#xff1a; 1.字符串函数 1.1求字符串长度 strlen 1.2长度不受限制的字符串函数 1.2.1strcpy 1.2.2strca…

“阡陌云旅”黄河九省文化旅游平台

“阡陌云旅”黄河九省文化旅游平台 GitHub地址&#xff1a;https://github.com/guoJiaQi-123/Yellow-River-Cloud-Journey 项目背景 “阡陌云旅”黄河九省文化旅游平台 “阡陌云旅” 黄河九省文化旅游平台是一个专注于黄河流域九省文化旅游资源整合与推广的项目。 黄河是中…

Spring Framework系统框架

序号表示的是学习顺序 IoC&#xff08;控制反转&#xff09;/DI&#xff08;依赖注入&#xff09;: ioc&#xff1a;思想上是控制反转&#xff0c;spring提供了一个容器&#xff0c;称为IOC容器&#xff0c;用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理…

HomeAssistant添加HACS绑定米家与苹果HomeKit设备并实现远程管理

文章目录 前言1. 下载HACS源码2. 添加HACS商店3. 绑定米家设备 前言 之前介绍过如何实现在群晖NAS使用Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭智能设备。本文将介绍如何在HA平台安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Ass…

推荐清晖一套不错的讲解沟通的线上讲座

推荐清晖一套不错的讲解沟通的线上讲座&#xff0c;比较实际贴地&#xff0c;听完了推荐给大家&#xff1a; 《项目管理中的沟通策略&#xff0c;听出弦外之音&#xff0c;变身沟通达人》 地址&#xff1a;项目管理中的沟通策略&#xff0c;听出弦外之音&#xff0c;变身沟通达…

数据结构(1):ArrayList和顺序表

数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 下面我们就开一个新坑&#xff0c;数据结构。数据结构&#xff0c;简单来说就是存放数据的方式&#xff0c;这些方式多种多样&#xff0c;我们来一点一…

Statcounter Global Stats 提供全球统计数据信息

Statcounter Global Stats 提供全球统计数据信息 1. Statcounter Global Stats2. Mobile & Tablet Android Version Market Share WorldwideReferences Statcounter Global Stats https://gs.statcounter.com/ Statcounter Global Stats are brought to you by Statcounte…