为了大家的利益,我刚刚谈到了几点,然后才进入重点。
SCTP 端点可以有多个 IP 地址。也就是说,应用程序可以打开一个 SCTP 套接字并将选择性的一组地址或所有 IP 地址绑定到该套接字。SCTP 中的关联是在一对端点之间。SCTP 端点应交换 IP 地址列表,以便每个端点可以接收来自其他端点中任何地址的消息。IP 地址列表的交换是在启动关联时完成的。但是,SCTP 应使用一个 IP 地址作为通信的主要地址,而其他 IP 地址应用于重传,以防连续发送数据或控制块失败。
从 RFC4960(SCTP) 中,您会注意到“在启动关联期间,如果收到的 INIT 中存在主机名参数,端点应将该主机名解析为 IP 地址列表并派生传输通过将解析的 IP 地址与 SCTP 源端口相结合来获得此对等方的地址。”
然而,RFC4960(SCTP) 的一个关键点是时间将主机名解析为 IP 地址的重要性。它指出“在名称转换涉及潜在长延迟的情况下,INIT 的接收者必须推迟名称解析,直到从对等方接收到 COOKIE ECHO 块。在这种情况下,INIT 的接收者应该构建状态 Cookie 使用接收到的主机名(而不是目标传输地址)并将 INIT ACK 发送到接收到 INIT 的源 IP 地址。”
如果我们仅从上述信息来看您的场景:考虑到在发送 INIT 块后主接口被关闭并假设将主机名解析为 IP 地址的时间在服务器中花费了太多时间,可以假设INIT-ACK 已发送到接收 INIT 的源 IP 地址(主接口)。
但是,如果您仔细阅读 SCTP 的 RFC,在 RFC4960(SCTP) 中有一条关于 INIT-ACK 的明确说明,声称“必须将 INIT ACK 发送到 INIT 的源地址。”请参阅 RFC3286(SCTP)似乎将其作为一种保护机制来传达,因为它声称“由于 INIT ACK 总是返回到 INIT 的源地址,因此盲目的攻击者将无法获得 Cookie。”
现在,如果我们通过考虑上述信息来研究您的场景:很明显,服务器将始终将响应 INIT ACK 块发送到 INIT 的 IP 标头中的源地址。