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

【计算机网络八股】【欧弟求职】TCP相关

TCP

必须能讲清:

  • 三次握手 / 四次挥手(状态流转)
  • 拥塞控制:
    • slow start
    • congestion avoidance
    • fast retransmit / fast recovery
  • 滑动窗口
  • 重传机制(RTO / dup ack)
  • TIME_WAIT 为什么存在
  • 高并发下 TIME_WAIT 堆积怎么处理

👉 面试常问:

  • “你如果自己实现 TCP,状态机怎么设计?”
  • “丢包怎么处理?”

三次握手/四次挥手

三次握手

tcp是全双工的,两端都会发送和接收数据

三次握手的本质是:双方建立连接前,确认彼此“收发能力 + 初始序列号(ISN)”都正常

ServerClientServerClientSYN (seq = x)SYN + ACK (seq = y, ack = x+1)ACK (ack = y+1)

SYN 会占用一个序号

四次挥手

ServerClientServerClientFIN (seq = u)ACK (ack = u + 1)FIN (seq = v)ACK (ack = v + 1)
为什么是“四次”?

👉 因为 TCP 是全双工

  • Client 关闭发送 → FIN
  • Server 可能还有数据要发 → 先 ACK
  • Server 再关闭 → FIN
为什么 ACK 和 FIN 不能合并?

👉 因为:

  • ACK 表示“我收到了你的关闭请求”
  • FIN 表示“我也要关闭”

👉 两个语义独立(除非刚好一起发生)

TCP 状态机

1️⃣ 为什么会有 CLOSE_WAIT?

👉 因为:

  • 对方说“我不发了”(FIN)
  • 但你可能还没发完数据

所以:

先 ACK → 进入 CLOSE_WAIT 等你处理完 → 再发 FIN

2️⃣ 为什么 TIME_WAIT 只在主动关闭方?

👉 因为:

  • 最后一个 ACK 是你发的
  • 必须保证对方收到

3️⃣ TIME_WAIT = 2MSL 的意义

👉 两个目的:

  1. 防止对方没收到 ACK → 重传 FIN
  2. 让旧连接报文在网络中消失

tcp 拥塞控制

TCP 拥塞控制的目标是:避免网络过载(congestion),在不引发拥塞的前提下尽可能提高吞吐量

👉 核心变量:

cwnd(拥塞窗口)

发送窗口:

send_window = min(cwnd, rwnd)
  • cwnd:网络能力(拥塞控制)
  • rwnd:接收方能力(流量控制)

TCP 拥塞控制 = 四个机制:

  1. 慢启动(Slow Start)
  2. 拥塞避免(Congestion Avoidance)
  3. 快重传(Fast Retransmit)
  4. 快恢复(Fast Recovery)

慢启动

👉 不是“慢”,而是指数增长

规则:

cwnd = 2n

  • 每收到一个 ACK → cwnd +1 MSS
  • 一个 RTT → cwnd 翻倍

示例:
1 → 2 → 4 → 8 → 16 ...

什么时候结束?

👉 达到:

ssthresh(慢启动阈值)

拥塞避免(Congestion Avoidance)

👉 从“指数增长”变为“线性增长”

规则:

cwnd=cwnd+1cwnd cwnd = cwnd + \frac{1}{cwnd}cwnd=cwnd+cwnd1

👉 本质:

  • 每个 RTT 增加 1 MSS

示例:
16 → 17 → 18 → 19 ...

发生丢包(关键分叉)

TCP 通过“丢包”判断网络拥塞


情况1:超时(RTO)

👉 最严重拥塞

处理:

ssthresh = cwnd / 2 cwnd = 1 → 重新慢启动

情况2:收到 3 个重复 ACK

👉 轻度拥塞

触发:

  • Fast Retransmit
  • Fast Recovery

快重传(Fast Retransmit)

👉 不等超时,直接重传

条件:

3 duplicate ACK

说明:

👉 后续包到了,但某个包丢了


快恢复(Fast Recovery)

👉 不回到 1,而是“半降”

规则:

ssthresh = cwnd / 2 cwnd = ssthresh

👉 然后进入:

拥塞避免

CUBIC 算法

https://datatracker.ietf.org/doc/html/rfc8312

CUBIC 拥塞窗口增长公式
cwnd(t)=C⋅(t−K)3+Wmax \text{cwnd}(t) = C \cdot (t - K)^3 + W_{\text{max}}cwnd(t)=C(tK)3+Wmax

符号含义
cwnd(t)拥塞窗口(MSS 为单位),随时间变化
t自上次丢包后的时间(秒或 RTT 单位)
C缩放常数,用于控制增长速度
K时间偏移量,使得窗口曲线在Wmax时“达到顶点”
Wmax上一次丢包发生时 cwnd 的最大值

http://www.jsqmd.com/news/608763/

相关文章:

  • 一台服务器跑4个独立站,我是怎么做到的?
  • 魔兽争霸III终极优化指南:免费解决老游戏在现代电脑的兼容性问题
  • RFID智能柜-RFID智能柜公司推荐 - 聚澜智能
  • 如何用 every 判断数组是否所有元素都满足特定条件
  • Spring AI 1.x 系列【25】结构化输出案例演示
  • XOutput完整指南:如何将旧游戏手柄转换为Xbox控制器
  • GeoAI赋能智慧城市:从交通优化到环境监测的实战解析
  • 别再只用‘auto’模式了!深入Halcon条码识别参数:手把手教你调优barcode_width_min与扫描线提升识别率
  • ZYNQ FPGA固化文件生成与烧录全流程详解
  • Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接康
  • 基于改进A*算法与DWA融合策略的机器人路径规划仿真研究:全局规划与局部避障的综合性能分析
  • c++如何利用C++23的std--expected重构文件操作的错误检查代码【实战】
  • Node Modules Inspector:可视化你的Node.js依赖关系,5分钟快速上手指南
  • 电容滤波实战:如何为你的MCU电源选择100nf和1uf电容组合?
  • 企业级 Agent 治理平台:公司用数字帮手的必备管家
  • 三步解锁网易云加密音乐:ncmdump让NCM文件全设备自由播放
  • FanControl:三招告别电脑噪音,打造你的专属静音散热系统
  • uni-app动态修改tabbar uni-app如何根据权限显示不同的tab
  • 写段代码教会你什么是HOOK技术?HOOK技术能干什么?刎
  • 一文学习 Spring 声明式事务源码全流程总结勇
  • Android息屏后台任务保活实战:从定时器失效到厂商白名单破解
  • Build-A-Large-Language-Model-CN:大语言模型训练中的常见问题与解决方案
  • MVN--07
  • 金融系统的测试特殊性:安全、合规与性能
  • CyberpunkSaveEditor:革新性存档自定义工具完全指南 - 全方位掌控游戏体验
  • 自学渗透测试第12天(渗透测试流程与DVWA部署)
  • 5个实际场景,用Pix2Text高效解决图像转文本难题
  • IOFILE结构体的介绍与House of orange敦
  • FPGA千兆网卡设计复盘:SGMII接口调试中的三个‘坑’与解决方案
  • Windows电脑突然变卡?手把手教你排查Artemis僵尸网络(附注册表修复脚本)