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

【每日八股】复习计算机网络 Day1:TCP 的头部结构 + TCP 确保可靠传输 + TCP 的三次握手

文章目录

  • 复习计算机网络 Day1
    • TCP 的头部结构
    • TCP 如何保证可靠传输?
      • 1. 数据完整性保障
      • 2. 顺序与去重控制
      • 3. 流量与拥塞控制
      • 4. 连接控制
      • 5. 其他辅助机制
      • TCP 可靠传输的保障手段总结
    • TCP 的三次握手?
    • TCP 为什么要三次握手?
    • TCP 三次握手出现报文丢失的情况会发生什么?
    • TCP 为什么不是两次握手?

复习计算机网络 Day1

三月份月初根据 csview 的文档系统性地复习了计算机网络当中的八股文,现在已经过去了一个半月,有一些遗忘,但常看常新,今天开始复习一遍相关的知识,先从 TCP 这个传输层协议开始。今天的内容由 csview 当中的 6 条八股组成,顺序是:

  1. TCP 的头部结构;
  2. TCP 如何保证可靠传输;
  3. TCP 的三次握手;
  4. TCP 为什么要三次握手;
  5. TCP 的三次握手丢了怎么办;
  6. TCP 为什么不是两次握手。

TCP 的头部结构

这部分内容参考自《TCP / IP 详解》第 17 章 17.3 TCP 报头。

首先,我们需要知道,一个 TCP 数据是被包装在 IP 数据包当中的,TCP 数据可以进一步拆解为报头部分数据部分。如下图所示:
在这里插入图片描述
下图进一步给出了 TCP 数据头部结构的具体信息:
在这里插入图片描述

  • 源端口与目的端口:16 位(为什么是 16 位?因为 16 位二进制数转换为十进制最大可以表示的无符号整数为 65535,恰好是一个 IP 地址可用的端口数目的上限)的源端口和目的端口标识了报文的返回地址以及接收方计算机上应用程序的接口。这两个值,再加上 IP 数据包头部信息当中的 IP 地址可以唯一标识一条网络连接。注意,一个 IP 地址和一个端口号合起来就是我们常说的 socket 套接字
  • 序列号(sequence number):32 位(转为十进制无符号整数,上限大概是 42.9 亿左右),序列号是发送方用来通知对方,当前所发送的数据段的首字节在自己所发送的整个字节流当中所处的位置。需要注意的是,序列号唯一标识数据流当中的一个字节,如果当前发送的报文,序列号为 100,且该报文携带 10 个字节的数据,那么这 10 个字节的序列号范围就是 100 ~ 109,下一个报文的序列号是 110
    在连接建立时,TCP 报文头部的 SYN 置位,此时 TCP 报文不携带任何数据,仅发送报头与接收方建立连接。此时 SYN 报文会占用一个序列号,作为发送方的起始序列号,假设记为 X,后续发送的报文的序列号就是 X + 1。序列号用于解决网络中包乱序的问题。
    「需要注意的是」:TCP 报头当中的序列号仅标识数据部分的字节,而不会标识 TCP 报文头部当中的字节。只有当 SYN 置位时,这个报文才隐式地占用一个序列号,作为字节流传输的起始序列号
    TCP 为应用程序双方提供全双工服务,因此双方都需要维护一个序列号字段。
  • 确认号(acknowledgement number):既然双方为所传输的每一个字节都进行了编号,那么确认号这个字段的作用就是接收方用于确认接收到发送方最后一个字节的序列号的信息。确认号同样占用 32 位,只在 ACK 置位时,这个域段才有效,因为 ACK 置位表示当前报文为确认报文。
    假设当前确认号为 Y,那么当发送方接收到接收方回发的 ACK 报文时,就代表其所发送的前 Y - 1 个字节已经成功被接收方所接收了。可以将确认号理解为接收方期望发送方下一次发送的报文的序列号。
  • 头部信息长度:4 位。TCP 头部可能含有可选项内容,所以 TCP 报头的长度是不确定的。在不包含任何可选字段时,报头的长度是 20 个字节,4 位首部长度字段所能表示的最大长度为 60 字节。
  • 保留:6 位,现在一般置零,为将来新的用途保留。
  • 窗口大小:16 位。TCP 流量控制是通过接收方告知自己的窗口大小来确认的。窗口大小是字节数,它标识了接收方从回发的确认号 ack 开始,希望接收的字节数量,由于这个字段占用 16 位,所以当前滑动窗口的最大值是 65535 字节。
  • 校验和:16 位。校验和字段由发送方来填写,接收方对校验和执行 CRC 算法来检验 TCP 报文段在传输过程中是否损坏,这个校验不仅包括 TCP 头部,还包括数据部分。校验和字段是 TCP 实现可靠传输的重要保障。
    再重复一次,TCP 报文头部的校验和由发送方填写,由接收方负责校验。校验和字段占据 TCP 报头当中的 16 位,是 TCP 实现可靠传输的重要保障。
  • 紧急指针:16 位。当 URG 置位时,这个字段才有效。紧急指针是一个正的偏移量,与序列号相加得到的值表示紧急数据最后一个字节的序列号。使用紧急指针是发送端向接受端发送紧急数据的一种方式。
  • 选项和填充:TCP 头部的选项字段是可变长的。这部分最多包含 40 个字节,因为根据报头的“头部信息长度”字段,TCP 报文头部的最大长度为 60 个字节。最常见的可选字段是“最长报文大小”MSS,发送方通常在通信的第一个报文段指出这个选项,它表示本端所能接受的最大报文段的长度。
  • 数据部分:TCP 报文段中的数据部分是可选的。在连接建立与终止时,双方交换的报文仅包含头部。

