我一直在Java + lksctp上测试SCTP支持。我编写了一个简单的客户机,以查看SCTP关联的初始设置,它基本上是"INIT“和”inital“。我已经测试了客户端将"INIT“发送到服务器的两种方法,基本上是:
因此,通过这种方式,我可以在Wireshark中看到我的所有网络接口都有"IPv4地址参数“(如下面所示),但是Source得到的是一个发送端口号,而不是我想要的2906,它在绑定中。

所以..。一旦本地IP/端口的绑定发生在“打开”之后.因此,我将代码更改为:
通过这种方式,我可以在wireshark中看到预期的源/目标端口(2906/2905),但是INIT没有"IPv4地址参数“。

那么,有人知道为什么我在INIT中缺少"IPv4地址参数“的第二个代码吗?我错过了什么吗?
任何帮助都是很受欢迎的。
谢谢。
发布于 2018-09-13 20:34:25
INIT/INIT_ACK块中的IP地址是可选参数。如果您的端点是签名的,IP地址可能不包括在INIT/INIT_ACK块中。远程端仍然可以从IP报头中检索有关对等地址的信息。
从根本上讲,这种行为的原因是传递了哪些参数来打开()。没有任何参数的Open()和具有指定远程地址的open()以不同的方式工作。
如果您使用套接字地址为远程端调用SctpChannel.open(socketAddress,1,1),它将有效地打开通道并连接到远程端(请参阅开放文档 )。在本例中,bind()和connect()调用是非常无用的。因此,由于在建立连接之前没有bind()调用,所以您使用的是具有随机端口(56044)和所有可用接口的IP地址的“默认”端点。
在第二种情况下,当您不为open()指定socketAddress时,它只是打开通道,但在这个阶段没有连接到远程终端。因此,bind()调用成功地指定了端点详细信息(端口和IP地址),当调用connect()时,它实际上是使用刚才创建的端点(192.168.1.251:2906)来建立与远程终端的连接。
https://stackoverflow.com/questions/52305560
复制相似问题