分层协议一般都提供一种或几种固定的服务,这些服务中高层一些的大多数都是通过“握手”动作来协商的,另外一些比较底层的服务则是协议本身提供的,比如udp服务,ip服务等。下层的握手过程对上层不可见,握手其实就是协商一条带有一定功能(可以提供一定服务)的虚拟链路,握手完成之后,下层也就承诺了那种服务,之后服务的实现完全在本层完成。可是基于消息协议一般不这么做,没有握手之类的固定过程,因为基于消息的协议所完成的功能各不一致,因此也就难以抽象出共同点来完成固定的握手协商。
对于分层协议来说,下层为上层提供服务,比如tcp的序列号机制就是为上层提供的数据包按序服务,上层协议可以完全信任tcp传过来的数据一定是按序的,再比如ssl为上层提供安全加密服务,最终的应用可以相信ssl提供上来的数据都是安全的,不管是按序服务还是安全服务,都是两端协商出来的结果,而协商的过程就是我们熟悉的握手过程。层间服务的控制数据大多数都在协议头当中。
对于基于消息的平坦模型的协议,并不分层,没有谁能提供承诺的透明的服务,应用可以认为下面就是物理线路了,因此必须自己维护状态机,也就是说得到一条消息后根据消息体的内容来自行控制下一步的做法,注意不是协议头,而是消息体,基于消息的协议的协议头的重要性没有分层协议的协议头的重要性大。协议头几乎都是格式固定的,对于灵活多变的应用消息来说,固定化的控制并不可取,正确的做法应该是定义符合ASN.1标准的消息体,应用在解析消息的同时,见机行事,见什么消息做什么事,这样比较好。
网络协议设计的一点思考
最新推荐文章于 2024-06-28 11:07:03 发布