TCP 报文头部当中还包含六个控制位,它们分别是:

  • URG:紧急指针标识,置位时该报文应该优先发送;
  • ACK:确认标识,置位时报头当中的确认号才有效;
  • RST:重置连接标识,用于重置由于主机崩溃或其他原因而出现错误的连接。RST 置位的报文段称为复位报文段;
  • SYN:表示请求建立一个连接。称 SYN 置位的报文段为同步报文段;
  • FIN:结束标识,用于释放连接。置位时表示发送方没有数据要发送了,关闭本方数据流。称携带 FIN 标识的报文为结束报文段;
  • PSH:push 标识,置位表示带有 push 标志的数据。接收方在接收这个报文段时,应该优先将这个报文当中的数据发送给应用程序,而不是在缓冲区等待。

TCP 如何保证可靠传输?

1. 数据完整性保障

(1) 序列号与确认应答
通过序列号与确认应答确保可靠传输:基于 TCP 协议的通信过程当中,TCP 报文会为其传输的每一个字节进行唯一的序列号标识,接收方通过 ACK 报文明确告知自己已经成功接收的字节范围。

(2) 超时重传
超时重传:根据网络延迟动态调整重传的等待时间;当接收方连续发送三个重复的 ACK 报文时,无需等待,发送方快速充传。

2. 顺序与去重控制

(1) 滑动窗口协议
滑动窗口:接收方通过指定报头当中的窗口大小字段,告知发送方其可用的缓冲区大小,发送方可动态调整字节发送频率;接收方可以在缓冲区缓存乱序到达的数据,排序后再发送给应用层。

(2) 数据去重
数据去重:通过序列号识别重复报文,丢弃冗余数据。

3. 流量与拥塞控制

(1) 流量控制

  • 背压控制:接收方通过 TCP 头部的窗口大小字段动态控制发送频率。
  • 零窗口探测:发送方定期发送探测报文,避免接收方窗口更新导致死锁。

(2) 拥塞控制

  • 慢启动:初始窗口指数增长,快速探测可用带宽;
  • 拥塞避免:达到阈值后线性增长,发生丢包时窗口大小减半;
  • 快速恢复:结合快速重传,避免过度降速。

4. 连接控制

三次握手确保连接的可靠性,四次挥手确保双向连接可靠关闭,并处理残留的报文。

5. 其他辅助机制

  • 校验和:TCP 头部和数据部分计算校验和,丢弃损坏的报文。
  • 选择性确认:扩展选项,允许接收方明确告知损坏的数据块,减少重传量。

TCP 可靠传输的保障手段总结

上面总结了五条 TCP 可靠传输的保障手段。我个人认为比较好理解、方便记忆的包括以下几条:

  • 在连接建立时,双方通过三次握手确保连接可靠建立;在断开连接时,通过四次挥手可靠关闭;
  • 接收方可以通过发送 ACK 置位的报文,通过确认号告知发送方当前接收方已经收到了哪些数据;
  • TCP 报文当中的校验和字段由发送方负责填写,接收方对 TCP 报头和数据部分进行校验和的计算并与接收到的校验和进行比对,如果数据出错,则丢弃;
  • 接收方会通过 TCP 报文告知发送方当前自己可用的缓冲区大小,发送方可据此动态调整数据的发送频率。接收到的数据会首先在缓冲区进行排序,再发送给应用层;
  • 发送方在发送数据时,会进行拥塞控制。具体来说,刚开始发送时,发送数据的窗口大小会指数增长,快速探测可用带宽,发生丢包时会将窗口大小减半,结合快速重传避免过度降速(不过我个人认为拥塞控制与可靠传输的关系没有那么强)。

TCP 的三次握手?

在这里插入图片描述
第一次握手
客户端发起连接请求,将 TCP 报文头部的 SYN 置位,SYN 置位时,将隐式占用一个序列号,此时初始的序列号为x,发送给服务器,客户端进入 SYN_SENT 状态,等待服务器回发 ACK 报文确认。

第二次握手
服务器接收到 SYN 报文后,准备回发确认报文,将该报文的 SYN 和 ACK 置位,确认号为 x + 1,以告知发送方我已经接受到了前 x 个字节,同时初始化自己的序列号 y,发送给客户端。服务器进入 SYN_RECV 状态。

第三次握手
客户端接收到来自服务器的 ACK 与 SYN 置位的报文后,向服务器发送 ACK 置位的确认包,这个包当中的确认号为 y + 1,并且序列号为 x + 1。这个包发送完毕后,客户端和服务器进入 ESTABLISHED 状态,表示 TCP 连接建立成功。

TCP 为什么要三次握手?

只有三次握手才能证明客户端和服务器的收发能力都是正常的

  • 第一次握手:客户端发送数据,服务端接收数据,服务端可以知道客户端发送数据以及服务端接收数据的能力是正常的。
  • 第二次握手:服务端发送数据,客户端接收数据,客户端可以知道服务端的发送能力和自己的发送与接收能力是正常的。
  • 第三次握手:客户端发送数据,服务端接收数据,服务端可以知道自己的发送数据能力以及客户端的接收能力是正常的。

TCP 三次握手出现报文丢失的情况会发生什么?

第一次握手丢失
第一次握手时,客户端发送 SYN 置位的连接请求报文,由于得不到服务器 ACK && SYN 报文的响应,客户端会触发超时重传。重传的序列号与之前一致,并且尝试重传的次数有上限,超限之后断开连接。

第二次握手丢失
第二次握手时,服务器发送 SYN 与 ACK 置位的确认报文给客户端。如果这个报文丢失,那么客户端迟迟得不到服务器 ACK && SYN 响应,仍然触发超时重传,与第一次握手丢失的处理方式相同。此外,服务器由于接收不到确认其刚刚发送的 SYN && ACK 报文的 ACK 报文,也会触发超时重传。

第三次握手丢失
第三次握手时,客户端发送 ACK 报文来确认服务端方才发送的 SYN && ACK 报文。此时客户端进入 ESTABLISHED 状态,如果客户端的 ACK 报文丢失,服务端接收不到 ACK 报文则会重发 SYN && ACK 报文,直到收到 ACK 报文或达到重传次数上限。

TCP 为什么不是两次握手?

避免历史连接
如果采用两次握手,客户端发送 SYN 连接请求报文之后,假设此时网络较为拥堵,这个报文在网络当中滞留,客户端触发超时重传,并选取另一个通常的链路发送到了服务端,服务端通过二次握手回发确认报文与客户端建立连接,并完成了数据传输与连接断开。此时滞留在网络当中的第一个连接请求到达服务端,服务端通过二次握手再次与已经传输完数据的客户端建立连接,会导致不必要的错误与资源占用。

