我要攻击的TCP服务器(尝试使用内置节点TLS套接字)希望按一定顺序进行发送/接收的握手过程(发送,成功接收,成功发送,成功发送,发送更多消息,等等)。接收消息没有让我知道它正在响应的发送消息的任何内容,因此我无法轻松使用内置TCP节点库的流式传输特性。
关于在Node中处理这种情况的最佳方法的任何想法?
example(python),这是该过程的示例:
s.send("hello")
s.send("send this 1")
reply = s.recv()
message = reply[0]
if message == OK:
print('Got OK for hello')
s.send("send this 2")
reply = s.recv()
message = reply[0]
if message == OK:
print('Got it')
else:
raise Exception('Failed to send hello')
答案 0 :(得分:1)
当您具有非阻塞I / O并且想要执行诸如发送数据之类的操作时,请从该发送中读取特定的响应,您需要设置一些适当的状态,以便在接收下一组数据时知道确切地属于它,因此您知道该怎么做。
我可以想到很多方法:
创建一个通用状态机,您可以在其中发送数据并读取数据,并且每当读取数据时,您就可以知道套接字所处的状态,因此应该对读取的数据进行处理。
创建一个临时的侦听器集,将数据发送到该侦听器集,然后为输入的数据添加一个临时的侦听器(可以使用.once()
),该传入的数据经过专门设计以按照您期望此响应的方式处理它是。数据到达后,请确保已删除侦听器。
您的伪代码示例显示的信息不足,任何人都无法提出更具体的建议。 TCP本质上是流驱动的。它没有消息或数据包的内在含义。因此,您显示的内容甚至没有显示任何TCP协议的最基本级别,这是如何知道何时收到完整响应的。
即使您使用其他语言显示的reply = s.recv()
在TCP中也不可行(无论使用哪种语言),因为s.recv()
需要知道何时有完整的消息/块/无论是什么,正在等待接收。 TCP按发送顺序传递数据,但对一起传送的特定信息包没有任何意义。您必须在TCP层之上提供它。用于描述消息的常用技术是:
我当时想向您展示一个示例,使用socket.once('data', ...)
来监听特定的响应,但是即使不知道如何描述收到的消息也无法正常工作,这样您才能知道何时收到完整的消息。收到的消息。
因此,您的第一步就是在TCP之上实现一个层,该层读取数据并知道如何将其分解为离散的消息(既知道一条完整的消息何时到达,又知道如何分解多条消息,这可能会到达),然后在整个消息到达时在套接字上发出您自己的事件。然后,直到那时,您才能开始使用上述技术来实现其余的状态机。