🔌 第二章 用电信号传输TCP/IP数据
📄 一句话概括

停等太慢——滑动窗口让发送方不等 ACK 连发 N 块;窗口大小由接收缓冲余量决定,随 ACK 右滑持续发货。

📝 本节和前面几节的关系

2.3.3/2.3.4 的对账每次都要等;本篇把【等】改成【滑】,吞吐量上一个台阶。

一、滑动的含义

窗口内 N 块可以连续发;确认一块,窗口右滑一格,新块出门。 【滑】的实质:对账照做,只是不用每块都干等。

二、窗口由谁定

接收方缓冲还装得下多少,就开多大窗口—— 这个数写进每个 ACK 的窗口字段通告发送方。 缓冲快满,窗口收窄甚至归零(暂停发送)。

三、动手 Demo:滑动窗口,不等 ACK 也发

窗口=4 块时的运转:

win = ['1','2','3','4']
for new in range(5, 8):
    print('路上:', ' '.join(win))
    ack = win.pop(0)
    win.append(str(new))
    print('  ACK', ack, '确认 -> 第', new, '块出门')

实跑输出:

--------------------------------------------------------------------
滑动窗口,不等 ACK 也发
--------------------------------------------------------------------
  停等模式太慢——发一块等一块。窗口一次放行 N 块:

    窗口 = 4 块时:
    [1][2][3][4] 在路上   (未确认,但已发出)
     1 确认 -> 窗口右滑,第 5 块出门
     2 确认 -> 滑,第 6 块出门 ...

  接收缓冲有多大,窗口就能开多大——
  【接收方还能装多少】写进 ACK 的窗口字段告诉发送方。

拥塞窗口(防塞网络)与流量窗口(防压垮收方)取小者—— 教材此处只讲流量侧,拥塞控制在 12 课有总览。

30 秒实验

  1. Wireshark 抓下载,观察 window 字段变化。
  2. 算算窗口 65535 字节、RTT 50ms 的理论吞吐。
  3. 想想收方处理慢了窗口会怎么变。

常见误区

  1. 以为窗口是网络的能力——它是接收缓冲的余量。
  2. 以为窗口固定不变——随 ACK 通告动态伸缩。
自测三问(点开对答案) 1. 滑动窗口解决什么问题? —— 不用逐块干等,提吞吐。 2. 窗口大小由谁决定? —— 接收缓冲余量(收方通告)。 3. 窗口归零意味着什么? —— 收方装不下了,暂停发送。

相关笔记