在TCP连接初始化时,是否可以发送带有自定义有效负载的SYN数据包?我的直觉是理论上是可行的。我正在寻找在Linux中实现此目标的简单方法(使用C或Go语言),但由于这不是标准行为,因此我尚未找到有用的信息。(这篇文章相似,但并不是很有帮助。)
请帮帮我,谢谢!
编辑:对于这个任务的可能性,我还在寻找一种方法,甚至是示例代码。
请帮帮我,谢谢!
编辑:对于这个任务的可能性,我还在寻找一种方法,甚至是示例代码。
消除一次往返
从理论上讲,初始的SYN段可以包含由连接发起者发送的数据:RFC 793(TCP规范)允许在SYN段中包含数据。但是,在三次握手完成之前,TCP禁止将该数据传递给应用程序。
...
TFO的目标是通过允许将数据作为启动连接的SYN段的一部分包含来从TCP会话中消除一次往返时间。
#!/usr/bin/env python2
from scapy.all import *
sport = 3377
dport = 2222
src = "192.168.40.2"
dst = "192.168.40.135"
ether = Ether(type=0x800, dst="00:0c:29:60:57:04", src="00:0c:29:78:b0:ff")
ip = IP(src=src, dst=dst)
SYN = TCP(sport=sport, dport=dport, flags='S', seq=1000)
xsyn = ether / ip / SYN / "Some Data"
packet = xsyn.build()
print(repr(packet))
proc/sys/net/ipv4/tcp_fastopen
进行配置)。然而,这并不是最优的选择,因为你需要建立第一个连接才能使用它。 - Jeff Bencteux我之前说过这是不可能的。从一般意义上来说,我仍然坚持这个评估。
但是对于客户端来说,使用connect()
API实际上是不可能的。在使用TCP Fast Open时,有一种替代的连接API。示例:
sfd = socket(AF_INET, SOCK_STREAM, 0);
sendto(sfd, data, data_len, MSG_FASTOPEN,
(struct sockaddr *) &server_addr, addr_len);
// Replaces connect() + send()/write()
// read and write further data on connected socket sfd
close(sfd);
没有API允许服务器将数据附加到发送给客户端的SYN-ACK。
即使如此,如果您只需要来自客户端的数据,则在客户端和服务器上启用TCP Fast Open可能会使您实现所需的结果,但它有自己的问题。
如果您想要与TCP相同的可靠性和数据流语义,您将需要一个新的可靠协议,该协议除了TCP提供的拥塞控制和窗口缩放之外,还具有初始数据段,例如。
幸运的是,您不必从头开始实现。 UDP协议是一个很好的起点,可以作为您的新L4的L3。
其他项目已经做过类似的事情,因此可能可以使用那些而不是实现自己的项目。考虑QUIC或UDT。这些协议是在现有的UDP协议上实现的,因此避免了部署TCP Fast Open时面临的问题。