We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Hprose 2.0 中增加全双工和半双工的 TCP/Unix Socket 绑定实现。
但是因为对于数据长度没有校验,因此如果服务器收到随便乱发的一堆数据,会很容易因为长度问题导致崩溃。
因此,Hprose 3.0 中希望对这种情况做出改善。
首先半双工相对于全双工通讯除了实现简单一些,没有任何优势,因此可以考虑 Hprose 3.0 中不在区分全双工和半双工通讯,统一改为全双工通讯。
其次,原来全双工的通讯的头部有8个字节用来标识数据长度和请求唯一标识,这 8 个字节的意义和格式保持不变,然后在这 8 个字节之前,再加 4 个字节的校验,其值为这 8 个字节的 crc32 值。
然后通过这个校验就可以有效的排除乱发的数据,这样,即使要攻击服务器,也需要精心构造请求格式。
其次在实现上,服务器端可以增加请求长度最大值的限制,超过这个限制的请求,在读取完请求长度的 4 个字节之后,就直接关闭连接就可以了。这属于实现部分要做的事情,在通信协议中不做体现。
剩下的包体部分,可以是任意内容,这样既可以传输 hprose 通讯数据,也可以传输自定义加密、压缩的 hprose 通讯数据,甚至可以传输 jsonrpc 格式的数据,只要有响应的解码器或中间件来解码就可以了。
The text was updated successfully, but these errors were encountered:
Hprose 3.0 中,TCP 包头设计改为:
包头一共 12 个字节,每 4 个字节为一个单位。
开头 4 个字节为其后 8 个字节的 crc32 校验码,其值以 BigEndian 的编码方式的 Int32 表示。
中间 4 个字节为包体长度,其值仍以 BigEndian 的编码方式表示,第一个字节首位总是被设为 1。该位并不是长度的符号位,因为长度总是正整数,该为设置为 1 用于作为辅助校验。
1
最后 4 个字节表示请求标号,其值以 BigEndian 的编码方式的 Int32 表示,第一个字节首位在请求中总是被设置为 0,也就是只能用正的 Int32 表示。在响应中,如果要返回跟具体序列化编码无关的错误信息,比如请求长度超过最大限制的错误,返回的响应中,请求标号的首位被设置为 1,后面 31 位跟源请求标号相同。
0
Sorry, something went wrong.
Hprose 3.0 中,增加 UDP 绑定支持。其请求大小被限制在一个 UDP 包中,一个 UDP 下的 Hprose 请求和响应不能超过 UDP 包本身的大小限制。一个 UDP 包最大载荷为 65507 字节。Hprose 本身还要为请求和响应添加 8 个字节的头:
开头 4 个字节为其后 4 个字节的 crc32 校验码,其值以 BigEndian 的编码方式的 Int32 表示。
中间 2 个字节为包体长度,包体长度最大值为 65507 - 8 = 65499。其值以 BigEndian 的编码方式的 UInt16 表示。
最后 2 个字节为请求标号,其值以 BigEndian 的编码方式的 Int16 表示,第一个字节首位在请求中总是被设置为 0,也就是只能用正的 Int16 表示。在响应中,如果要返回跟具体序列化编码无关的错误信息,比如请求长度超过最大限制的错误,返回的响应中,请求标号的首位被设置为 1,后面 15 位跟源请求标号相同。
No branches or pull requests
Hprose 2.0 中增加全双工和半双工的 TCP/Unix Socket 绑定实现。
但是因为对于数据长度没有校验,因此如果服务器收到随便乱发的一堆数据,会很容易因为长度问题导致崩溃。
因此,Hprose 3.0 中希望对这种情况做出改善。
首先半双工相对于全双工通讯除了实现简单一些,没有任何优势,因此可以考虑 Hprose 3.0 中不在区分全双工和半双工通讯,统一改为全双工通讯。
其次,原来全双工的通讯的头部有8个字节用来标识数据长度和请求唯一标识,这 8 个字节的意义和格式保持不变,然后在这 8 个字节之前,再加 4 个字节的校验,其值为这 8 个字节的 crc32 值。
然后通过这个校验就可以有效的排除乱发的数据,这样,即使要攻击服务器,也需要精心构造请求格式。
其次在实现上,服务器端可以增加请求长度最大值的限制,超过这个限制的请求,在读取完请求长度的 4 个字节之后,就直接关闭连接就可以了。这属于实现部分要做的事情,在通信协议中不做体现。
剩下的包体部分,可以是任意内容,这样既可以传输 hprose 通讯数据,也可以传输自定义加密、压缩的 hprose 通讯数据,甚至可以传输 jsonrpc 格式的数据,只要有响应的解码器或中间件来解码就可以了。
The text was updated successfully, but these errors were encountered: