[嵌入式linux]

操作系统会自动把接收的两个网络包组合在一起吗?

[复制链接]
425|2
手机看帖
扫描二维码
随时随地手机跟帖
zhangdage|  楼主 | 2022-12-8 09:51 | 显示全部楼层 |阅读模式
FPGA发送数据到ARM, 一组数据是2K , 需要分发成2个数据包发送, 请问数据包如何让系统自动组合成一个包后再通知应用软件(或者说网络包是否有什么格式可以让系统自动把多个包组合在一起)?

使用特权

评论回复
zhangdage|  楼主 | 2022-12-9 09:12 | 显示全部楼层
3 通信协议
在了解了粘包、拆包产生的原因之后,现在来分析接收方如何对此进行区分。道理很简单,如果存在不完整的数据(拆包),则需要继续等待数据,直至可以构成一条完整的请求或者响应。

通过定义通信协议(protocol),可以解决粘包、拆包问题。协议的作用就定义传输数据的格式。这样在接受到的数据的时候:

如果粘包了,就可以根据这个格式来区分不同的包
如果拆包了,就等待数据可以构成一个完整的消息来处理。
3.1 定长协议
        定长协议:顾名思义,就是指定一个报文的必须具有固定的长度。例如,我们规定每3个字节,表示一个有效报文,如果我们分4次总共发送以下9个字节:

  +---+----+------+----+  | A | BC | DEFG | HI |  +---+----+------+----+
复制
     那么根据协议,我们可以判断出来,这里包含了3个有效的请求报文,如下:

   +-----+-----+-----+   | ABC | DEF | GHI |   +-----+-----+-----+
复制
在定长协议中:

发送方,必须保证发送报文长度是固定的。如果报文字节长度不能满足条件,如规定长度是1024字节,但是实际需要发送的内容只有900个字节,那么不足的部分可以补充0。因此定长协议可能会浪费带宽。
接收方,每读取到固定长度的内容时,则认为读取到了一个完整的报文。
提示:Netty中提供了FixedLengthFrameDecoder,支持把固定的长度的字节数当做一个完整的消息进行解码

3.2 特殊字符分隔符协议
在包尾部增加回车或者空格符等特殊字符进行分割 。例如,按行解析,遇到字符\n、\r\n的时候,就认为是一个完整的数据包。对于以下二进制字节流:

   +--------------+   | ABC\nDEF\r\n |   +--------------+
复制
那么根据协议,我们可以判断出来,这里包含了2个有效的请求报文

   +-----+-----+   | ABC | DEF |   +-----+-----+
复制
        在特殊字符分隔符协议中:

发送方,需要在发送一个报文时,需要在报文尾部添加特殊分割符号;
接收方,在接收到报文时,需要对特殊分隔符进行检测,直到检测到一个完整的报文时,才能进行处理。
在使用特殊字符分隔符协议的时候,需要注意的是,我们选择的特殊字符,一定不能在消息体中出现,否则可能会出现错误的拆包。例如,发送方希望把”12\r\n34”,当成一个完整的报文,如果是按行拆分,那么就会错误的拆分为2个报文。一种解决策略是,发送方对需要发送的内容预先进行base64编码,由于base64编码只包含64个字符:0-9、a-z、A-Z、+、/,我们可以选择这64个字符之外的特殊字符作为分隔符。

提示:netty中提供了DelimiterBasedFrameDecoder根据特殊字符进行解码。事实上,我们熟悉的的缓存服务器redis,也是通过换行符来区分一个完整的报文。

3.3 变长协议
将消息区分为消息头和消息体,在消息头中,我们使用一个整形数字,例如一个int,来表示消息体的长度。而消息体实际实际要发送的二进制数据字节。以下是一个基本格式:

  header    body+--------+----------+| Length |  Content |+--------+----------+
复制
在变长协议中:

发送方,发送数据之前,需要先获取需要发送内容的二进制字节大小,然后在需要发送的内容前面添加一个整数,表示消息体二进制字节的长度。
接收方,在解析时,先读取内容长度Length,其值为实际消息体内容(Content)占用的字节数,之后必须读取到这么多字节的内容,才认为是一个完整的数据报文。
提示:Netty中提供了LengthFieldPrepender给实际内容Content进行编码添加Length字段,接受方使用LengthFieldBasedFrameDecoder解码。

使用特权

评论回复
zhangdage|  楼主 | 2022-12-9 09:13 | 显示全部楼层
上面这段文字描述了如何粘包, 但看着还是要人为的去做这件事,而不是操作系统自动完成。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则