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

TCP协议

TCP --- 传输控制协议
是一种面向连接的可靠传输协议
面向连接 --- 在传输数据之前,收发双方先建立的一条逻辑上的通路。 ---> 进行参数协商
传输层 --- TCP 是在不可靠的 IP 层面之上来实现的一种可靠的数据传输协议。 ---> 有序传输、无丢失、
不重复、实现一种可靠传输行为
特点:
面向连接 --- 三次握手、四次挥手
提供可靠交付的服务。
每一条 TCP 连接都只能存在两个端点。 即点对点行为 。两端使用 套接字 (IP+ 端口 ) 来描述。
TCP 提供 全双工通信
发送缓存
准备发送的数据
已经发送,但是没有收到确认的数据
接收缓存
按序到达,但未被应用程序读取的数据
乱序到达的数据
TCP 面向字节流 传输的协议; --- 以字节为单位 TCP 把应用程序交付下来的数据仅仅看做是一连
串无结构的字节流。
TCP 报文头部
序列号 :也是在标识报文的序号; 每个报文都必须包含序列号
序列号 = 上一个分组序列号 + 上个分组中传输的数据量
能够帮助接收方进行数据排序。
确认序列号
通过确认序列号,来实现对数据的确认。
功能: 1. 代表接收方希望收到的下一个报文的序列号; 2. 代表该确认序列号之前的所有数据已
经收到
窗口大小 --- 指的是发送本报文的设备的接收窗口大小,即允许对方连续发送的数据量
紧急指针 --- 用来标记需要紧急处理的数据大小。
控制位 --- 标记位
紧急位 URG --- 代表此时的数据中,存在需要立即处理的数据,这部分数据不应该在缓存中排
队,需要立即处理,与紧急指针字段结合使用。
确认位 ACK --- 只有当 ACK=1 时,确认序列号才有意义 在连接建立之后,所有传输的报文都
必须将 ACK 置位为 1
推送位 PSH --- 接收方应该尽快处理数据,不需要等待缓存填满等要求。
复位 RST
同步位 SYN --- 连接建立请求标志
终止位 FIN --- 连接释放标志,前提,本地数据传输完毕
在逐包确认机制中,发送方每发送一个数据,都需要等待接收方的确认报文,收到确认报文后,才
可以发送下一个报文信息,导致数据传输效率较低。而接收方只有将数据从接收缓存中提取给应用程序
处理后,才会发送确认报文
TCP 可靠性
手段 --- 确认、重传、排序、流控 排序机制
TCP 具备分段操作。 IP 协议具有分片操作。 ---> 分别基于 MSS MTU 进行拆分
IP 分片和 TCP 分段是冲突的
MTU --- 代表数据帧中的数据信息 --- 最大传输单元(网络层 + 传输层 + 应用层)
MTU 是每一个接口所要维护的一个参数信息,代表该接口所在链路传输单个数据分组的最大
1500 字节。 --- 在以太网或 PPP 链路中。
MSS --- 代表数据大小 --- 最大段长度(应用层)
MSS = MTU - 网络层头部 - 传输层头部
该参数需要在 TCP 建立握手阶段时,通过前两个 SYN 报文进行参数协商,选择最小的 MSS 作为
后续传输的报文大小。之后传输的任何 TCP 报文,都不会在携带 MSS 数值,该参数携带在选项
字段
PMTU--->Path MTU---> 路径 MTU
确认机制
是可靠性机制的核心点 TCP 协议每发送一个数据报文,都需要让对端回复一个确认报文。
逐包确认 --- 累积确认 --- SACK( 选择确认机制 )
选择确认机制 --- TCP 头部中增加一个选项字段,该字段包含了自己已经收到的数据信息。接收方
在确认报文中携带该字段,而发送方可以根据该字段判断需要重传的数据信息 --- 该功能需要协商。在
三次握手的前两次 SYN 报文中进行协商。
重传机制
发送方,什么时候会进行重传?
超时重传机制
发送者根据一个时间来判断,如果在时间超时时,没有收到对端的确认报文,则认为需要进行
重传。
RTT --- 往返时间:发送一个数据包,到收到对端反馈的确认报文的这段时间
RTO --- 超时重传时间:略大于 RTT 时间
这两个时间都是根据网络中实际报文的传输速率而动态变化的
超时间隔加倍 --- 当同一个 RTO 时间内没有收到回复,则下一个 RTO 时间加倍,但是不会无线
加倍,到达一定次数后,会舍弃重传报文。
快速重传机制 --- 当发送方连续收到三个冗余 ACK 报文时,将会触发重传机制。
TCP 流量控制机制
属于 TCP 传输效率问题。 单位时间内发送的数据量 在逐包确认机制中,只有收到对端的确认报文,才可以发送下一个报文;而确认报文只有对端接收
并处理数据后才会回复,如果没有及时处理数据,则发送方需要一直等待,导致数据传输效率过低。 --->
在接收方忙其他事情的时候,较多的传输自己的数据报文 ---> 窗口 --- 无需等待确认,可以继续发送的
数据包的最大量
窗口的大小 --- > 体现在接收缓存上。跟随接收缓存中剩余空间量的改变而变化的
窗口的大小,可以实现的是对数据传输效率高低的调整 真正用来实现流控机制的是窗口关闭机
窗口关闭 --- 窗口值是一个动态变化的数值,那么就一定存在归 0 的可能。
但是窗口关闭机制存在隐患,当服务端关闭窗口,然后打开窗口时,发送的窗口大小不为 0 的数据报
文丢失,则双方进入 死锁状态 --- 解决方法:客户端周期发送探测报文,该报文仅携带 1 字节数据。
TCP 的拥塞控制机制
拥塞 ---> 网络中对资源需求超过了资源可用量的情况被称为拥塞 。传输数据的带宽资源小于传输的
数据量本身。 ---> 拥塞的结果一定是分组丢失
流量控制是为了让接收方能够来得及接收数据;而拥塞控制是为了降低整个网络的拥堵情况
TCP 拥塞控制的核心问题:
如何判断网络此时发生了拥塞? --- 1. 发生超时重传; 2. 接收到 3 次冗余 ACK 报文
如何去控制数据的发送量? --- 拥塞控制算法 --- 目的就是计算,限制拥塞窗口 --- 慢启动,拥塞避免,
快速恢复
慢启动 --- cwnd 一开始会被设置为一个较小的数值,一般等同于一个 MSS ,即一次只能发送一
个数据报文段。每收到一个新的 ACK( 重传的不算 ) ,就会增加一个 MSS 的大小
该算法实际呈现指数性增长。
慢启动门限 --- 决定了慢启动算法使用到什么时候
cwnd < 门限,使用慢启动算法
cwnd > 门限,使用拥塞避免算法
如果等于,则两者都可以使用
拥塞避免 --- 不是直接避免拥塞,而是通过降低 cwnd 的增大速率而使得网络不容易出现拥塞
每完成一次通讯过程,则增加一个 MSS
快速恢复
TCP 发现触发超时重传时,会将门限值设定为当前 cwnd 的一半,然后将 cwnd 调整为
一个 MSS 数值
TCP 接收到 3 次冗余 ACK 时,判断发生拥塞,此时会采取快速恢复算法,将门限值设定
cwnd 的一半,然后将 cwnd 设定为当前门限值,直接通过拥塞避免算法进行增长
因为发送方需要根据拥塞情况来调整自己的发送速率,故, TCP 引入了一个新的参数,称为 拥塞窗
--cwnd --- 该参数与接收窗口 (rwnd) 一样,都可以对发送的字节数大小做限制。
发送方,发出未收到确认的字节数必须小于等于 rwnd cwnd 中的最小值
发送窗口 = min cwnd rwnd
延迟确认机制 --- 一般最大延迟时间为 0.5 秒。
捎带应答机制 --- 将确认报文和回执数据一起发送。
http://www.xdnf.cn/news/2692.html