如果采取三次握手,那么滞留的 ACK 报文到达服务端后,服务端回发 ACK && SYN 报文,此时客户端接收到这个报文后,由于它已经与服务端传输完了数据,不会再回发第三次握手与服务端建立连接。

同步双方初始序列号
三次握手可以使得通信双方互相知晓各自的初始序列号。如果是两次握手,那么客户端发送 SYN 报文后,服务端发送 SYN && ACK 报文确认了 SYN 报文的序列号,但是服务端自身的初始序列号没有得到确认。

相关文章:

【每日八股】复习计算机网络 Day1:TCP 的头部结构 + TCP 确保可靠传输 + TCP 的三次握手

文章目录 复习计算机网络 Day1TCP 的头部结构TCP 如何保证可靠传输?1. 数据完整性保障2. 顺序与去重控制3. 流量与拥塞控制4. 连接控制5. 其他辅助机制TCP 可靠传输的保障手段总结 TCP 的三次握手?TCP 为什么要三次握手?TCP 三次握手出现报文…...

device_fingerprint、device_id、hmac生成

文章目录 1. 写在前面2. 设备信息3. 数美指纹 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...

高防IP如何针对DDoS攻击特点起防护作用

高防IP通过​​多层防护机制​​和​​动态资源调度能力​​,针对性化解DDoS攻击的核心特征(如大流量、协议滥用、连接耗尽等)。以下是其具体防护策略与技术实现: ​​一、DDoS攻击的核心特点与高防IP的针对性策略​​ ​​攻击特…...

python抓取HTML页面数据+可视化数据分析(投资者数量趋势)

本文所展示的代码是一个完整的数据采集、处理与可视化工具,主要用于从指定网站下载Excel文件,解析其中的数据,并生成投资者数量的趋势图表。以下是代码的主要功能模块及其作用: 1.网页数据获取 使用fetch_html_page函数从目标网…...

C++ std::function的含义、意义和用法,与std::bind的区别

在 C 中&#xff0c;std::function 是一个通用的多态函数包装器&#xff0c;它是 C 标准库 <functional> 头文件中的一部分。下面从含义、意义和用法三个方面详细介绍 std::function。 含义 std::function 是一个类模板&#xff0c;它可以存储、复制和调用任何可调用对…...

uboot下读取ubifs分区的方法

在uboot 的defconfig中增加以下内容&#xff1a; CONFIG_MTDIDS_DEFAULT"nand0nand0" CONFIG_MTDPARTS_DEFAULT"mtdpartsnand0:1M(boot1),1M(boot2),1M(hwinfo),6M(kernel1),6M(kernel2),56M(rootfs1),56M(rootfs2),-(ubi2)" CONFIG_CMD_UBIy 其中&#x…...

HAL详解

一、直通式HAL 这里使用一个案例来介绍直通式HAL&#xff0c;选择MTK的NFC HIDL 1.0为例&#xff0c;因为比较简单&#xff0c;代码量也比较小&#xff0c;其源码路径&#xff1a;vendor/hardware/interfaces/nfc/1.0/ 1、NFC HAL的定义 1&#xff09;NFC HAL数据类型 通常定…...

MCP(模型上下文协议)说明

背景 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;旨在解决大型语言模型&#xff08;LLM&#xff09;与外部数据源及工具集成的问题。由Anthropic公司于2024年11月提出并开源&#xff0c;目标是实现AI模型与现有系统的无缝集成。 解决的问题…...

AI当前状态:有哪些新技术

一、到目前为址AI领域出现的新技术 到目前为止&#xff0c;AI领域涌现了许多令人兴奋的新技术。以下是一些关键的进展&#xff0c;涵盖了从基础模型到实际应用的多个方面&#xff1a; 1. 更强大的大型语言模型 (LLMs): 性能提升: 新一代LLM&#xff0c;例如OpenAI的GPT-4o和…...

如何校验一个字符串是否是可以正确序列化的JSON字符串呢?

