注意:我不是要求如何在整个会话中使用多播或广播,仅用于握手
我想知道我的想法是否可以在Linux程序中实现而不需要对内核进行任何更改。或者,如果确实需要修改内核,我想知道需要编辑哪些文件。
基本思想是:“客户端”将TCP SYN数据包发送到广播或多播地址,然后调用accept()或等效项,为每个获取的SYN-ACK打开一个单独的文件描述符。
理想情况下,我想使用修改后的握手,然后切换回标准TCP方法,但如果这是不可能的,我不介意使用另一个线程并使用unix域套接字模拟它。
答案 0 :(得分:2)
多播TCP与TCP规范不兼容。 RFC 1122 section 4.2.3.10说:
TCP实现必须拒绝本地OPEN作为错误 呼叫无效的远程IP地址(例如,广播或 多播地址)。
具有无效源地址的传入SYN必须是 被TCP或IP层忽略(参见章节 3.2.1.3)。
TCP实现必须以静默方式丢弃传入的SYN 寻址到广播或多播的段 地址。
基本问题是SYN-ACK应答的源地址必须与原始SYN数据包的目标地址匹配 - 这就是回复与原始连接请求匹配的方式(除了将目标地址与原始源地址和匹配的端口号)。但是为了在握手后切换到单播,您需要知道服务器的真实地址。
我想,您可以增强协议以添加包含此地址的TCP选项。或者您可以说当SYN发送到多播组时,匹配时会忽略回复的源地址 - 这意味着端口号本身唯一地定义了多播连接请求。如果您对此感兴趣,也许您应该为它编写规范,并将其作为协议增强提交给IETF。
但是已经存在用于在网络上查找服务器的协议,例如Bonjour。服务器也可以在DNS或Active Directory中列出。你的想法听起来并不像它完成了任何尚未提供的东西。
答案 1 :(得分:1)
“仅用于握手的多播”听起来很像任播。也许你可以看一下。 https://en.wikipedia.org/wiki/Anycast和https://tools.ietf.org/html/rfc1546
答案 2 :(得分:1)
肯定需要进行重大的内核更改。它也与TCP RFC完全不兼容,因此您实现的不是TCP。
应该编辑哪些文件? TCP内核实现文件。但是,您首先需要深入了解Linux的TCP工作原理,超出Stackoverflow的答案所能提供的范围。
但是,为什么不寻求更简单的解决方案呢? 使用UDP多播,向所有潜在合作伙伴发送消息。每个人都将通过UDP回复他们的IP和端口号。然后打开常规TCP连接到所有这些。
答案 3 :(得分:0)
使TCP拥有多个客户端是非常重要的任务!以下是一些原因。首先,如果有多个接收器,那么如何跟踪为谁使用的发送速率。其次,如果多个接收器错过了一组数据包,那么如何重传这些数据包。第三,如果接收者通告一个给定的接收缓冲区(也就是流量控制),你选择哪一个 - 你选择最小的缓冲区广告让其他人受到影响,或者你选择一个平均值,只让一些接收者受到影响。最后,TCP是面向连接的,所以即使你破解内核来执行此操作,像send()/ recv()这样的普通套接字调用也不会知道客户端发送或接收的内容。您可以尝试使用sendto()/ recvfrom(),但截至今天,内核通常会忽略这些调用中的地址。
最好在TCP
之上构建应用程序层覆盖