CERL2 系列6:SDL,面向数据流的网络协议

原创 2010年01月20日 01:37:00

在《CERL2 系列5:SDL与我对网络协议的思考》一文中,尽管我对 SDL 的来龙去脉做了介绍,但是我发现还是遗漏了非常重要的内容。朋友们可能会问,SDL看起来不就是一个普通的IDL(接口描述语言)吗,为什么不直接沿用一个现成的标准呢?

 

很多时候,看似相似的东西却会是貌似神不是。正是因为我觉得IDL并不符合我对网络接口协议的观点,所以才有了 SDL。

 

首先,多数 IDL 都是面向对象的。但是我认为网络协议应该是面向数据流的。为什么在网络协议中,面向对象是坏的呢?

 

原因很简单。面向对象的网络协议必然增加实现的复杂性。由于我们可以在网络流中传递对象,那么自然而然,对象就需要在服务端存在存根(Stub),在客户端存在代理(Proxy)。而特别让人讨厌的,是对象生命周期的管理。这些都给服务端、客户端带来实现难度。如果说加大服务端的复杂度影响不算太大的话,客户端的难度增加,无疑使得协议的跨语言调用变得更加困难。

 

面向数据流的网络协议很直观,消除了一切面向对象带来的负累。我们对在网络中传递的数据有着非常清晰的概念。在简单对协议细节进行了解后,你可以在没有任何基础的情形下,很快做出一个新的语言的客户端调用代码。

 

简单是美。这是面向数据流的网络协议的魅力所在。

 

体现 SDL 简单的另一个层面,是 SDL 的接口描述方式。对于这样一个声明:

 

   [id=2] get(String key) -> {ok, String val} | false;

 

你可以看到, -> 符号之前的是 request 包,-> 之后的是 response 包。这非常直观。你可以对比下这样的一个声明:

 

    [id=2] bool get([in] String key, [out] String* val);

 

两者的阅读体验不是在同一个档次上的。

 

特别是,在 response 的分支情况很多的时候,第二种描述方式就会惨不忍睹。

 

所以,从各种角度讲,SDL 是我认为描述网络协议的接口最佳选择。

 

 

相关文章推荐

linux网络协议栈分析笔记6-IP层的处理2

上章说到ip_rcv_finish最后会有两个选择: 1)ip_local_deliver 2)ip_forward 现在我们看下ip_forward() ->ip_forward() ...

linux网络协议栈(四)链路层 (6)L2隧道(eoip)

4.7、L2隧道(eoip): 隧道,就是走捷径,使转发速度更快,L2隧道就是说高层报文在链路层即被转发了,而无需走高层协议栈再转发,比如这里要说的eoip(Ethernet over ip),就是说...

网络协议系列之二:HTTP(2)

这篇文章继续对HTTP协议进行说明。一个http事务包括客户向HTTP服务器发送请求以及服务器向客户端发送响应两个过程。根据事务的特点,这两个过程具有原子性,任何一个过程失败都会进行回滚(恢复事务之前...

《网络协议》TCP 的成块数据流

在前面的文章中《TCP 的交互数据流》我们可以知道,TCP 的成块数据流是在要求传输效率较高的情况下使用,例如 FTP。对于这些要求传输 TCP 最长报文段的应用,TCP 协议采用了滑动窗口协议,使发...

网络协议之ipv6

ipv6地址

【网络协议】TCP的交互数据流和成块数据流

前言 建立在TCP协议上的应用层协议有很多,如FTP、HTTP、Telnet等,这些协议根据传输数据的多少可以分为两类:交互数据类型和成块数据类型。 交互数据类型,如:Telnet,...

IPv6网络协议的安全疑云

随着互联网的更新,我们迎来了IPv6网络协议的使用,在我们不断赞扬IPv6网络协议的诸多优点后,我们也同样对它的一些漏洞和问题产生了担心。计算机网络协议版本6(IPv6) 并不提高企业的Web安全性,...

NODEMCU调试心得6 - 关于网络协议HTTP

关于网络协议 HTTP按照约定,这次要讲非常exciting的内容,网络协议Networking protocols。这部分并不好写,内容很庞杂,会分成若干部分。网络协议我们在前面已经提及,TCP/I...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CERL2 系列6:SDL,面向数据流的网络协议
举报原因:
原因补充:

(最多只允许输入30个字)