TCP/IP_TCP协议
目录
一、TCP协议
1.1 确认应答
1.2 超时重传
1.3 连接管理
1.4 TCP状态
1.5 滑动窗口
1.6 流量控制
1.7 拥塞控制
1.8 延迟应答
1.9 捎带应答
1.10 粘包问题
1.11 异常情况
二、TCP/UDP对比
总结
一、TCP协议
TCP 协议和 UDP 协议是处于传输层的协议。
【TCP协议段格式】

【6位标志位】
1、URG:紧急指针是否有效。
2、ACK:应答报文。
3、PSH:提示接收端应用程序立即从TCP缓冲区中把数据读取走。
4、RST:对端要求重新建立连接。携带 RST 标识的称为复位报文段。
5、SYN:请求建立连接。携带 SYN 标识的称为同步报文段。
6、FIN:通知对端,本端要关闭了。携带 FIN 标识的称为结束报文段。
1.1 确认应答
TCP 将每个字节的数据都进行了编号。确认应答中,通过应答报文 (ACK报文) 来反馈给发送方,我已经收到哪些数据,下一次你该从哪个位置开始发送。应答报文中的确认序号,是按照发送数据的最后一个字节编号再加 1 来设定的。

注: TCP 的确认应答是确保 TCP 可靠性的最核心机制。
1.2 超时重传
超时重传是确认应答的补充。当发送端发送完数据,然后在一定时间内未收到 ACK 报文,此时发送端就判定出现了 "丢包",就会重新发送数据。但是 "丢包" 可能是数据丢了,也可能是 ACK 报文丢了。
【数据丢包】
数据在发送给接收端的过程中丢失,此时超时重传就能解决问题。

【ACK丢包】
若是 ACK 报文丢失,可能导致发送两次同样的数据,而为了防止接收两次同样数据的情况出现,TCP socket 在内核中就引入了接收缓冲区,发送端发来的数据会先放入接收缓冲区中,然后接收端读取缓冲区即可获得数据。在读取缓冲区的之前,接收端会依据数据的编号先进行判断,若是发现 "重复数据",直接丢弃。

注: 接收缓冲区可以去重,也可以排序。而接收端读取数据时,是按照数据编号连续读取的。
1.3 连接管理
【建立连接】
TCP 协议中的建立连接,又称为 "三次握手",目的是让通信双方都能保存对方的相关信息,也是在验证通信双方的发送、接收能力是否正常。"三次握手" 的本质就是通信双方分别给对方发送一个 SYN,并分别响应一个 ACK。
中间两次数据传输都是内核收到 SYN 后立即触发,与应用程序代码无关,触发时机完全一致,故一定可以合并传输。

【断开连接】
断开连接的目的是把对端的信息从数据结构中给释放掉。而建立连接后,在通信双方都同意断开连接的情况下,称为 "四次挥手";若是单方面同意,则会有其他方式释放该连接,此时 "四次挥手" 并不适用。"四次挥手" 的本质就是通信双方分别给对方发送一个 FIN,并分别响应一个 ACK。
由于 ACK 的发送是由内核处理,而 FIN 是由应用程序代码触发,触发时间间隔可能比较长,故中间两次数据传输不一定可以合并传输。

【三次握手和四次挥手】
相同点:
1、通信双方分别给对方发送一个 SYN/FIN,并分别响应一个 ACK。
2、数据传输的顺序:SYN(FIN) / ACK / SYN(FIN) / ACK。
不同点:
1、三次握手的中间两次数据传输一定可以合并;四次挥手则不一定。
2、三次握手必须是客户端主动;四次挥手则是服务器与客户端都可以主动。
1.4 TCP状态
1、LISTEN:表示服务器已经创建好 severSocket,并绑定好端口号。
2、ESTABLISHED:表示服务器和客户端的连接已经建立。
3、TIME_WAIT:表示本端给对端发送 FIN 后,对端也给本端发送 FIN,此时本端进入 TIME_WAIT。
在四次挥手中,进入 TIME_WAIT 状态为了给最后一个 ACK 的重传留有一定的时间。若不进入 TIME_WAIT 状态,直接将 TCP 连接释放掉,就意味着重传的 FIN 无法被返回 ACK。此时一端没有收到 ACK 就会视为丢包,就会重传 FIN。
4、CLOSE_WAIT:表示本端收到对端发送的 FIN,此时需要调用 close 来主动发起 FIN。
1.5 滑动窗口
在确认应答的机制下,每次发送方接收到 ACK 后才会发送下一个数据,这样就导致大量的时间都消耗在等待 ACK 上。此时就引入了滑动窗口,既然一发一收的性能较低,就一次发送多条数据,然后统一等一波 ACK。此时收到一个 ACK 就会发送一次数据。
【案例】
第一次批量传输 1~1000 和 1001~2000,然后收到 ACK1001,再发送 2001~3000,以此类推。