方法1&#xff1a;先给一个比较暴力的方法 try {JSONObject o new JSONObject(yourString); } catch (JSONException e) {LOGGER.error("No valid json"); } 方法2&#xff1a; Object json new cn.hutool.json.JSONTokener("[{\"name\":\"t…...

orcad csi 17.4 DRC规则设置及检查

rCAD绘制完原理图之后总是需要开启DRC检测&#xff0c;但是DRC一般都是英文版的&#xff0c;下面基于Cadence17.4 的orCAD16.6 对DRC的界面做简单的介绍 首先&#xff0c;鼠标点击原理图&#xff0c;然后再点击右上方的小勾图标 desine rules check option选项的界面 电气规…...

k8s教程3:Kubernetes应用的部署和管理

学习目标 理解Kubernetes中应用部署的基本概念和方法掌握Deployment、ReplicaSet、StatefulSet、DaemonSet、Job与CronJob等控制器的使用了解Helm作为Kubernetes的包管理工具的基本使用通过实际示例学习应用的部署、更新与管理 Kubernetes提供了一套强大而灵活的机制&#xff…...

微信小程序获得当前城市,获得当前天气

// // 获取用户当前所在城市 // wx.getLocation({// type: wgs84, // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 // success: function(res) {// console.log(获取位置成功, res); // // 使用腾讯地图API进行逆地址解析 // wx…...

磁流变式汽车减振器创新设计与关键技术研究

摘要 本文针对智能悬架系统的发展需求&#xff0c;深入探讨磁流变减振器&#xff08;MR Damper&#xff09;的核心设计原理与工程实现路径。通过建立磁场-流场耦合模型&#xff0c;优化磁路结构与控制策略&#xff0c;提出具有快速响应特性的新型磁流变减振器设计方案&#xf…...

Python3.14都有什么重要新特性

目录 1、语法糖新宠&#xff1a;模式匹配再进化 1.1 结构化数据克星 1.2 类型守卫(Type Guard) 2、性能黑科技&#xff1a;尾递归与异步双杀 2.1 尾调用优化(TCO) 2.2 异步任务重构 3、注释系统重构&#xff1a;annotationlib深度解析 3.1 延迟评估机制 3.2 类型推导增…...

前端资源加载失败后重试加载(CSS,JS等引用资源)

前端资源加载失败后的重试 .前端引用资源时出现了资源加载失败(这里针对的是路径引用异常或者url解析错误时) 解决这个问题首先要明确一下几个步骤 1.什么情况或者什么时候重试 2.如何重试 3.重试过程中的边界处理 这里引入里三个测试脚本&#xff0c;分别加载里三个不同的脚…...

【HDFS入门】联邦机制(Federation)与扩展性:HDFS NameNode水平扩展深度解析

目录 引言 1 NameNode水平扩展原理 1.1 传统HDFS架构的局限性 1.2 联邦机制的基本原理 1.3 联邦架构的关键组件 2 多个Namespace的路由规则配置 2.1 客户端挂载表概念 2.2 挂载表配置示例 2.3 挂载表匹配规则 2.4 配置示例 3 BlockPool与Namespace的映射关系 3.1 B…...

C#学习第16天:聊聊反射

什么是反射&#xff1f; 定义&#xff1a;反射是一种机制&#xff0c;允许程序在运行时获取关于自身的信息&#xff0c;并且可以动态调用方法、访问属性或创建实例。用途&#xff1a;常用于框架设计、工具开发、序列化、代码分析和测试等场景 反射的核心概念 1. 获取类型信息…...

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey https://arxiv.org/pdf/2407.18369 https://www.doubao.com/chat/3262156521106434 速览 研究动机&#x…...

AI推荐系统的详细解析 +推荐系统中滤泡效应(Filter Bubble)的详细解析+ 基于Java构建电商推荐系统的分步实现方案,结合机器学习与工程实践

以下是AI推荐系统的详细解析&#xff1a; 一、核心概念 定义 推荐系统是通过分析用户行为、物品特征或用户画像&#xff0c;向用户推荐个性化内容的技术&#xff0c;广泛应用于电商、视频、社交等领域。 目标 提升用户留存与转化率增强用户体验实现精准营销 二、技术原理 1…...

