TCP/IP是否阻止同一数据包的多个副本到达目的地?或者由端点将幂等逻辑层叠在它上面?
如果可能,请参考TCP/IP规范中的特定段落.
从重复数据包中恢复是TCP堆栈的工作:
TCP必须从因特网通信系统损坏,丢失,重复或无序传送的数据中恢复.这是通过为发送的每个八位字节分配序列号来实现的,并且需要来自接收TCP的肯定确认(ACK).如果在超时间隔内未收到ACK,则重新传输数据.在接收器处,序列号用于正确地排序可能无序接收的段并消除重复.通过向传输的每个段添加校验和,在接收器处检查并丢弃损坏的段来处理损坏.
- RFC 793 - 传输控制协议,第1.5节
但是,如果它们是具有新序列号的相同数据包,则不会.
TCP使用序列号来检测重传时的重复,这也可以防止重复的重放攻击.
来自RFC 793,第3.3节 - 序列号:
设计中的一个基本概念是通过TCP连接发送的每个八位字节数据都有一个序列号.由于每个八位字节都是有序的,因此每个八位字节都可以被确认.所采用的确认机制是累积的,因此序列号X的确认表明已经接收到所有八位组但不包括X. 该机制允许在存在重传的情况下进行直接重复检测.段内八位字节的编号是紧跟在标题之后的第一个数据八位字节是编号最小的,并且后面的八位字节是连续编号的.
重复检测将确保不能轻易地重传相同的分组.序列号还将确保注意到数据流中数据的插入(而不是替换),因为伪造数据包之后的其他合法数据包将具有重复的序列号,这将破坏数据流.这可能会导致这些数据包被丢弃为重复数据包,这可能会破坏正在使用的协议.
有关原始(1981)TCP/IP规范的更多信息可以在RFC 793中找到,还有许多其他RFC涉及对TCP/IP协议的扩展或修改.