【ACK丢包】
若 ACK1001 丢包,但数据 1~1001 未丢,此时也会收到 ACK2001,这意味着 2001 之前的数据(1~2000)都收到了,故 ACK 丢包对于可靠性没有任何影响,无需进行任何处理。
【数据丢包】
若数据 1~1000 丢包,此时发送端就会重复收到 ACK1001,发送端连续收到三次 ACK1001后,就会将数据 1~1000 重新发送,而发送端收到 ACK1001 后,下一次就可能收到 ACK3001,这是因为数据 1001~3000 在之前接收端就已经放入内核的接收缓冲区中。这种重传做到了 "针对性",整体的效率没有额外损失,这种机制被称为"快重传"。
【确认应答与滑动窗口】
1、短时间内传输大量数据:此时需要通过滑动窗口,按照快重传来保证可靠性,此时判定丢包的标准就是有连续多个相同的 ACK。
2、无需传输大量数据:此时按照普通确认应答,按照超时重传来保证可靠性,此时判定丢包的标准就是达到超时时间还没接收到 ACK。
所以说,确认应答、超时重传和滑动窗口、快重传,并不冲突,是同时存在的。
1.6 流量控制
接收端处理数据的速度是有限的,如果发送端发的太快,会导致接收缓冲区被打满,此时若发送端继续发送,就会发生丢包。故 TCP 可以根据接收端的处理数据能力,来决定发送端的发送速度,这个机制就叫流量控制。
- 接收端将可以接受的缓冲区大小放入 TCP 首部的 "窗口大小" 字段,通过 ACK 通知发送端。
- 若接收缓冲区满了,窗口就会置 0,此时发送端不再发送数据,但需要定期发送一个窗口探测,让接收端把窗口大小告诉发送端。

