【面试八股总结】传输控制协议TCP(二)

news2024/11/27 10:35:30

参考资料 :小林Coding、阿秀、代码随想录

一、TCP报文段首部

TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段

        一个 TCP 报文段分为首部和数据两部分,TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。

名称

含义

1

源端口和目的端口

  • 端口是运输层与应用层的服务接口。
  • 运输层的复用和分用功能都要通过端口才能实现。
  • 告诉主机报⽂段来⾃哪⾥,传给哪个上层协议或应⽤程序。

2

序号(序列号)

  • TCP 连接中传送的数据流中的每一个字节都有序号。
  • 序号字段的值则指的是本报文段所发送的数据的第一个字节的序号.

3

数据偏移

(首部长度)

  • 指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。
  • “数据偏移”的单位是 32 位字(以 4 字节为计算单位)

4

确认号

  • 期望收到对方的下一个报文段的数据的第一个字节的序号。

5

URG(URGENT)

  • 当 URG = 1 时,表明紧急指针字段有效。
  • 告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

6

ACK(Acknowledgment)

  • ACK = 0,确认号无效,ACK = 1,确认号有效

7

PSH (Push)

  • 接收方应该尽快将这个报文段交给应用层标志。
  • 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

8

RST (Reset)

  • 重置连接标志,当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

9

SYN

(Synchronize)

  • 发起一个连接标志,同步 SYN = 1 表示这是一个连接请求或连接接受报文。
  • SYN攻击:伪造大量虚拟地址向目标主机发起连接
  • LAND攻击:目标地址与源地址都是目标主机,向目标主机发起连接

10

FIN (Finish)

  • 用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

11

Window 窗口

  • 指示发送端还能接收多少字节的数据,接收缓存大小。
  • 用来让对方设置发送窗口的依据,单位为字节。

12

Checksum

校验和

  • 检验和字段检验的范围包括首部和数据这两部分。
  • 在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

13

Urgent Pointer

紧急指针

  • 仅在URG标志被设置时才有效,用于指示紧急数据的末尾字节序号。指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

14

选项字段

  • TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
  • MSS (Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段。所以,MSS是“TCP 报文段长度减去 TCP 首部长度”。

二、TCP流量控制

1. 利用滑动窗口实现流量控制

        流量控制 (flow control) 是为了控制发送方的发送速率,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

1.1 什么是窗口?

        TCP每发送⼀个数据,都需要⼀次应答,然后继续发送,为每个数据包都进行确认应答,缺点是:数据往返时间越长,网络吞吐量越低。为解决这个问题,TCP 引⼊窗口概念(首部Window字段)。即使在往返时间较长的情况下,它也不会降低网络通信效率。窗口大小是指无需等待确认应答,可以继续发送数据的最大值。

        窗口的实现是操作系统开辟的⼀个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

        如上图, 图中的 ACK 600 确认应答报文丢失,可以通过下一个确认应答进行确认,只要发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据「接收方」都收到了。这个模式就叫累计确认或者累计应答

        通常窗口的大小是由接收方的窗口大小来决定的。发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。

1.2 发送方滑动窗口

  • #1 是已发送并收到 ACK确认的数据:1~31 字节
  • #2 是已发送但未收到 ACK确认的数据:32~45 字节
  • #3 是未发送但总大小在接收方处理范围内(接收方还有空间):46~51字节
  • #4 是未发送但总大小超过接收方处理范围(接收方没有空间):52字节以后

        发送方将数据全部都发送后,可用窗口的大小就为 0 了,表明可用窗口耗尽,在没收到 ACK 确认之前是无法继续发送数据了。

        若收到之前发送数据的 ACK 确认应答后,如果发送窗口的大小没有变化,则滑动窗口往右边移动 k 个字节,因为有 k 个字节的数据被应答确认,接下来的 k 字节又变成了可用窗口。

1.3 接收方滑动窗口

  •  #1 + #2 是已成功接收并确认的数据(等待应用进程读取);
  • #3 是未收到数据但可以接收的数据;
  • #4 未收到数据并不可以接收的数据;

1.4 窗口关闭:

        TCP中采用滑动窗口进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报。两种情况除外:

  1. 发送紧急数据;
  2. 发送方可以发送一个1字节的数据报通知接受方重新声明它希望接收的下一字节以及发送方滑动窗口大小。 

举个🌰:

        如上图,B 向 A 发送了零窗口的报文段后不久,B 的接收缓存又有了一些存储空间。于是 B 向 A 发送了 rwnd = 400 的报文段。但这个报文段在传送过程中丢失了。A 一直等待收到 B 发送的非零窗口的通知,而 B 也一直等待 A 发送的数据。如果没有其他措施,这种互相等待的死锁局面将一直延续下去。

        为了解决这个问题,TCP 为每一个连接设有一个持续计时器 (persistence timer)。只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。

  • 若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。
  • 若窗口不是零,则死锁的僵局就可以打破了。

2. 糊涂窗口综合症

可以用不同的机制来控制 TCP 报文段的发送时机:

  • 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
  • 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送 (push) 操作。
  • 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。

        糊涂窗口综合症是指每次仅发送一个字节或很少几个字节的数据时,有效数据传输效率变得很低的现象。

2.1 发送方糊涂窗口综合症

        发送方 TCP 每次接收到一字节的数据后就发送。这样,发送一个字节需要形成 41 字节长的 IP 数据报,效率很低。

解决方法:使用 Nagle 算法

Negle算法伪代码:

if 有数据要发送 {
    if 可用窗口大小 >= MSS and 可发送的数据 >= MSS {
    	立刻发送MSS大小的数据
    } else {
        if 有未确认的数据 {
            将数据放入缓存等待接收ACK
        } else {
            立刻发送数据
        }
    }
}
  • 若发送应用进程把要发送的数据逐个字节地送到 TCP 的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。
  • 当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。
  • 只有在收到对前一个报文段的确认后才继续发送下一个报文段。
  • 当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。

2.2 接收方糊涂窗口综合症

        当接收方的 TCP 缓冲区已满,接收方会向发送方发送窗口大小为 0 的报文。

        若此时接收方的应用进程以交互方式每次只读取一个字节,于是接收方又发送窗口大小为一个字节的更新报文,发送方应邀发送一个字节的数据(发送的 IP 数据报是 41 字节长),于是接收窗口又满了,如此循环往复。

解决方法:

        让接收方等待一段时间,使得接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。

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

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

相关文章

MongoDB 启动异常

Failed to start up WiredTiger under any compatibility version. 解决方案: 删除WiredTiger.lock 和 mongod.lock两个文件,在重新启动。回重新生成新的文件。

vue3源码解析——ref和reactive定义响应式的区别

ref 和 reactive 是 Vue 3.0 中用于定义响应式数据的两个新 API。它们有以下区别: ref 定义单个响应式数据 数据类型可以是任意类型。它通常用于定义原始数据类型为响应式数据。返回一个响应式对象,该对象包含一个 .value 属性,可用于获取和设…

【滤波器基础】卡尔曼滤波器

滤波器基础 为了进一步抑制高频噪声,科研人员也会采用一些高阶低通滤波器来对电流采样信号的高频噪声进行抑制,常用的一种滤波器为:巴特沃兹滤波器。除了这种滤波器,也存在如贝塞尔、切比雪夫滤波器等。 巴特沃斯滤波器 在线性控…

linux自动化运维之ansible实战

ansible基础介绍 优点 - 相比于saltatack和puppet,没有客户端,更轻量级 - 只是一个工具,可以很容易实现分布式拓展 - 更强的远程执行命令 特点 - 模块化 - 支持自定义模块,可以用任何语言编写模块 - 基于python语言实现 - 部署简单…

深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现

大家好,我是微学AI,今天给大家介绍一下深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现。多模态CLIP(Contrastive Language-Image Pre-training)模型是一种深度学习模型,其核心设计理念是通过大规模的对比学习训练,实现图像与文本之间的跨模…

前端调试工具之Chrome Elements、Network、Sources、TimeLine调试

常用的调试工具有Chrome浏览器的调试工具,火狐浏览器的Firebug插件调试工具,IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速,功能强大这里主要介绍Chrome浏览器的调试工具。 打开 Google Chrome 浏览器&#xff0c…

便携式气象站是什么

TH-BQX5便携式气象站是一种用于应对突发天气灾害和紧急情况的便携式气象监测设备。它通常包括气温、湿度、气压、风速、风向和降水量等关键气象要素的测量功能,能够快速准确地记录这些气象参数。此外,一些高级的便携式气象站还具备预警功能,当…

阿里云学习笔记

1、什么是IaaS,PaaS和SaaS? IaaS、PaaS 和 SaaS 是云计算服务的三种主要模式,它们分别代表了不同的服务层级,按照由低到高的抽象程度排序如下: IaaS (Infrastructure as a Service) 基础设施即服务 提供的是底层的计…

Three.js——创建场景、渲染三维对象、添加灯光、添加阴影、添加雾化

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

早起的“鸟儿”有虫吃:如何在 App 运行的极早期执行代码?

功能需求 在某些开发场景中,我们希望能够在 App 运行时尽早执行一段代码,不求最早但求更早! 如上图所示,我们将会讨论在 App 生命早期运行代码的 5 种方法,小伙伴们可能会大吃一惊:applicationDidFinishLaunching 之类的方法竟然是最晚得到执行的! 在本篇博文中,您将…

mysql高阶之(视图)

目录 视图概念 视图概念 视图是基于一个或多个表的SQL查询结果的虚拟表。视图并不实际存储数据,而是保存了查询的定义。当你查询视图时,数据库引擎会按照视图的定义执行底层的SQL查询。 (一)视图作用 视图的主要作用时一张表或多…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化: 2.数据库设计与规划 1.提前估计数据量,使用什么存储引擎 2.数据库服务器专机专用,避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器,以达到稳定、高效的效果。主从同步、…

Python中的相关规则:注释,参数,模块和包

Python中的相关规则:注释,参数,模块和包 注释参数模块包(package)数据类型其他一些编写代码小技巧 注释 crtl/注释,多行注释(三对单引号或双引号):多行注释一般放在文件开头,标明整个…

Linux之实现Apache服务器监控、数据库定时备份及通过使用Shell脚本发送邮件

目录 一、Apache服务器监控 为什么要用到服务监控? 实现Apache服务器监控 二、数据库备份 为什么要用到数据库备份? 实现数据库备份 三、Shell脚本发送邮件 为什么要用使用Shell脚本发送邮件? 实现Shell脚本发送邮件 一、Apache服务器…

算法——所有可能的真二叉树:递归

. - 力扣(LeetCode) 思路:递归。因为要是真二叉树,节点树必为奇数个。 对于左子树和右子树分别递归构造,左子树从1开始一直到n-2,右子树从n-2开始一直到1; 然后使用数组接受左右子树构造出来的…

Annaconda的替代品miniforge!

用了多年的Annaconda竟然要收费了(个人不收费,企业收费,但个人电脑在企业IP下,还是被警告了),只能用miniforge 全面替换了! 一、卸载anaconda windows下卸载, 设置 -> 应用和功…

STM32之HAL开发——SPI写Flash源码

SPI通信收发原理框图(F1系列) SPI 初始化结构体详解 typedef struct { uint32_t Mode; /* 设置 SPI 的主/从机端模式 */ uint32_t Direction; /* 设置 SPI 的单双向模式 */ uint32_t DataSize; /* 设置 SPI 的数据帧长度,可选 8/16 位 */ u…

vscode连接服务器步骤

一 、下载vscode 下载vscode 在官网(https://code.visualstudio.com/)下载VsCode安装vscode 放到自己想安装的盘,最好不要C盘安装中文插件 安装完成后后下角会有提示说重启,点击重启就行。 4. 设置自动保存 点击右上角的文件—…

红杉资本:2024年关于AI的4大预测

四大预测 预测一:Copilot 将逐渐向 AI Agent 转变。 2024 年,AI 将从辅助人类的 Copilot 转变为真正能替代一些人类工作的Agent。AI 将更像是一个同事,而不仅仅是一个工具,这点在软件工程、客服等行业已经初步显现。 预测二&…

快速入门Linux,Linux岗位有哪些?(一)

文章目录 Linux与Linux运维操作系统?操作系统图解 认识LinuxLinux受欢迎的原因什么是Linux运维Linux运维岗位Linux运维岗位职责Linux运维架构师岗位职责Linux运维职业发展路线计算机硬件分类运维人员的三大核心职责 运维人员工作(服务器)什么…