架构师面试(二十二):TCP 协议

news2025/6/3 23:14:49

问题

今天我们聊一个非常常见的面试题目,不管前端还是后端,也不管做的是上层业务还是底层框架,更不管技术方向是运维还是架构,都可以思考和参与一下哈!

TCP协议无处不在,我们知道 TCP 是基于连接的端到端的且是有序和可靠的数据流式传输协议,可以记住这五个关键词哈:【基于连接】【端到端】【有序】【可靠】【流式传输】。 

今天的问题有两个:TCP协议是如何做到【可靠】数据传输的?既然 TCP 协议非常可靠,那为什么在应用层还需要 ACK 确认机制呢?(比如消息类软件:IM、MQ等)

解析

第一个问题考查的是计算机网络基础知识(我们在大厂高薪课讲过这个问题);

第二个问题考查的是网络知识在实际项目中的应用(我们在架构师课上也讲过这个问题哈)。

我们先来看第一个问题:“TCP 协议是如何做到【可靠】数据传输的?”

怎么理解这里的【可靠】呢?

节点 A  要把数据 “hello” 传输给节点 B,其结果就是 节点B一定会收到数据“hello”,这就是【可靠】。

针对这样的场景,【可靠】如何落地呢?

节点 A  需要知道节点 B 已经收到了数据,而且节点 B 收到的就是节点 A 发送的 “hello”,不是“hi”,也不是"HELLO"。

对【可靠数据传输的落地实践】总结两点:

一是 发送方收到了接收方接受数据的事件;

二是 接收方接受的数据就是发送方发送的数据。

这两点在 TCP 协议中是如何体现的?

第一点是通过【序列号和确认号机制】;

第二点是通过【校验和机制】。

先说【序列号和确认号机制】

在 TCP 协议头中,有一个 seq 字段(即序列号,32位长)和一个 ack 字段(即确认号,32位长)。

TCP 协议传输的字节流中,每一个字节都是有编号的,seq 字段就是要传输的一段字节流的第一个字节的编号;假设发送方要发送的报文的第一个字节编号是 100,而报文长度是 200,那么发送时 seq =100,下一次要发送报文时,seq=300。

而 确认号 ack 字段表示 接收方期望收到下一个报文的第一个字节的编号;还是刚才这个例子,发送方 seq=100,报文长度=200,接收方收到后在回复时,需要  ack=300;也就是编号 299 及之前的字节流我都收到了。

序列号 seq 和确认号 ack 不但完成了接收数据确认的任务,也完成了对有序数据的职责。

再说【校验和机制】

TCP 在传输数据时,发送方将数据段都当做一个 16 位的整数,将这些整数加起来(进位补在后面,不能丢弃),然后取反,得到校验和;接收方收到数据后,再进行相同的运算,得到校验和,与发送方的校验和进行比对,来判断 收到的 “hello” 是不是发送方发送的 “hello”。

通过以上【序列号和确认号机制】和【校验和机制】可以确认数据是可靠传输的,这毕竟是一次数据传输的可靠,那如何保证数据能持续性的可靠传输呢?有三个常用的策略和手段:

(1)超时重传:我们知道 TCP 协议不是每一次数据发送都有对应的 ack 包的,但是长时间没有ack 包就不应该了,此时可以通过 超时重传 机制来重发数据;

(2)流量控制:如果接收方应用层程序处理逻辑太慢,会导致 TCP 接收缓冲区被数据占满,此时再发送数据已然无意义,需要控制流量了;TCP 通过 滑动窗口解决这个问题;

(3)拥塞控制:【流量控制】表征的是接收方接收和处理数据的能力,如果数据在传输过程中出现了拥堵怎么办呢?这就需要拥塞控制了,TCP通过 拥塞窗口解决这个问题;值得一提的是, TCP是具有自我牺牲精神的,出现了交通拥堵,不会争着抢着去跑,一般都会主动让出道路。

我们再来看第二个问题:“既然 TCP 协议非常可靠,那为什么在应用层还需要 ACK 确认机制呢?”

TCP协议非常可靠,是指在连接没有断开的时候;

我们可以这样讲:如果在程序运行的整个生命周期中,TCP 连接处于理想环境中,没有任何外部因素导致它中断,那么应用层是可以不需要 ACK 确认机制的。

我们简单分析一下数据传输过程:

发送方基于 TCP 协议将数据发送到接收方的 TCP 缓冲区,TCP 缓冲区工作在 TCP 层,由操作系统控制;操作系统内核会将 TCP 缓冲区的数据拷贝到应用层,由工作在应用层的进程进行处理。

当 TCP 连接断开的时候,操作系统会一直保留 TCP 缓冲区中还未处理的数据吗?

肯定不会(一是为了释放内存,节省资源;二是连接断开后,会尽快重连的,此时必须为新的连接开辟一块干净的空间,不会对之前的 TCP 缓冲区进行复用的),操作系统会直接回收 TCP 缓冲区,也就意味着数据丢失了;因此在应用层进行 ACK 确认机制是必要的。

我们可以想象一下:我们在应用层尽情的接收着数据,这些数据很多时候来自 TCP 层不同时间段创建的多条TCP连接。

上面啰嗦了很多,是为了尽最大努力帮助大家理解;最后对问题进行简单总结:

TCP 协议是如何做到【可靠】数据传输的?通过【序列号和确认号机制】和【校验和机制】,辅助手段是 【超时重传】【滑动窗口】【拥塞窗口】;

既然 TCP 协议非常可靠,那为什么在应用层还需要 ACK 确认机制呢?TCP 传输数据是可靠的,但不能保证 TCP 缓冲区的数据一定能到应用层。

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

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

相关文章

程序自动化填写网页表单数据

1 背景介绍 如何让程序自动化填写网页表单数据,特别是涉及到批量数据情况时,可以减少人力。下面是涉及到的一些场景,都可以通过相关自动化程序实现。 场景1 场景1,领导安排,通过相关省、市、县、乡镇数据&#xff0…

Razer macOS v0.4.10快速安装

链接点这里下载最新的 .dmg 文件。将下载的 .dmg 映像文件拖入 应用程序 文件夹中。若首次打开时出现安全警告【什么扔到废纸篓】,这时候点击 Mac 的“系统偏好设置”-> “安全性与隐私”-> “通用”,然后点击底部的 “打开”。【或者仍然打开】 对…

如何自动化同义词并使用我们的 Synonyms API 进行上传

作者:来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词, 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…

一. 相机模组摆放原理

1. 背景: 相机开发时经常出现因模组摆放问题,导致相机成像方向异常。轻则修改软件、模组返工, 重则重新修改堆叠,影响相机调试进度。因此,设计一个模型实现模组摆放纠错很有必要。 2. 原理: 2.1 口诀&am…

【C++游戏引擎开发】《线性代数》(1):环境配置与基础矩阵类设计

一、开发环境配置 1.1 启用C 20 在VS2022中新建项目后右键项目 1.2 启用增强指令集 1.3 安装Google Test vcpkg安装使用指南 vcpkg install gtest:x64-windows# 集成到系统目录,只需要执行一次,后续安装包之后不需要再次执行 vcpkg integrate inst…

sqli-labs靶场 less 8

文章目录 sqli-labs靶场less 8 布尔盲注 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”&#xf…

基于大模型的知识图谱搜索的五大核心优势

在传统知识图谱与生成式AI融合的浪潮中,基于大模型的知识图谱搜索正成为新一代智能检索的标杆技术,飞速灵燕智能体平台就使用了该技术,其核心优势体现在: 1. 语义穿透力升级 突破关键词匹配局限,通过大模型的深层语义…

【MySQL】从零开始:掌握MySQL数据库的核心概念(五)

由于我的无知,我对生存方式只有一个非常普通的信条:不许后悔。 前言 这是我自己学习mysql数据库的第五篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的增删查改,没看的同学可以过去看看&#xf…

Java版Manus实现来了,Spring AI Alibaba发布开源OpenManus实现

此次官方发布的 Spring AI Alibaba OpenManus 实现,包含完整的多智能体任务规划、思考与执行流程,可以让开发者体验 Java 版本的多智能体效果。它能够根据用户的问题进行分析,操作浏览器,执行代码等来完成复杂任务等。 项目源码及…

鸿蒙UI开发

鸿蒙UI开发 本文旨在分享一些鸿蒙UI布局开发上的一些建议,特别是对屏幕宽高比发生变化时的应对思路和好的实践。 折叠屏适配 一般情况(自适应布局/响应式布局) 1.自适应布局 1.1自适应拉伸 左右组件定宽 TypeScript //左右定宽 Row() { …

Elasticsearch-实战案例

一、没有使用Elasticsearch的查询速度698ms 1.数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。需要注意的是,数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增…

IP数据报报文格式

一 概述 IP数据报由两部分组成:首部数据部分。首部的前一部分是固定长度,一共20字节大小,是所有IP数据报文必须具有的;固定部分后面是一些可选字段,其长度是可变的。 二 首部固定部分各字段意义 (1&…

openEuler24.03 LTS下安装Kafka集群

目录 前提条件 Kafka集群规划 下载Kafka 解压 设置环境变量 配置Kafka 分发到其他机器 分发安装文件 分发环境变量 启动Kafka 测试Kafka 关闭Kafka 集群启停脚本 问题及解决 前提条件 安装好ZooKeeper集群,可参考:openEuler24.03 LTS下安…

qt QQuaternion详解

1. 概述 QQuaternion 是 Qt 中用于表示三维空间中旋转的四元数类。它包含一个标量部分和一个三维向量部分,可以用来表示旋转操作。四元数在计算机图形学中广泛用于平滑的旋转和插值。 2. 重要方法 默认构造函数 QQuaternion::QQuaternion(); // 构造单位四元数 (1…

epoch、batch、batch size、step、iteration深度学习名词含义详细介绍

卷积神经网络训练中的三个核心概念:Epoch、Batch Size 和迭代次数 在深度学习中,理解一些基本的术语非常重要,这些术语对模型的训练过程、效率以及最终性能都有很大影响。以下是一些常见术语的含义介绍: 1. Epoch(周…

TCP 协议算法解析 | RTT / 滑动窗口 / 拥塞控制

注:本文为 “TCP 协议算法解析” 相关文章合辑。 略作重排,未去重。 如有内容异常,请看原文。 TCP 的那些事儿(上) 2014 年 05 月 28 日 陈皓 TCP 是一个极为复杂的协议,因为它需要解决众多问题&#x…

卷积神经网络 - ResNet(残差网络)

残差网络(Residual Network,ResNet)通过给非线性的卷积层增加直连边 (Shortcut Connection)(也称为残差连接(Residual Connection))的方式来提高信息的传播效率。 这是一种特殊的深度神经网络结构,由 Kaiming He 等人在 2015 年提出,目的是解…

GreenPlum学习

简介 Greenplum是一个面向数据仓库应用的关系型数据库,因为有良好的体系结构,所以在数据存储、高并发、高可用、线性扩展、反应速度、易用性和性价比等方面有非常明显的优势。Greenplum是一种基于PostgreSQL的分布式数据库,其采用sharednothi…

传统神经网络、CNN与RNN

在网络上找了很多关于深度学习的资料,也总结了一点小心得,于是就有了下面这篇文章。这里内容较为简单,适合初学者查看,所以大佬看到这里就可以走了。 话不多说,上图 #mermaid-svg-Z3k5YhiQ2o5AnvZE {font-family:&quo…

无人机,雷达定点飞行时,位置发散,位置很飘,原因分析

参考: 无人车传感器 IMU与GPS数据融合进行定位机制_gps imu 组合定位原始数-CSDN博客 我的无人机使用雷达定位,位置模式很飘 雷达的更新频率也是10HZ, 而px飞控的频率是100HZ,没有对两者之间的频率差异做出处理 所以才导致无人…