c - TCP 使用多播仅用于初始化

标签 c linux sockets tcp multicast

注意:我不是在问如何在整个 session 中使用多播或广播,只是为了握手

我想知道是否可以在不对内核进行任何更改的情况下在 Linux 程序中实现我的想法。或者如果确实需要修改内核,我想知道需要编辑哪些文件。

基本思想是:“客户端”向广播或多播地址发送一个 TCP SYN 数据包,然后调用 accept() 或等效函数为它返回的每个 SYN-ACK 打开一个单独的文件描述符。

理想情况下,我想使用修改后的握手,然后切换回标准 TCP 方法,但如果这不可能,我不介意使用另一个线程并使用 unix 域套接字模拟它。

最佳答案

多播 TCP 与 TCP 规范不兼容。 RFC 1122 section 4.2.3.10说:

A TCP implementation MUST reject as an error a local OPEN call for an invalid remote IP address (e.g., a broadcast or multicast address).

An incoming SYN with an invalid source address must be ignored either by TCP or by the IP layer (see Section 3.2.1.3).

A TCP implementation MUST silently discard an incoming SYN segment that is addressed to a broadcast or multicast address.

基本问题是 SYN-ACK 回复的源地址必须与原始 SYN 数据包的目标地址匹配——这就是回复与原始连接请求匹配的方式(除了将目标地址与原始源地址,以及匹配的端口号)。但是为了在握手后切换到单播,您需要知道服务器的真实地址。

我想,您可以增强协议(protocol)以添加包含此地址的 TCP 选项。或者您可以说,当 SYN 发送到多播组时,匹配时忽略回复的源地址——这意味着端口号单独唯一定义多播连接请求。如果您对此感兴趣,也许您应该为其编写规范,并将其作为协议(protocol)增强建议提交给 IETF。

但是已经有用于在网络上查找服务器的协议(protocol),例如 Bonjour。服务器也可以在 DNS 或 Active Directory 中列出。您的想法听起来并没有完成任何尚未实现的事情。

关于c - TCP 使用多播仅用于初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18456802/

相关文章:

C 编程。为什么这不起作用?

c - 为什么 CILK_NWORKERS 会影响只有一个 cilk_spawn 的程序?

c++ - 您应该在只有定义的文件中使用 extern "C"吗?

linux - 使用 ls 列出目录及其总大小

windows - 如何在 Windows 上使用类 Linux Shell (bash) 进行开发?

linux - 使用选项时lsof "lies"?

java - 为什么套接字只是在Android和Linux之间转储?

c - 以编程方式获取函数名称

python - ZeroMQ:每种数据类型的套接字还是只有一个套接字?

sockets - Twisted上的IPv6链路本地多播