CSS 美化页面(五)

一、position属性 属性值‌‌描述‌‌应用场景‌static默认定位方式&#xff0c;元素遵循文档流正常排列&#xff0c;top/right/bottom/left 属性无效‌。普通文档流布局&#xff0c;默认布局&#xff0c;无需特殊定位。relative相对定位&#xff0c;相对于元素原本位置进行偏…...

java 设计模式之模板方法模式

简介 模板方法模式&#xff1a;定义一个算法的基本流程&#xff0c;将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性&#xff0c; 模板方法中包含的角色&#xff1a; 抽象类&#xff1a;负责给出一个算法的基本流程&#xff0c;它由一个模板方法和若干个基本…...

基于大模型的腹股沟疝诊疗全流程风险预测与方案制定研究报告

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与创新点 二、大模型技术概述 2.1 大模型基本原理 2.2 常用大模型类型及特点 2.3 大模型在医疗领域的应用潜力 三、腹股沟疝诊疗流程分析 3.1 腹股沟疝的发病机制与分类 3.2 传统术前评估方法与局…...

无约束最优化问题的求解算法--梯度下降法(Gradient Descent)

文章目录 梯度下降法梯度下降法原理&#xff08;通俗版&#xff09;梯度下降法公式学习率的设置**如何选择学习率&#xff1f;** 全局最优解梯度下降法流程损失函数的导函数三种梯度下降法**梯度下降法核心步骤回顾****优缺点详解****1. 全量梯度下降 (Batch Gradient Descent,…...

Python全功能PDF工具箱GUI:支持转换、加密、旋转、图片提取、日志记录等多功能操作

使用Python打造一款集成 PDF转换、编辑、加密、解密、图片提取、日志追踪 等多个功能于一体的桌面工具应用&#xff08;Tkinter ttkbootstrap PyPDF2 等库&#xff09;。 ✨项目背景与开发动机 在日常办公或学习中&#xff0c;我们经常会遇到各种关于PDF文件的操作需求&#…...

[密码学实战]国密算法面试题解析及应用

以下是密码学领域常见的面试题及其详细解析,涵盖基础理论、算法实现与应用场景,帮助系统化备战技术面试 一、基础概念类 1. 密码学的主要目标是什么? 答案: 确保数据的机密性(加密防止窃听)、完整性(哈希校验防篡改)、认证性(数字签名验证身份)和不可否认性(签名防…...

React 受控表单绑定基础

React 中最常见的几个需求是&#xff1a; 渲染一组列表绑定点击事件表单数据与组件状态之间的绑定 受控表单绑定是理解表单交互的关键之一。 &#x1f4cd;什么是受控组件&#xff1f; 在 React 中&#xff0c;所谓“受控组件”&#xff0c;指的是表单元素&#xff08;如 &l…...

计算机视觉---相机标定

相机标定在机器人系统中的作用 1.确定相机的内部参数 相机的内部参数包括焦距、主点坐标、像素尺寸等。这些参数决定了相机成像的几何关系。通过标定&#xff0c;可以精确获取这些参数&#xff0c;从而将图像中的像素坐标与实际的物理坐标建立联系。例如&#xff0c;已知相机…...

LeetCode 443 压缩字符串

字符数组压缩算法详解&#xff1a;实现与分析 一、引言 在处理字符数组时&#xff0c;我们常常遇到需要对连续重复字符进行压缩的场景。这不仅可以节省存储空间&#xff0c;还能提升数据传输效率。本文将深入解析一个经典的字符数组压缩算法&#xff0c;通过详细的实现步骤和…...

datasheet数据手册-阅读方法

DataSheet Datasheet&#xff08;数据手册&#xff09;&#xff1a;电子元器件或者芯片的数据手册&#xff0c;一般由厂家编写&#xff0c;格式一般为PDF&#xff0c;内容为电子分立元器件或者芯片的各项参数&#xff0c;电性参数&#xff0c;物理参数&#xff0c;甚至制造材料…...