C# · 12月 20, 2021

跟我学代码架构设计模式之–协议栈的设计思路

如何理解协议栈?

协议栈简单的说就是对业务数据进行层层封包和层层解包的过程。发送数据的处理过程就像数据流入一个管道进行层层封包过滤,收数据的过程就像数据经过另一个管道进行层层解包过滤,管道中有一层层的过滤器,像堆叠起来的栈~

如何设计协议栈?

其实很简单,单独拿出协议栈中的一层过滤器,只需要考虑以下几点就可以。

发送:

1 考虑本层应该按何种方式接受上层的数据?上层应该传给流包,还是大小可知的包给本层,如果是大小可知的包,包最大应该为多少等,换句话说 本层应该规定本层的数据包的最小分割单位,上层传递本层数据的时候应该按我的要求来分割数据包,即提供给上层何种接口的问题。

2 考虑本层的数据封包格式。即本层应该如何加工数据包,应该添加何种协议头或者协议尾,即本层数据处理的问题。

3 考虑如何将本层的数据包按下一层的格式进行拆分或者合并然后交付给下层,即和下层接口对接的问题。

接收:

1 考虑下层传递给本层的包如何按自己的数据封包格式进行组包

2 考虑如何剥去本层的封包头尾然后传递给上层

协议栈的其他层,也按这种思路设计即可(其实就是递归、递归边界的思想)

协议栈举例

TCP层对上层提供流式包接口,不规定最大的包大小,即提供给上层的API的消息接受参数可以设计为一个缓存区对象。

TCP层对本层数据的处理是添加端口、序号等封包格式。

TCP层的下层是IP层,IP的设计要求是固定的最大65k的封包,所以TCP层应该能够把本层的数据按照最大65k的包长度进行分割和组合,然后调用IP层接口。

IP层从上层接受最大65K的数据包。

IP层对数据包添加源和目的IP等封包格式。

IP层的下层是链路层,假设MTU最大为1500字节,IP层按1500字节分割本层的数据,然后调用链路层发送出去。

接收端IP层收到数据后,把1500字节的包组包成最大65k的包

IP层讲组合的包去掉本层封包头尾后交付给上层

最根本原则:如何发送如何还原~如何拆包如何组

(完)