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