Skip to content
New issue

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

TCP/Unix 套接字绑定的改进 #12

Open
andot opened this issue Jan 12, 2019 · 2 comments
Open

TCP/Unix 套接字绑定的改进 #12

andot opened this issue Jan 12, 2019 · 2 comments

Comments

@andot
Copy link
Member

andot commented Jan 12, 2019

Hprose 2.0 中增加全双工和半双工的 TCP/Unix Socket 绑定实现。

但是因为对于数据长度没有校验,因此如果服务器收到随便乱发的一堆数据,会很容易因为长度问题导致崩溃。

因此,Hprose 3.0 中希望对这种情况做出改善。

首先半双工相对于全双工通讯除了实现简单一些,没有任何优势,因此可以考虑 Hprose 3.0 中不在区分全双工和半双工通讯,统一改为全双工通讯。

其次,原来全双工的通讯的头部有8个字节用来标识数据长度和请求唯一标识,这 8 个字节的意义和格式保持不变,然后在这 8 个字节之前,再加 4 个字节的校验,其值为这 8 个字节的 crc32 值。

然后通过这个校验就可以有效的排除乱发的数据,这样,即使要攻击服务器,也需要精心构造请求格式。

其次在实现上,服务器端可以增加请求长度最大值的限制,超过这个限制的请求,在读取完请求长度的 4 个字节之后,就直接关闭连接就可以了。这属于实现部分要做的事情,在通信协议中不做体现。

剩下的包体部分,可以是任意内容,这样既可以传输 hprose 通讯数据,也可以传输自定义加密、压缩的 hprose 通讯数据,甚至可以传输 jsonrpc 格式的数据,只要有响应的解码器或中间件来解码就可以了。

@andot
Copy link
Member Author

andot commented Feb 4, 2019

Hprose 3.0 中,TCP 包头设计改为:

包头一共 12 个字节,每 4 个字节为一个单位。

开头 4 个字节为其后 8 个字节的 crc32 校验码,其值以 BigEndian 的编码方式的 Int32 表示。

中间 4 个字节为包体长度,其值仍以 BigEndian 的编码方式表示,第一个字节首位总是被设为 1。该位并不是长度的符号位,因为长度总是正整数,该为设置为 1 用于作为辅助校验。

最后 4 个字节表示请求标号,其值以 BigEndian 的编码方式的 Int32 表示,第一个字节首位在请求中总是被设置为 0,也就是只能用正的 Int32 表示。在响应中,如果要返回跟具体序列化编码无关的错误信息,比如请求长度超过最大限制的错误,返回的响应中,请求标号的首位被设置为 1,后面 31 位跟源请求标号相同。

@andot
Copy link
Member Author

andot commented Feb 4, 2019

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 位跟源请求标号相同。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant