SCTP INIT缺少IPv4地址参数

问题描述 投票:1回答:1

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

  • 使用“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,因为我希望拥有它并且它在绑定中。

enter image description here


所以...一旦本地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地址参数”。

enter image description here

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

任何帮助都会非常受欢迎。

谢谢。

java sctp
1个回答
0
投票

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)来建立与远程端的连接。

© www.soinside.com 2019 - 2024. All rights reserved.