TCP仅使用多播进行初始化

TCP仅使用多播进行初始化,c,linux,sockets,tcp,multicast,C,Linux,Sockets,Tcp,Multicast,注意:我不是在问如何在整个会话中使用多播或广播,只是在握手时 我想知道我的一个想法是否可以在不改变内核的情况下在Linux程序中实现。或者,如果确实需要修改内核,我想知道需要编辑哪些文件 基本思想是:“客户机”向广播或多播地址发送一个TCP SYN数据包,然后调用accept()或等效程序,为其返回的每个SYN-ACK打开一个单独的文件描述符 理想情况下,我希望使用修改后的握手,然后切换回标准的TCP方法,但如果这不可能,我不介意使用另一个线程并用unix域套接字模拟它。使TCP具有多个客户端是

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

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

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


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

使TCP具有多个客户端是一项不平凡的任务!以下是一些原因。首先,如果有多个接收器,那么您如何跟踪为谁使用的发送速率。第二,如果多个接收器丢失了一组数据包,如何重新传输这些数据包。第三,如果接收者公布一个给定的接收者缓冲区(也称为流控制),你会选择哪一个——你是选择公布的最小缓冲区,让其他人受苦,还是选择平均值,只让一些接收者受苦。最后,TCP是面向连接的,所以即使您攻击内核来实现这一点,像send()/recv()这样的普通套接字调用也不会知道客户端发送或接收的是什么。您可以尝试使用sendto()/recvfrom(),但到今天为止,内核通常会忽略这些调用中的地址


您最好在TCP之上构建一个应用程序层覆盖层,使TCP拥有多个客户端是一项非常重要的任务!以下是一些原因。首先,如果有多个接收器,那么您如何跟踪为谁使用的发送速率。第二,如果多个接收器丢失了一组数据包,如何重新传输这些数据包。第三,如果接收者公布一个给定的接收者缓冲区(也称为流控制),你会选择哪一个——你是选择公布的最小缓冲区,让其他人受苦,还是选择平均值,只让一些接收者受苦。最后,TCP是面向连接的,所以即使您攻击内核来实现这一点,像send()/recv()这样的普通套接字调用也不会知道客户端发送或接收的是什么。您可以尝试使用sendto()/recvfrom(),但到今天为止,内核通常会忽略这些调用中的地址


您最好在TCP之上构建一个应用层覆盖,“仅用于握手的多播”听起来很像anycast。也许你可以看看。而且,“仅用于握手的多播”听起来很像anycast。也许你可以看看。而且

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

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

但是,为什么不采用更简单的解决方案呢?

使用UDP多播,向所有潜在合作伙伴发送消息。每个人都将通过UDP回复他们的IP和端口号。然后打开与它们所有的常规TCP连接。

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

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

但是,为什么不采用更简单的解决方案呢?

使用UDP多播,向所有潜在合作伙伴发送消息。每个人都将通过UDP回复他们的IP和端口号。然后打开到所有端口的常规TCP连接。

多播TCP与TCP规范不兼容。RFC1122说:

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

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

TCP实现必须以静默方式丢弃传入的SYN 寻址到广播或多播的段 地址

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

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


但是已经有一些协议用于查找网络上的服务器,比如Bonjour。服务器也可以列在DNS或Active Directory中。你的想法听起来并没有实现任何尚未实现的功能。

多播TCP与TCP规范不兼容。RFC1122说:

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

必须删除具有无效源地址的传入SYN 被TCP或IP层忽略