Tcp 如何处理协议错误?

Tcp 如何处理协议错误?,tcp,network-programming,Tcp,Network Programming,使用TCP进行成帧的正确方式或技术是什么 我在node.js服务器中创建了一个简单的框架,用于在消息传入时对其进行框架,其中第一个字节是数据包大小 但有一个问题是:如果用户故意发送一个无效的数据包怎么办 比如: 0A 00 03 04 05 我们可以看出这是一个坏包,0A是大小,但我们可以看到实际大小仅为05 我们如何防止此类攻击?如果收到垃圾,请关闭插座。坚持下去没有意义。对方不会说您的语言,或者故意试图使您崩溃或利用漏洞。不要让他这样做。TCP是基于流的,不在边界上工作。因此recv()返

使用TCP进行成帧的正确方式或技术是什么

我在node.js服务器中创建了一个简单的框架,用于在消息传入时对其进行框架,其中第一个字节是数据包大小

但有一个问题是:如果用户故意发送一个无效的数据包怎么办

比如:

0A 00 03 04 05
我们可以看出这是一个坏包,
0A
是大小,但我们可以看到实际大小仅为
05


我们如何防止此类攻击?

如果收到垃圾,请关闭插座。坚持下去没有意义。对方不会说您的语言,或者故意试图使您崩溃或利用漏洞。不要让他这样做。

TCP是基于流的,不在边界上工作。因此
recv()
返回的部分数据可能是真实的。或者可能有无效的对等方只是想破坏连接。TCP不会有帮助。申请者有责任采取行动


如果数据未完全接收(长度字节数指示的数量),则应用程序必须具有放弃的逻辑。可能是一个计时器,在该计时器到期时,应用程序应将连接标记为无效,然后执行
close()

,因为协议中没有允许您验证指定大小是否正确的内容

您可以在每条消息中附加一个控制字符(例如ascii 03):

您的验证会起作用,但下一条消息将被破坏


防止这种情况发生的唯一方法是确保实际主体包含合理的值,如果不包含,则断开客户端连接。

只需验证所有输入即可。如果客户端发送“N字节即将到来”,则读取N字节。如果读取的数据量较少(因为在获得N个字节之前,流已耗尽),请将其解释为连接问题或某个地方的错误,记录事件并中止连接。

是的,但有任何已知或记录在案的相关技术吗?@majidarif Err,
close()
<length><body><footer char>
03 32 32 32 03 32 32 32