【网络】TCP常考知识点详解

embedded/2025/3/14 22:20:38/

TCP报文结构

   

TCP报文由**首部(Header)数据(Data)**两部分组成。首部包括固定部分(20字节)和可选选项(最多40字节),总长度最大为60字节。

1. 首部固定部分
  1. 源端口(16位)目的端口(16位)

    • 标识发送和接收的应用程序(如HTTP默认端口80)。

  2. 序列号(32位)

    • 表示当前报文段数据部分的第一个字节的序号,确保数据按序传输。

  3. 确认号(32位)

    • 期望收到的下一个字节的序号,表示接收方已正确接收之前的所有数据。

  4. 数据偏移(4位)

    • 指示首部长度(以4字节为单位)。例如,值为5表示首部长度20字节。

  5. 保留字段(6位)

    • 未使用,必须置0。

  6. 控制位(6位)

    • URG:紧急指针有效,优先处理紧急数据。

    • ACK:确认号有效(连接建立后通常为1)。

    • PSH:接收方应立即将数据推送给应用层。

    • RST:强制重置异常连接。

    • SYN:建立连接时同步序列号。

    • FIN:正常关闭连接。

  7. 窗口大小(16位)

    • 接收方的可用缓冲区大小,用于流量控制(滑动窗口机制)。

  8. 校验和(16位)

    • 计算包括伪首部(源/目的IP、协议类型、TCP长度)、TCP首部和数据,确保数据完整性。

  9. 紧急指针(16位)

    • 当URG=1时有效,指向紧急数据的结束位置。

2. 选项部分(可变长度,最多40字节)
  • MSS(最大报文段长度):在三次握手时协商,避免IP分片。

  • 窗口扩大因子:扩展窗口大小(原16位窗口最大为65535)。

  • 时间戳:计算往返时间(RTT)和防止序列号回绕(PAWS机制)。

  • SACK(选择性确认):允许接收方报告非连续接收的数据块,提升重传效率。

3. 填充字段
  • 确保首部长度是4字节的倍数。

4. 数据部分
  • 上层协议(如HTTP、FTP)传递的数据,长度由MSS和窗口大小共同决定。

TCP的特点

  1. 面向连接:TCP发送数据前需要通过三次握手建立全双工通信,结束数据发送后通过四次挥手关闭连接
  2. 可靠性:TCP通过确认和重传、快速重传、拥塞控制、流量控制、有序性、超时重传等机制确保数据可靠传输
    1. 确认和重传:接收方收到数据后会发送确认ACK给发送方,若发送方经过超时时间未收到ACK,则会重传
    2. 流量控制:接收方会通过滑动窗口(循环数组,用三个指针给他分区)的机制告诉发送方可接收数据的大小,避免发送方发送大量数据拥塞在接收方的缓冲区
    3. 拥塞控制:发送方根据网络的拥塞情况动态调整发送速率,避免造成网络拥塞
    4. 有序性:接收方根据TCP头部的序列号重新对数据进行排序
  3. 头部开销大:TCP报文头部(源/目的端口+**序列号/确认号**+首部长度+**标志位(SYN/ACK/FIN/RST)**+**窗口大小(RWND)**+校验和),增加传输开销
    • 源/目的端口 标识了应用进程;序列号和确认号可以进行确认和重传,同时保证数据有序;
    • 标志位(指示TCP会话期间的特定状态):**SYN-同步,ACK-确认数据包接收,FIN-结束**,RST-重置TCP连接,URG-紧急数据,PSH-立即推送数据,
  4. 全双工通信:TCP协议允许通信双方同时进行数据的发送和接收

