我不明白这部分是什么意思:
例如:我删除了 20 个字节的 TCP 有效负载。然后修改
仅适用,如果我在结尾处还切断了额外的 20 个字节
有效载荷。
无论如何,你缺少的是每个 TCP 段都携带
一个 TCP 头域——“序列号”域——表明
该段的数据内容在字节流中的位置
正在通过 TCP 传输。
TCP 接收方使用段序列号和段长度
(段长度是根据 IP 数据报的长度计算的
传送段)来构建一个连续的字节流
收到的流量。例如,如果接收方之前
收集到序列位置 200 和下一个传入的所有数据
片段如下所示:
(segment 1) sequence=200 length=80 data='data data data ...'
(segment 2) sequence=280 length=60 data='more data ...'
(segment 3) sequence=340 length=70 data='even more data ...'
那么接收者就知道它现在已经收集了所有的数据
直到(但不包括)位置 410。由于没有间隙,
此数据已准备好传递给应用程序。
请注意,段号 (1)、(2)、(3) 不出现在
TCP 标头。这些数字只是为了让这个描述
可以参考一下。
显然,如果段 (2) 已经丢失并且接收者只有
收集到的段 (1) 和 (3) 然后接收者会知道
接收到的数据有差距。它会确切地知道
差距在哪里:它从位置 280 开始缺少 60 个字节。
TCP 承诺提供完整的有序数据流,所以直到
该空白被填补,接收方不允许交付任何
后面的字节(比如它在段中获得的位置 340 处的 70 个字节
3)到应用程序。如果丢失的字节没有很快到达
然后接收方将告诉发送方有关差距和发送方
将重新传输丢失的数据。
这就是为什么从 TCP 段中删除字节会导致问题。如果
您的程序从段 (2) 中删除了 20 个字节,然后是接收器
会看到这个:
(segment 1) sequence=200 length=80 data='data data data ...'
(segment 2) sequence=280 length=40 data='more data ...'
(segment 3) sequence=340 length=70 data='even more data ...'
并且接收方会得出结论,它发现了一个
位置 320 处 20 个字节。
如果 Wireshark 正在观察此流量,那么它将得出相同的结论。
TCP 接收方和 Wireshark 都不知道导致
缺少字节是段 (2) 已被编辑。 Wireshark 最
合理的猜测是丢失的字节在一个段中
不知何故没有可供检查,这就是为什么它
显示“未捕获上一个片段”消息。它说“以前”
因为它直到它检查才发现有间隙
段 (3),然后是间隙之后的一段。
接收者将像处理任何
差距。它将告诉发件人有关间隙并等待丢失
要重传的数据。如果接收方得到丢失的数据
然后它将填补空白,然后照常继续。如果你
继续拦截重传并删除丢失的字节
那么接收器会继续报告它有一个gap,并且
发送者最终会厌倦重新传输丢失的数据
它会放弃 TCP 连接。
这意味着您不能简单地从运行中的 TCP 分段中删除数据
并期望 TCP 不会注意到数据丢失。原则上你
可以通过删除一些数据然后操纵序列来做到这一点
来自发件人和的所有后续段中的编号
接收方发送的确认,但这是一项更大的任务。
参考资料:描述了基本的TCP序列号机制
在RFC 793 和长期
使用序列号提高安全性的最佳实践是
在RFC 1948 和
在RFC 6528 中正式化为标准。