【问题标题】:SCTP INIT missing IPv4 address parameterSCTP INIT 缺少 IPv4 地址参数
【发布时间】:2019-02-17 16:59:24
【问题描述】:

我一直在测试 Java + lksctp 上的 SCTP 支持。 我编写了一个简单的客户端来查看 SCTP 关联的初始设置,它基本上是“INIT”和“INIT ACK”。 我已经测试了两种客户端将“INIT”发送到服务器的方法,基本上是:

  • 使用“open(SocketAddress)”创建 SctpChannel 对象

    try {
        InetSocketAddress socketAddress = new InetSocketAddress("192.168.52.197", 2905);
        SctpChannel sctpChannel = SctpChannel.open(socketAddress,1,1); 
        sctpChannel.bind(new InetSocketAddress("192.168.1.251",2906)); 
        sctpChannel.connect(socketAddress, 1 ,1);
    

所以通过这种方式,我可以在 Wireshark 中看到我的所有网络接口都有“IPv4 地址参数”(如下所示为 3),但源端口获取的是一个偶然的端口号,而不是 2906我想拥有它,它在绑定中。


所以...一旦本地 IP/端口的绑定在“打开”之后发生...所以我将代码更改为:

  • 创建“open()”的 SctpChannel 对象

  • 绑定本地客户端IP和端口

  • “连接”到远程服务器 IP 和端口

    try {
        InetSocketAddress socketAddress = new InetSocketAddress("192.168.52.197", 2905);
        SctpChannel sctpChannel = SctpChannel.open(); 
        sctpChannel.bind(new InetSocketAddress("192.168.1.251",2906)); 
        sctpChannel.connect(socketAddress, 1 ,1);
    

这样,我可以在wireshark中看到源/目标端口是预期的(2906/2905),但INIT没有“IPv4地址参数”。

那么有谁知道为什么我在 INIT 中缺少“IPv4 地址参数”的第二个代码?我错过了什么吗?

非常欢迎任何帮助。

谢谢。

【问题讨论】:

    标签: java sctp


    【解决方案1】:

    INIT/INIT_ACK 块中的 IP 地址是可选参数。如果您的端点是signglehomed IP 地址可能不包含在INIT/INIT_ACK 块中。远端仍然可以从 IP 头中检索有关对等地址的信息。

    从根本上说,这种行为的原因是您传递给 open() 的参数。不带任何参数的 Open() 和指定远程地址的 open() 以不同的方式工作。

    如果您使用远程端的套接字地址调用SctpChannel.open(socketAddress,1,1),它会有效地打开通道并连接到远程端(请参阅open documentation。在这种情况下,您的 bind() 和 connect() 调用非常无用。所以既然有在建立连接之前没有 bind() 调用,您有点使用带有随机端口 (56044) 和所有可用接口 IP 地址的“默认”端点。

    在第二种情况下,当您没有为 open() 指定 socketAddress 时,它只是打开通道但在此阶段不连接到远程端。因此,您的 bind() 调用成功指定了端点详细信息(端口和 IP 地址),当您调用 connect() 时,它实际上是使用您刚刚创建的端点 (192.168.1.251:2906) 来建立与远程端的连接。

    【讨论】:

    • 谢谢亚历山大。是的,我知道 IP 地址是 INIT 的一个可选参数……但即使这样,是否可以让应用程序发送这个可选参数(IP 地址)?或者它真的是对 lksctp 的限制,它不会发送 IP 地址,因为我已经绑定了本地 IP/端口?
    • 这并不是真正的限制。这正是它的工作方式。 RFC 4960 第 5.1.2 章说“如果接收到的 INIT 或 INIT ACK 块中不存在地址参数,端点应获取块到达的源 IP 地址并记录它,并结合 SCTP 源端口号,作为此对等方的唯一目标传输地址。”因此,当端点创建对等点的 IP 地址列表时,它总是从 IP 标头中获取源地址集和 INIT/INIT_ACK 块中列出的 IP 地址。
    猜你喜欢
    • 2011-01-27
    • 2014-02-23
    • 2018-11-19
    • 1970-01-01
    • 2011-01-04
    • 2016-10-17
    • 2015-09-06
    • 2012-12-25
    • 2015-06-05
    相关资源
    最近更新 更多