⚠️ 自己写:去掉 TIME-WAIT
本节的内存版 TCP 状态机(判题机不联网;真机上 ss -tan 看到的 State 就是这些名字):
TABLE[(状态, 事件)] = (新状态, 要发出去的段) 事件:listen / connect / close / timeout / retrans 是本机动作,SYN / SYN-ACK / ACK / FIN / RST 是收到的段
talk(script, drop=()) script 形如 ["B:listen", "A:connect", "A:close", "B:close"];一台主机发出的段立刻送到对面(序号在 drop 里的丢掉,轨迹里标 x),对面的回信再送回来
交回 (轨迹 ["A>B SYN", "B>A SYN-ACK", ...], {"A": 状态, "B": 状态})最后那个 ACK(轨迹第 7 段)丢了,B 在 LAST-ACK 里会重发 FIN(事件 B:retrans)。补全 last_ack_lost(keep):keep 为 True 时 A 老老实实等在 TIME-WAIT;为 False 时 A 收到最后的 FIN 后立刻 A:timeout 进 CLOSED、再让 B 重发。交回「最后一段的名字,A 的状态」。两种各跑一遍:
全部评论