TCP超时重传

  • RTT(Round-Trip Time)往返时延:数据包在网络中的往返时延(网络波动造成RTT**动态变化**)
  •  RTO(Retransmission Timeout)超时重传时间:RTO应略大于RTT。太大会降低网络的传输效率;小于RTT则会造成不必要的超时重传,增大网络负荷
  • 发送方在RTO内未收到ACK,说明网络严重拥塞,发送方重置CWND(拥塞窗口)进行**慢启动**,逐步增加发送量,降低网络过载风险
  • 拥塞窗口CWND :发送方维护的变量,初始值默认为1 MSS(1460 Byte)
  • 慢启动阈值_ssthresh:窗口增长模式的切换点;初始值较高(如接收方通告窗口大小)发生拥塞时动态调整
  • 慢启动算法流程
    1. 初始化阶段:TCP连接建立后/超时重传后,set CWND= 1 MSS,ssthresh初始为较大值
    2. 指数增长阶段:每收到一个和ack,cwnd增加1MSS(每个RTT内,CWND翻倍):
      1. 假设RTT固定100ms,初始CWND= 1 MSS
      2. 第0ms,发送一个报文 cwnd =1
      3. 第100ms:收到ack,cwnd=2(第100-200ms 发送2个报文)
      4. 第200ms:收到2个ack,每个ack触发cwnd+1, cwnd=4(第200-300ms 发送四个报文)
      5. 第300ms:收到4个ack,cwnd=8;
    3. 切换至**拥塞避免**:<u>*cwnd >= ssthresh*</u> 时,结束慢启动进入**线性增长**的拥塞避免阶段(每RTT,CWND增长1 MSS)
    4. 拥塞处理**:
      1. 超时丢包:严重拥塞,重置ssthresh=MAX(CWND/2,2 MSS),CWND = 1 MSS,重新***慢启动***
      2. 快速重传/恢复:(重复ACK触发)调整ssthresh= CWND/2 ,CWND=ssthresh+3(3个重复的ACK),直接进入***拥塞避免***

TCP快速重传

        发送方连续收到**三个重复ACK**(RFC经验)时,说明网络单包丢失,发送方CWND减半,进行快速重传

TCP拥塞控制与流量控制


http://www.ppmy.cn/embedded/172131.html

相关文章

Unknown collation: ‘utf8mb4_0900_ai_ci‘

原因&#xff1a;数据库版本低 Unknown collation: utf8mb4_0900_ai_ci 错误表示MySQL 数据库不支持 utf8mb4_0900_ai_ci 排序规则&#xff08;collation&#xff09;。这个排序规则是 MySQL 8.0 引入的&#xff0c;如果MySQL 版本低于 8.0就会报这个错误。 解决&#xff1a;不…

C#运算符详解

一、运算符分类与功能‌ 1‌.算术运算符‌ 基本运算‌&#xff1a;&#xff08;加&#xff09;、-&#xff08;减&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;取模&#xff09; int a 10 / 3; // 结果为3&#xff08;整数除…

C# 初学者的系统学习路径与职业规划指南

C#基础知识与核心技能 C# 初学者的系统学习路径与职业规划指南一、基础知识与核心技能二、进阶技能与设计模式三、.NET Core 程序员的职业规划引用来源1. **Stack Overflow**2. **GitHub**3. **Reddit 社区**4. **Discord 社区**5. **Microsoft Learn**6. **YouTube 频道**7. *…

计算机考研C语言

C语言程序设计从入门到精通【2025完整版】考研复试 嵌入式 计算机二级 软考 专升本也适用_哔哩哔哩_bilibili 1、第一个C程序 helloC #include <stdio.h>int main(){printf("hehe");return 0;}每个C语言程序不管有多少行代码&#xff0c;都是从main函数开始执…

pytorch常用参数初始化

一、基础初始化方法 1. 全零初始化&#xff08;Zero Initialization&#xff09; • 方法&#xff1a;权重初始化为0&#xff08;不推荐用于隐藏层&#xff09; • 问题&#xff1a;导致所有神经元对称更新&#xff0c;失去多样性 • PyTorch代码&#xff1a; python nn.init…

ThinkPHP框架中各模块通过MVC架构和扩展机制协同工作形成完整的请求处理流程

在ThinkPHP框架中&#xff0c;各模块通过MVC架构和扩展机制协同工作&#xff0c;形成完整的请求处理流程。以下是核心模块的功能及协作关系分析&#xff1a; 一、路由&#xff08;Route&#xff09; 作用&#xff1a; 负责将HTTP请求的URL映射到具体的控制器和方法&#xff0c…

SpringBoot 统一异常处理

首先定义一个统一管理所有异常的类&#xff0c;加上注解RestControllerAdvice定义处理不同异常的方法&#xff0c;加上注解 ExceptionHandler RestControllerAdvice public class GlobalExceptionHandler {private static final Logger log LoggerFactory.getLogger(GlobalExc…

【python|二分|leetcode441】一题搞清楚二分区间问题---闭区间、左闭右开、左开右闭、全开区间

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 一题搞清楚二分区间问题—闭区间、左闭右开、左开右闭、全开区间 0.1 题目&#xff1a;Problem: 441. 排列硬币 你总共有 n 枚硬币&#x…