相关文章:

  • 2个关键思路,让微课动画场景制作别具一格
  • Fps鬼泣总结:通信——伤害检测
  • 【数据结构】顺序表
  • 伺服电机AB相输出,接入定时器通道,对定时器IO口的速率有何要求【详细分析】
  • 【Unity完整游戏开发案例】从0做一个太空大战游戏
  • MySQL主从同步原理与实践 - Java架构师面试解析
  • 【Python】Matplotlib:立体永生花绘制
  • 单值映射、多值映射
  • Linux:进程间通信->共享内存
  • 开源网络入侵检测与防御系统:Snort
  • 企业私有大模型DeepSeek落地部署该用什么? Ollama还是vLLM
  • PlatformIO 入门学习笔记(一):背景了解
  • 【每天一个知识点】correntropy(相关熵)
  • 08-STM32外部中断
  • el-input限制输入只能是数字 限制input只能输入数字
  • 中国区域250米归一化植被指数数据集(2000-2023)
  • 迅雷精简绿色融合版【高速下载版】12.1.9.2870【11.2.2.1716】【20250426】
  • 树莓派学习专题<10>:使用V4L2驱动获取摄像头数据--申请和管理缓冲区
  • 【PVR】《Adaptive Palm Vein Recognition Method》
  • codeforcesB. Binary Colouring
  • 实人认证开发指南:用API+深度学习构建人证合一系统
  • 【CF】Day45——Codeforces Round 1021 (Div. 2) BC
  • UV工具的安装与使用
  • 2025系统架构师---数据抽象(Data Abstraction)‌与‌面向对象架构风格
  • Android原生开发基础
  • 龙芯远程方案
  • 如何判断对一件事的认知深度?
  • Python+jieba文本分析示例:实现统计《红楼梦》中的人物并生成词云图
  • 人工智能——XGBoost 算法
  • 【2025最新Java面试八股】如何在Spring启动过程中做缓存预热?