注:TCP 首部的选项中,还有一个参数,窗口扩展因子,实际上真正要设置的窗口大小 = 16位窗口大小 * 2^窗口扩展因子。
1.7 拥塞控制
在不清楚网络状态的情况下,贸然发送大量数据,很可能引起堵塞。故 TCP 引入慢启动机制,先发少量的数据探路,摸清当前网络状态,再决定传输速率。每次发送数据报时,将拥塞窗口和接收端反馈的窗口大小作比较,较小值作为实际发送的窗口。
【拥塞窗口大小】
1、发送开始时,定义拥塞窗口为 1。
2、若并未出现丢包,此时按照指数增长 (*2)。
3、当达到阈值,指数增长就变为线性增长。
4、当增长至引起丢包,就将拥塞窗口重置为较小的值,回到最初的慢启动过程 (重新指数增长),并根据丢包的窗口大小,重新设置阈值。
1.8 延迟应答
接收端接收到数据后,不会立即返回 ACK,让接收端应用程序处理一些数据后再返回 ACK,这样就可以让返回的窗口尽可能的大。
【应答时间】
数量限制:每隔 N 个数据报就应答一次。
时间限制:超过最大延迟时间就应答一次。
1.9 捎带应答
基于延迟应答,接收端收到数据后不会立即返回 ACK,此时就可以把接下来要传输的业务数据和上次的 ACK 合并为一个 TCP 数据报,从而提高传输效率。
1.10 粘包问题
"包" 即 TCP 载荷中的应用数据包,当数据接收到缓冲区中,接收端要读取缓冲区,此时看到的只是一串连续的字节数据,并不清楚从哪到哪是一个完整的应用数据包。为了避免粘包问题,就需要明确两个包之间的边界。
1、对于定长的包:保证每次按照固定大小读取即可。
2、对于变长的包:
① 通过特殊符号,作为分隔符。(任意字符,确保该字符不存在于正式数据中)
② 在包开始的位置,约定好整个数据包的长度。
1.11 异常情况
1、进程终止:进程无论是正常结束,或是异常崩溃,都会释放文件描述符,由于 TCP 连接的生命周期比进程更长一些,故尽管进程退出,仍然可以进行四次挥手。
2、机器关机:机器关机就会触发四次挥手,但不一定可以挥完,挥的快,双方都能正确的删除保存的连接信息;挥的慢,至少也能把第一个 FIN 发送给对端,此时对方返回 ACK 并发送 FIN,但 FIN 不会收到 ACK,进行多次重传后未收到 ACK,就会单方面删除连接。
3、机器断电 / 网线断开:突然机器断电或网络断开会导致来不及发送 FIN,此时会有两种情况:
(1) 若断电的是接收端,发送端发现未收到 ACK,进行重传,重传还是没用就会尝试发送 RST(复位报文),若通过 RST 成功复位,则继续通信;若还是不行,则单方面删除连接。
(2) 若断电的是发送端,接收端迟迟没有等到数据,这时就会触发 "心跳包" 来检测对方是否存活,若对方没有心跳,则尝试发送 RST,还是不行,则单方面删除连接。
二、TCP/UDP对比
TCP:有连接、可靠传输、面向字节流、全双工。
UDP:无连接、不可靠传输、面向数据报、全双工。
- TCP 用于需要可靠传输的情况,如文件传输。
- UDP 用于效率要求很高,可靠性要求不高的情况。
注:全双工指可以同时进行信号的双向传输。
总结
1、TCP 的确认应答是确保 TCP 可靠性的最核心机制。
2、接收缓冲区可以去重、排序。接收端读取数据是按照数据编号连续读取的。
3、连接的目的是让通信双方都能保存对方的相关信息。
4、主动断开连接进入 TIME_WAIT,被动断开连接进入 CLOSE_WAIT。
5、滑动窗口可以进行批量传输。
6、流量控制是根据接收端的处理数据能力,来决定发送端的发送速度。
7、每次发送数据报时,将拥塞窗口和接收端反馈的窗口大小作比较,较小值作为实际发送的窗口。
8、延迟应答让窗口尽可能的大,捎带应答基于延迟应答来合并数据。
9、避免粘包问题的核心是明确两个包之间的边界。
10、UDP 相比于 TCP 最大的优势就是传输效率高。
相关文章:
TCP/IP_TCP协议
目录 一、TCP协议 1.1 确认应答 1.2 超时重传 1.3 连接管理 1.4 TCP状态 1.5 滑动窗口 1.6 流量控制 1.7 拥塞控制 1.8 延迟应答 1.9 捎带应答 1.10 粘包问题 1.11 异常情况 二、TCP/UDP对比 总结 一、TCP协议 TCP 协议和 UDP 协议是处于传输层的协议。 【TCP协…...
鸿蒙应用框架开发【简单时钟】 UI框架
简单时钟 介绍 本示例通过使用ohos.display接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间,使用Canvas绘制时钟,指针旋转角度通过计算得出。 例如:"2 * Math.PI / …...
MySQL是如何实现数据排序的
MySQL是如何实现数据排序的 MySQL实现数据排序主要依赖于其内部的排序和索引机制。当执行包含ORDER BY子句的SQL查询时,MySQL会采用以下一种或多种策略来对数据进行排序 索引排序 如果ORDER BY子句中的列是表的一个索引(或索引的一部分)&a…...
【测试架构师修炼之道】读书笔记
六大质量属性 效率性能 测试类型:六种-XX属性转化为XX测试 产品测试车轮图 一个软件测试者要从哪些方面(测试类型)用哪些方法(测试方法)去测试产品(质量属性)的关系图 全面性与深度 稳定性测试:多并复异 性能测试: 系统能够正确处理新业…...
C++ Functor仿函数
Functor 对象模拟函数 把类对象,像函数名一样使用。 仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现 一个 operator(),这个类就有了类似函数的行为,就是一个仿函数类了。 operator() 语法格式 clas…...
【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)
重要信息 会议官网:www.icbase.org(查看详情) 中文主页:【往届会后3个月检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)_艾思科蓝_学术一站式服务平台 会议时间:2024年9月2…...
微信小程序多端框架实现app内自动升级
多端框架生成的app,如果实现app内自动升级? 一、Android 实现app自动升级,华为应用市场 1、获取 应用市场地址 下载地址 2、在微信开放平台进行配置 应用下载地址:应用市场点击分享,里面有一个复制连接功能 应用市…...
C# Log4Net应用
1 需求分析 日志记录是程序开发中必不可少的环节,对于bug调试和后期项目维护都十分重要.其中Log4net是C#环境下广泛使用的日志记录库,功能十分强大.本教程提供的日志记录需求如下 1,日志文件统一保存到项目启动目录下的logs文件夹 2,以天为单位进行日志…...
pytest8.x版本 中文使用文档-------32.示例:使用自定义目录收集器
默认情况下,pytest 使用pytest.Package来收集包含 __init__.py 文件的目录,使用 pytest.Dir来收集其他目录。如果你想要自定义目录的收集方式,你可以编写自己的pytest.Directory 收集器,并使用 pytest_collect_directory钩子来连接…...
c语言第七天笔记
作业题: 设计TVM(地铁自动售票机)机软件。 输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元。 输入钱数,计算找零(找零时优先找回面额大的钞票)࿰…...
软件测试经理工作日常随记【8】-UI自动化_加密接口的传输
软件测试经理工作日常随记【8】-UI自动化_加密接口的传输 工具类 #utils_api.py class RequestUtils:classmethoddef send_request_splicing(cls, dicts, url): # 对应请求的入参及请求的函数Logger.logger_in().info(-----------------{}接口开始执行-----------------.for…...
基于FPGA的出租车计费系统设计---第一版--郝旭帅电子设计团队
欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的出租车计费系统设计—第一版 功能说明: 收费标准(里程):起步价5元,包括三公里;三公里之后,每公里2元&#x…...
商汤联合建工社共同打造“住建领域法规标准知识大模型”
近日,商汤科技与中国建筑出版传媒有限公司(下称“建工社”)共同发布“住建领域法规标准知识大模型”,共同探索新型知识服务模式。大模型聚焦建筑行业,以商汤“日日新SenseNova 5.5”大模型体系为基础,结合海…...
基于STM32的智能交通监控系统教程
目录 引言环境准备智能交通监控系统基础代码实现:实现智能交通监控系统 车辆检测模块交通流量分析模块通信与网络系统实现用户界面与数据可视化应用场景:交通管理与优化常见问题与解决方案收尾与总结 引言 随着城市化进程的加快,交通拥堵问…...
Git和TortoiseGit的安装与使用
文章目录 前言一、Git安装步骤查看版本信息 二、TortoiseGit安装中文语言包TortoiseGit 配置不同语言 Git基本原理介绍及常用指令 GitLab添加TortoiseGIT生成SSH Key 前言 Git 提供了一种有效的方式来管理项目的版本,协作开发,以及跟踪和应用文件的变化…...
改进YOLOv5:加入非对称卷积块ACNet,加强CNN 的内核骨架,包含VOC对比实验
🔥🔥🔥 提升多尺度、不规则目标检测,创新提升 🔥🔥🔥 🔥🔥🔥 捕捉图像特征和处理复杂图像特征 🔥🔥🔥 👉👉👉: 本专栏包含大量的新设计的创新想法,包含详细的代码和说明,具备有效的创新组合,可以有效应用到改进创新当中 👉👉👉: �…...
论文解读(12)-Transfer Learning
这个也是看论文的时候看到的,但是对这方面不是理解,需要对这方面知识点进行一个补充。 参考: 迁移学习概述(Transfer Learning)-CSDN博客 1. 什么是Transfer Learning? Transfer Learning就是迁移学习&…...
力扣高频SQL 50题(基础版)第三十八题
文章目录 力扣高频SQL 50题(基础版)第三十八题1484.按日期分组销售产品题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题(基础版)第三十八题 1484.按日期分组销售产品 题目说明 表 Activities: ---…...
大模型下的视频理解video understanding
数据集 Learning Video Context as Interleaved Multimodal Sequences Motivation: 针对Narrative videos, like movie clips, TV series, etc.:因为比较复杂 most top-performing video perception models 都是研究那种原子动作or人or物 understandin…...
【网络安全】CR/LF注入+Race Condition绕过MFA
未经许可,不得转载。 文章目录 漏洞1:CR/LF注入前言正文漏洞2:Race Condition绕过MFA前言正文漏洞1:CR/LF注入 前言 ExaHub(此处为虚拟名称)是一个专为 Exa 编程语言的爱好者和专业人士量身定制的平台。Exa 语言以其出色的速度和性能而闻名,广泛应用于科学计算、机器学…...
阿里AI产品经理实习深度解析:从业务痛点到评估体系,手把手拆解求职攻略!
本文详细拆解了阿里AI产品经理实习岗位的核心职责与面试要点,强调理解业务场景、设计AI应用流程、运用Prompt技术、评估产品效果等关键能力。文章指出,该岗位不仅需要掌握AI基础概念,更要具备业务洞察力、问题拆解能力及数据驱动优化能力&…...
QQ音乐加密文件解密终极指南:qmcdump实战深度解析
QQ音乐加密文件解密终极指南:qmcdump实战深度解析 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否遇到…...
Cap框架解析:模块化开发者工具箱的设计哲学与核心实践
1. 项目概述:一个面向开发者的现代化软件工具箱最近在GitHub上看到一个挺有意思的项目,叫“CapSoftware/Cap”。乍一看这个名字,可能会联想到“Cap”这个英文单词的多种含义——帽子、上限、或者电容的单位。但在软件开发的语境里,…...
SRWE终极指南:5分钟学会游戏窗口分辨率自定义技巧
SRWE终极指南:5分钟学会游戏窗口分辨率自定义技巧 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 想要在游戏中获得超高清截图,却受限于系统预设的分辨率?想要在窗口模式下享…...
谷歌seo付费外链是什么? 深度拆解5种主流的外链买卖方式
在目前的搜索环境下,想要让网站在没有外部引荐的情况下出现在搜索结果前排,难度不亚于在一座无人的深山里开店却希望客流量爆满。链接建设,或者说大家心照不宣的“外链买卖”,已经变成了提升排名的必经之路。一、 揭开付费外链的真…...
FPGA单粒子翻转(SEU)原理、影响与防护策略全解析
1. 是什么在“骚扰”我的FPGA?——深入解析单粒子翻转作为一名在电子设计领域摸爬滚打了十几年的工程师,我经手过不少高可靠性的项目,从地面通信基站到近地轨道的载荷设备都有涉及。在这些项目中,有一个幽灵般的问题总是如影随形&…...
终极指南:10分钟快速上手Ghidra逆向工程工具安装与配置
终极指南:10分钟快速上手Ghidra逆向工程工具安装与配置 【免费下载链接】ghidra_installer Helper scripts to set up OpenJDK 11 and scale Ghidra for 4K on Ubuntu 18.04 / 18.10 项目地址: https://gitcode.com/gh_mirrors/gh/ghidra_installer 还在为复…...
2026年AI大模型接口加速站亲测:六家平台横评,诗云API(ShiyunApi)成最优之选
在进行AI开发时,一个现实问题摆在眼前:如何接入模型厂商的官方API?对于海外开发者而言,注册、绑卡、调用这三步便能轻松解决。然而,国内开发者却面临着诸多难题,如跨境网络波动、外币支付门槛、发票合规需求…...
深入Windows内核的“心脏”:通过WRK源码理解ntoskrnl.exe与HAL的协作机制
深入Windows内核的“心脏”:通过WRK源码理解ntoskrnl.exe与HAL的协作机制 在计算机科学领域,操作系统内核堪称最复杂的软件工程之一。作为Windows操作系统的核心,ntoskrnl.exe与硬件抽象层(HAL)的协作机制长期以来都是开发者们津津乐道的话题…...
UniversalUnityDemosaics:Unity游戏马赛克去除全攻略
UniversalUnityDemosaics:Unity游戏马赛克去除全攻略 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDemosaics …...
