1

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

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

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

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

4

4 回答 4

2

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

TCP 实现必须作为错误拒绝对无效远程 IP 地址(例如,广播或多播地址)的本地 OPEN 调用。

TCP 或 IP 层必须忽略具有无效源地址的传入 SYN(参见第 3.2.1.3 节)。

TCP 实现必须默默地丢弃一个传入的 SYN 段,该段寻址到广播或多播地址。

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

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

但是已经有一些协议用于在网络上查找服务器,例如 Bonjour。服务器也可以列在 DNS 或 Active Directory 中。你的想法听起来不像它完成了任何尚不可用的事情。

于 2013-08-28T14:14:12.613 回答
1

“仅用于握手的多播”听起来很像任播。也许你可以看看那个。https://en.wikipedia.org/wiki/Anycasthttps://www.rfc-editor.org/rfc/rfc1546

于 2013-08-27T06:48:50.690 回答
1

它肯定需要对内核进行重大更改。它也与 TCP RFC 完全不兼容,所以你要实现的不是 TCP。

应该编辑哪些文件?TCP 内核实现文件。但是您首先需要很好地了解 Linux 的 TCP 是如何工作的,这远远超出了 Stackoverflow 答案所能提供的范围。

但是,为什么不寻求更简单的解决方案呢?
使用 UDP 多播,向所有潜在合作伙伴发送消息。每个人都将通过 UDP 回复他们的 IP 和端口号。然后打开所有这些的常规 TCP 连接。

于 2013-08-28T07:32:53.777 回答
0

让 TCP 拥有多个客户端并非易事!以下是一些原因。首先,如果有多个接收器,那么您如何跟踪为谁使用的发送速率。其次,如果多个接收者错过了一组数据包,您如何重新传输这些数据包。第三,如果接收者通告给定的接收器缓冲区(也称为流控制),您选择哪一个 - 您是选择通告的最小缓冲区并让其他人受苦,还是您选择平均值并只让一些接收者受苦。最后,TCP 是面向连接的,因此即使您破解内核来执行此操作,像 send()/recv() 这样的普通套接字调用也不会知道客户端发送或接收的内容。您可以尝试使用 sendto()/recvfrom(),但截至今天,内核通常会忽略这些调用中的地址。

您最好在 TCP 之上构建应用层覆盖

于 2013-08-27T06:19:06.943 回答