wangchenxicool

博客园 首页 联系 管理

开始学习socket网络编程了,大概已经有几日,在有点感受以记录下来。

socket的历史非常久远,可能追溯到70年代、60年代,当然网络还刚刚起步,berkeley计算机研究组就开始研究如果编写网络程序,如何回调网络应用,从而开发socket的原始版本,socket这个原始版本经过多个厂商与组织发展和扩展最后形成一个有着深厚历史的socket API。这里的深厚二字有许多意义,一方面它是历史的沉积,所以它的功能与作用是经得起验证的,另一方面又因为它的历史,所以它会有许多历史偶然性的东西在作怪,表现为非本质复杂性,因为socket不是被简单地设计出来,它是在实践在产生的。

基本的socket编程接口很诱人,因为我们写一个网络程序只需要几个简单的socket系统调用,然后整体的资源都可以使用了。可能就是简单的几个函数,简单地让人都忘记了,网络编程是最复杂的程序之一。socket-connect-read-write-close构成一个TCP客户端,而在这个客户端上加入bind、listen、accept三个调用就构成了一个TCP服务器程序。那么为什么说网络程序是最难编写的一类程序?

网络程序难以编写有它的本质复杂性在其中,它的本质复杂性就是:网络是非常不稳定的,并且可能随时崩溃。操作系统已经为我们屏蔽大多数这种不稳定性,但操作系统不可能把所有的问题都处理好,而不需要应用的帮助,所以应用不仅仅要关心自己的事,还关心网络,关心网络可能出现的各种情况,为了处理这种复杂的不稳定性,网络应用为此代价惨重。这就是本质复杂性。

socket接口是主流的网络编程接口,它是历史的产物,有着深深的历史烙印,当然也有深深的历史错误。socket中存在一些概念或类型它们的存在从现代的C语言角度来说都是不需要,比如sockaddr结构体类型,它的存在只是为方便传递一个结构指针,但是用户却从来不需要使用这个类型。再就是socket中存在一个地址簇与协议簇的概念,这两个概念看似相似,却看似不相似,原本完全可以没有这个概念的,事实上现在人们都不认为需要这两个概念,但在写程序的时候却要生生地区分它们。

尽管socket给了许多非本质复杂性,但socket仍然不愧为最成功的一类api,试想数十年后的今天我还在使用,这就是充分说明它的成功,历史曾创造了多少奇迹,可是这些奇迹又有多少还在被我们使用?

posted on 2011-09-03 13:58  wangchenxicool  阅读(293)  评论(0编辑  收藏  举报