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

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

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拥塞控制与流量控制

相关文章:

  • IDEA Commit 模态提交界面关闭VS开启对比
  • 2025最新比较使用的ai工具都有哪些,分别主要用于哪些方面?
  • 静态时序分析STA——2. 数字单元库-(2)
  • 海思Hi3516DV00移植yolov5-7.0的模型转化流程说明
  • 蓝桥杯备赛:一道数学题(练思维(同余的应用))
  • 大白话react第十四章高阶 React 组件开发和React 状态管理进阶等
  • 【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】
  • VS2022中使用EntityFrameworkCore连接MySql数据库方法
  • HeapDumpBeforeFullGC和HeapDumpOnOutOfMemoryError区别
  • Win10 访问 Ubuntu 18 硬盘
  • 数列分块入门2
  • Linux系统下安装配置 Nginx 超详细图文教程_linux安装nginx
  • 笔记:代码随想录算法训练营day38: LeetCode322. 零钱兑换、279.完全平方数、139.单词拆分;多重背包
  • 接口技术##汇编语言
  • QSplitter保存和读取
  • [数据结构]栈和队列
  • C++20 DR11:数组 `new` 可以推导出数组大小
  • VS Code连接服务器教程
  • C/C++类型转换
  • 扎实基础:测试工作的基石
  • 网站建设后台和前端/苏州百度推广公司
  • vs2013做网站教程/中国最新消息新闻
  • 桂林做网站的公司有哪些/如何在百度上添加自己的店铺
  • 高唐做网站建设的公司/湖南seo优化报价
  • 怎么做干果网站/今天重大国际新闻
  • 宣传手册设计模板/seo教程论坛