发送带有效负载

时间:2016-06-23 14:11:32

标签: linux sockets tcp packet

启动TCP连接时是否可以发送带有自定义有效负载的SYN数据包?我的直觉是它在理论上是可行的。我正在寻找一种在Linux中实现这一目标的简单方法(使用C或Go语言),但由于它不是标准行为,我还没有找到有用的信息。 (This post非常相似,但不是很有帮助。)

请帮助我,谢谢!

编辑:抱歉模糊不清。不仅是这种任务的可能性,我还在寻找一种方法,甚至是样本代码来实现它。

4 个答案:

答案 0 :(得分:5)

显然,如果您双方都自己编写软件,可以随心所欲地使用它。但是,如果您依赖于任何一端的标准软件(例如,标准的Linux或Windows内核),那么不,这是不可能的,因为根据TCP,您不能发送数据,直到会话是已建立,并且会话尚未建立,直到您从另一个对等方获得确认到您的SYN

因此,例如,如果你发送一个SYN数据包,其中还包含额外的有效负载到linux内核(请注意:这是在某种程度上的推测,因为我还没有真正尝试过),它会只需忽略有效负载并继续确认(SYN/ACK)或拒绝(RSTSYN scapy,具体取决于是否有听众。

无论如何,你可以试试这个,但是因为你已经去了#34;关闭预订"可以这么说,你需要制作自己的原始包;您无法说服当地的操作系统为您创建它们。

python #!/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)) 包可以构建它:

String text = "A.B.G[FULL] - 550RS";
String numberOnly= text.replaceAll("[^0-9]", "");

答案 1 :(得分:1)

无法使用TCP来实现此目的。

如果你想要相同的TCP可靠性和数据流语义,你需要一个新的可靠协议,除了TCP提供的其余功能外,还有初始数据段,例如拥塞控制和窗口缩放。

幸运的是,您不必从头开始实施。 UDP协议是一个很好的起点,可以作为新L4的L3。

其他项目已经做了类似的事情,因此可以使用它们而不是实现自己的项目。考虑QUICUDT

答案 2 :(得分:1)

据我了解(以及Jeff Bencteux在另一个答案中的评论中所写),TCP Fast Open为TCP解决了此问题。

请参阅this LWN article

  

取消往返

     

理论上,初始SYN段可能包含连接发起者发送的数据:RFC 793(TCP规范)允许将数据包含在SYN段中。但是,在三次握手完成之前,禁止TCP将数据传递给应用程序。

     

...

     

TFO的目的是通过允许数据作为启动连接的SYN段的一部分来消除TCP会话中的一个往返时间。

enter image description here

答案 3 :(得分:1)

TCP快速打开即可。但是两端都应该说TCP快速开放。 QUIC提出了一种新协议来解决该问题,即AKA 0-RTT。