抓包调试时不少人遇到过这一幕:同一时间到同一站点的两条连接,初始的序列号起点毫无规律,前一条还是八位数,后一条就换了一套。有人以为这是代理IP出口的数据被篡改,赶紧换出口重试——其实这正是TCP的初始序列号(ISN)随机化在正常工作,和异常没有关系。
ISN 随机化是什么
TCP 建立连接时,双方要各自挑一个序列号起点,这个起点就是初始序列号 ISN。起点不能是固定值,操作系统会按算法生成,每次连接都不同,随机性越强越好。
为什么不能固定?序列号的作用是给每个字节编号,接收方靠它把乱序到达的数据拼回顺序,同时识别重复与过期数据。如果 ISN 可预测,攻击者就能猜到对方接下来的序列号,伪造一段编号看起来完全合法的注入数据。
随机化之后,伪造者需要先观察、再推算,成本大幅上升;正常通信双方只要在握手时交换一次起点,后续收发完全不受影响。一次连接一个随机起点,互不干扰。
在代理IP链路里,这一机制同样成立:客户端和出口之间、出口和站点之间,各自完成一次独立握手,也就各自产生一对随机 ISN,两段序列号彼此没有对应关系。这是设计使然,不是数据被改动的信号。
| 对比项 | 固定 ISN | 随机 ISN |
|---|---|---|
| 伪造注入难度 | 低,编号易被猜中 | 高,难以预判 |
| 会话劫持风险 | 较高 | 显著降低 |
| 历史数据重放 | 容易混入 | 编号对不上被丢弃 |
| 两段连接关系 | 可能被推断 | 完全独立 |
代理会不会改写 ISN
取决于代理IP出口的工作方式。透明转发型的出口不改写任何字段,原样转发,序列号体系从头到尾只有一套;隧道重建型的出口以自身身份与站点重新建立连接,这时会生成一套全新的随机 ISN,客户端那套序列号到不了站点。
于是抓包会看到两种现象:一套序列号贯穿始终,或者两段序列号毫不相干。两种都正常,判断数据是否被改动,看的是内容与校验,而不是序列号起点。
ISN 随机化与排障
日常排障中,序列号最常用的场景是判断丢包与重传:同一序列号重复出现,说明数据重发了;序列号跳变,说明中间有数据没到。ISN 本身的随机起点不影响这些判断,两段连接对不上也不需要担心。
真正该警惕的是相反的情况:序列号完全可预测、固定递增,这种出口反而可疑——要么设备实现老旧,要么链路里有人做了手脚。正常代理IP出口都遵守随机化约定,两段独立生成。
防注入:随机 ISN 让伪造数据无法混进合法编号序列,注入攻击从猜编号变成盲发,成功率大幅下降
防劫持:代理IP链路里的会话劫持需要预判对方序列号,随机化之后推算窗口极短,攻击窗口被压到几乎不可利用
防重放:历史数据包拿回来重放,序列号与当前窗口对不上,接收方直接丢弃,不会造成重复执行
序列号是 TCP 给每个字节编的门牌号,ISN 随机化就是每次开门都重新发一套门牌。代理IP把链路拆成两段,门牌就发两次,两段各算各的——看懂这一点,抓包时就不会再把正常的随机当成异常,排障时也能更快把问题定位到真正的丢包与重传上。
