现代世界充满千兆位/秒开关。
根据TCP标准,序列空间有2^32个字节(字节)。
让我们算一算。1_000_000_000是125_000_000字节。从概念上讲,已建立的TCP连接中的每个字节都有自己独特的序列号;在这里,唯一性是必须的,因为没有它,整个进程就会出现故障。因此,(2^32) / 125_000_000产生大约。35秒换句话说,一个现代千兆/秒交换机/网络可以在半分钟内耗尽整个序列空间。
在我看来,对于关于序号唯一性的核心假设来说,这听起来非常不安全。我们如何保证在这35秒内,一个假定的具有某些序列号X
的“旧”数据包会死掉,旧数据包和新数据包之间不会突然出现冲突?如果OSI在最初的位置就存在,那么这个保证在哪一级生存?
为了清楚起见,我要引用TCP:
在正常情况下,TCPs跟踪要发出的下一个序列号和等待确认的最老序列号,以避免在第一次使用之前错误地使用序列号。这本身并不能保证旧的重复数据被从网络中抽走,因此序列空间变得非常大,从而降低了游荡复制在到达时会造成麻烦的可能性。每秒2兆位。用掉2**32八位数的序列空间需要4.5小时。由于网络中的最大段生存期不可能超过几十秒,因此对于可预见的网络来说,这被认为是足够的保护,即使数据速率上升到10‘S的兆位/秒。在100兆比特/秒的情况下,循环时间为5。
发布于 2021-12-30 13:15:12
千兆位的速度是吞吐量,但它没有告诉您缓冲区的深度或数据包的生存期。在某种程度上,较高的吞吐量交换机会导致更短的分组生存期,因为在正常情况下,分组将更快地被传送到其目的地(或丢弃)。
为了使序列号成为一个问题,您必须:
这是不可能的,因为系统缓冲区倾向于按顺序缓冲.很难看出哪种间歇性故障会允许4GB传输,同时也会将流氓数据包路由到足够长/很深的延迟的某个地方,这样就可以作为副本到达。
这并不是很难保证永远不会有重复。只是不太可能在正常操作中造成问题。请注意,理论上,如果恶意参与者在connection - 有时通过猜测序列号其他连接.中看到其他数据包,则可以向数据包中注入目标序列号。
这是任何地方加密的另一个好处,因为如果使用MAC-然后加密(如TLS),有线上损坏的数据将导致解密失败,因此您可以拆下连接并在应用层恢复(例如重试操作)。
https://softwareengineering.stackexchange.com/questions/435632
复制相似问题