`

揭秘网络通信编程(1)——概述

阅读更多

揭秘网络通信编程(1)——概述

在这个时代,便捷的互联网大大降低了我们获取信息的成本,也深刻地改变了我们的生活方式。每天,有数以亿计的人使用浏览器访问着上百万个网站,使用上百款聊天软件进行着即时通信。那么,在你使用上网和聊天时,有没有想过,你的浏览器是如何与服务器“交流”,得到你想要的网页?你的QQ又是如何跨越几千公里,把消息发到好友的QQ之上的?为了解答这些,我打算从最简单的分析入手,带领大家一步步揭开网络通信的神秘面纱。

一 程序如何通过网络通信?

为了让大家更好地理解通信的实质,我们可以先回想一下我们打电话的场景: 当你想要打电话联系家人时,你会拿出手机,打开通信录,找到某某的电话号码……!回想到此为止,没错,不要惊讶,我们已经找到对了通信的关键问题——如何通过唯一标识表示通信的双方,因为只有通信的双方都能通过唯一的标识寻找到,我们才能确定我们的消息发给的是对方而不是别人,通信才有意义。与打电话的情景类似,计算机程序也要通过彼此之间唯一的标识进行通信。显然,这项工作在同一台机器上是很容易实现的,因为每个进程程序有系统分配的PID作为唯一标识,但对于在网络中的不同两台机器上程序,又如何唯一标识对方呢?

大名鼎鼎的TCP/IP协议族就是用来解决这个问题的。TCP/IP协议中,网络层的“IP地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程)。借由这样一套规则,今天网络上所有机器运行的所有程序,就都可以通过主机的IP+端口号来唯一标识了。而这种基于TCP/IP协议族的通信编程,今天应用最广泛的就是我下面要着重介绍的socket编程了。

socket的起源?

Socket一词英文原意是或者插座,国内的程序员习惯把它译作套接字

最早的socket概念,源自于1970年。当时的互联网还在组建中,全世界都还没有互联网的概念,但是当年的先驱们在当时就已经在思考与网络相关的通信编程的问题了,socket的概念也就此提出:”命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。The elements of the name space are called sockets.  A socket forms one end of a connection, and a connection is fully specified by a pair of sockets)详情请见文献第12页:http://datatracker.ietf.org/doc/rfc33/

不过,公认的socket通信诞生的标志,还是在UNIX系统上的实现。我们知道,UNIX的设计哲学之一就是一切皆文件,无论文件,设备,还是通信端口——即我们今天在讨论的socket,都被抽象为文件,一切都可以用打开open –> 读写write/read –> 关闭close模式来操作。Socket其实就是这一模式的体现,UNIX的工程师把复杂的底层硬件通信与通信协议全部封装,抽象为socket接口,也就是一个文件,通过对这个假想中的文件的读写,我们就实现了机器之间的通信,这就是socket通信的基本思想。

 

三 “一切皆socket!”

之后的几十年间,socket的通信思想随着互联网进一步发展着,并被各种编程语言设计者接受与沿用——不信你可以去看一看,无论是javaC++pythonC#还是最新的Swift,今天几乎所有的语言,通信模块命名一律为socket——没错,今天几乎所有的程序都在使用socket通信!

所以,说今天的网络通信一切皆socket”一点不为过。借由socket,网络通信编程变得相似,开发者之间的交流也变得容易,不同编程语言编写的程序之间的通信也变得更加方便。

 

下一篇博客,我将以javapython两门语言为例,向大家进一步讲解socket通信原理以及展示一下使用不同语言的程序实现的socket通信。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics