架构师面试(二十二):TCP 协议
问题
今天我们聊一个非常常见的面试题目,不管前端还是后端,也不管做的是上层业务还是底层框架,更不管技术方向是运维还是架构,都可以思考和参与一下哈!
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 缓冲区的数据一定能到应用层。

相关文章:
架构师面试(二十二):TCP 协议
问题 今天我们聊一个非常常见的面试题目,不管前端还是后端,也不管做的是上层业务还是底层框架,更不管技术方向是运维还是架构,都可以思考和参与一下哈! TCP协议无处不在,我们知道 TCP 是基于连接的端到端…...
程序自动化填写网页表单数据
1 背景介绍 如何让程序自动化填写网页表单数据,特别是涉及到批量数据情况时,可以减少人力。下面是涉及到的一些场景,都可以通过相关自动化程序实现。 场景1 场景1,领导安排,通过相关省、市、县、乡镇数据࿰…...
Razer macOS v0.4.10快速安装
链接点这里下载最新的 .dmg 文件。将下载的 .dmg 映像文件拖入 应用程序 文件夹中。若首次打开时出现安全警告【什么扔到废纸篓】,这时候点击 Mac 的“系统偏好设置”-> “安全性与隐私”-> “通用”,然后点击底部的 “打开”。【或者仍然打开】 对…...
常用正则表达式-MAC 地址
MAC地址的定义 物理地址(通常称为 MAC地址,Media Access Control Address)是网络设备在数据链路层(如以太网、Wi-Fi)的唯一标识符。它由设备的网络接口卡(NIC)固化在硬件中,用于在局…...
如何自动化同义词并使用我们的 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注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
基于大模型的知识图谱搜索的五大核心优势
在传统知识图谱与生成式AI融合的浪潮中,基于大模型的知识图谱搜索正成为新一代智能检索的标杆技术,飞速灵燕智能体平台就使用了该技术,其核心优势体现在: 1. 语义穿透力升级 突破关键词匹配局限,通过大模型的深层语义…...
【MySQL】从零开始:掌握MySQL数据库的核心概念(五)
由于我的无知,我对生存方式只有一个非常普通的信条:不许后悔。 前言 这是我自己学习mysql数据库的第五篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的增删查改,没看的同学可以过去看看…...
人生感悟8
前言 今天,在这里跟各位聊一些看法。为什么现在的歌曲和影视剧越来越没有艺术性和内涵?为什么现在读书的人越来越少? 正文 这里我先声明一点,就像C或者是Java创建variable or constant一样,本文所述内容只限于个人观…...
Java版Manus实现来了,Spring AI Alibaba发布开源OpenManus实现
此次官方发布的 Spring AI Alibaba OpenManus 实现,包含完整的多智能体任务规划、思考与执行流程,可以让开发者体验 Java 版本的多智能体效果。它能够根据用户的问题进行分析,操作浏览器,执行代码等来完成复杂任务等。 项目源码及…...
鸿蒙UI开发
鸿蒙UI开发 本文旨在分享一些鸿蒙UI布局开发上的一些建议,特别是对屏幕宽高比发生变化时的应对思路和好的实践。 折叠屏适配 一般情况(自适应布局/响应式布局) 1.自适应布局 1.1自适应拉伸 左右组件定宽 TypeScript //左右定宽 Row() { …...
Elasticsearch-实战案例
一、没有使用Elasticsearch的查询速度698ms 1.数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。需要注意的是,数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增…...
#基于Django实现机器学习医学指标概率预测网站
基于Django实现机器学习医学指标概率预测网站 一、引言 在当今数字化医疗的大背景下,利用机器学习模型结合Web应用进行医学指标的概率预测具有重要的实际意义。本文将详细介绍一个基于Django框架构建的医学指标概率预测系统,通过结合随机森林模型&…...
【bug】OPENCV和FPGA的版本对应关系
如果opencv和FPGA的版本不对应,则会出现如下warning /usr/bin/ld: warning: libavcodec.so.57, needed by /usr/lib/gcc/aarch64-linux-gnu/7/../../../aarch64-linux-gnu/libopencv_videoio.so, may conflict with libavcodec.so.58 /usr/bin/ld: warning: libavformat.so.5…...
IP数据报报文格式
一 概述 IP数据报由两部分组成:首部数据部分。首部的前一部分是固定长度,一共20字节大小,是所有IP数据报文必须具有的;固定部分后面是一些可选字段,其长度是可变的。 二 首部固定部分各字段意义 (1&…...
一键实现:谷歌表单转word(formtoword)
一键将 Google Forms 转换为 Word,最简单的方法 有些繁琐的工作让人倍感挫败,明明 应该 可以自动化。你精心制作了一份 Google Forms,收集了数据,现在需要在 Word 文档中分享其结构或内容。于是,你只能手动复制粘贴问…...
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(周…...
pytorch中不同的mask方法:masked_fill, masked_select, masked_scatter
在 PyTorch 中,masked_fill、masked_select 和 masked_scatter 是三种常用的掩码(mask)操作方法,它们通过布尔类型的掩码张量(mask)对原始张量进行条件筛选或修改。以下是它们的详细解释和对比:…...
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,没有对两者之间的频率差异做出处理 所以才导致无人…...
【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在现代操作系统中,线程是程序执行流的最小单元。与进程相比,线程更加轻量级,创建和销毁的开销更小&…...
做游戏的发展方向
自己做的游戏(询问发展方向) 请选择发展方向(截止时间5.1)(投票截止3.24) (这将影响接下来用的游戏发展(未登录也可参加)) 网页 c(原)...
深入探索 iOS 卡顿优化
认识卡顿 一些概念 FPS:Frames Per Second,表示每秒渲染的帧数,通过用于衡量画面的流畅度,数值越高则表示画面越流畅。CPU:负责对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码…...
