跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
TCP流量控制与拥塞控制
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:TCP流量控制与拥塞控制}} {{编程学习导航}} == 概述 == '''TCP流量控制(Flow Control)'''与'''拥塞控制(Congestion Control)'''是TCP协议中保证网络高效可靠传输的核心机制。 * **流量控制**:通过滑动窗口机制协调发送方与接收方的数据处理速度,避免接收方缓冲区溢出。 * **拥塞控制**:通过动态调整发送速率避免网络过载,包含慢启动、拥塞避免、快速重传等算法。 == TCP流量控制 == === 滑动窗口机制 === 接收方通过通告窗口(Advertised Window, RWND)告知发送方可接收的数据量。发送方根据RWND调整发送窗口大小。 <mermaid> sequenceDiagram participant Sender participant Receiver Sender->>Receiver: 发送数据(Seq=1, Len=100, RWND=300) Receiver-->>Sender: ACK=101, RWND=200(剩余缓冲区200字节) Sender->>Receiver: 发送数据(Seq=101, Len=200, RWND=200) </mermaid> === 零窗口问题与持续计时器 === 若接收方缓冲区满(RWND=0),发送方暂停发送并启动'''持续计时器'''(Persist Timer),定期探测窗口状态。 <syntaxhighlight lang="python"> # 模拟零窗口处理(伪代码) def handle_zero_window(): while receiver_window == 0: start_persist_timer() if timer_expired: send_window_probe() if ack_received and receiver_window > 0: resume_transmission() </syntaxhighlight> == TCP拥塞控制 == === 核心算法 === 1. **慢启动(Slow Start)**:窗口从1个MSS(最大报文段)开始,每RTT指数增长。 2. **拥塞避免(Congestion Avoidance)**:窗口超过慢启动阈值(ssthresh)后,每RTT线性增长。 3. **快速重传(Fast Retransmit)**:收到3个重复ACK时立即重传丢失报文。 4. **快速恢复(Fast Recovery)**:重传后直接进入拥塞避免阶段。 <mermaid> graph LR A[慢启动: CWND指数增长] -->|CWND ≥ ssthresh| B[拥塞避免: CWND线性增长] B -->|收到3个重复ACK| C[快速重传与恢复] C --> B B -->|超时| D[重置CWND=1, ssthresh=CWND/2] D --> A </mermaid> === 数学模型 === 拥塞窗口(CWND)在慢启动阶段增长公式: <math>CWND = CWND + 1 \text{ per ACK} \implies CWND \approx 2^{n} \text{ per RTT}</math> == 实际案例 == === 视频流传输 === 当网络拥塞时,YouTube通过TCP拥塞控制动态降低视频码率,避免卡顿。例如: 1. 初始阶段快速提升传输速率(慢启动)。 2. 检测到丢包后,触发快速重传并降低发送速率(拥塞避免)。 === 代码示例:模拟拥塞控制 === <syntaxhighlight lang="python"> # 简化版拥塞控制模拟 cwnd = 1 ssthresh = 64 in_fast_recovery = False def on_packet_loss(): global cwnd, ssthresh, in_fast_recovery ssthresh = max(cwnd // 2, 1) cwnd = 1 if not in_fast_recovery else ssthresh in_fast_recovery = False def on_ack_received(): global cwnd, ssthresh if cwnd < ssthresh: cwnd *= 2 # 慢启动 else: cwnd += 1 # 拥塞避免 </syntaxhighlight> == 常见问题 == === 流量控制与拥塞控制的区别 === {| class="wikitable" |+ 对比表 ! 特性 !! 流量控制 !! 拥塞控制 |- | 目标 || 防止接收方过载 || 防止网络过载 |- | 机制 || 滑动窗口(RWND) || 拥塞窗口(CWND) |- | 触发信号 || 接收方窗口通告 || 丢包或延迟增加 |} == 总结 == TCP通过流量控制与拥塞控制的协同工作,实现了高效可靠的数据传输。理解这些机制有助于优化网络应用开发与调试。 [[Category:计算机科学]] [[Category:面试技巧]] [[Category:计算机网络]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:编程学习导航
(
编辑
)