4.1 Socket模块文件
在长时间的教学工作中,作者发现学生们经常会将Socket当作TCP/IP协议族中的一员,但是又无法在TCP/IP协议层次图中找到这个“协议”,因此会感到困惑。
实际上TCP/IP协议族将网络分成链路层、网络层、传输层和应用层。所熟知的IP、TCP和HTTP分别位于网络层、传输层和应用层。这些层次和协议分别各司其职,各尽其能。而Socket并不是TCP/IP协议族中的协议,而是一个编程接口。有网络程序编写经历的读者,在编程中基本没有写过实现三次握手过程的代码,这是为什么呢?TCP中最为典型的不就是三次握手吗?
不错,TCP的连接需要三次握手,但是这一点在TCP的内部已经实现了,当需要使用TCP的时候,只需要调用这个协议,无须再实现一次。其实TCP/IP和操作系统一样,除了具体实现之外,同时也对外部提供调用的接口,这一点就像Windows操作系统中提供了win32编程接口一样。Socket正是TCP/IP提供的外部接口。
也许有人要问,为什么不自己编程实现这些协议,而是调用别人写好的接口呢?实际上无论是操作系统还是TCP/IP的代码都不是一般的复杂,如果要实现,花费的时间和精力将会是非常惊人的,很可能穷尽一生也是很难完成的,而如果调用这些接口,几行代码就可以实现。
TPC/IP是传输层协议,主要解决数据如何在网络中传输,而Socket是对TCP/IP的封装和应用。TPC/IP是网络中的规则,是不能修改的,而Socket则是给程序员使用的,是可以任意调用的。实际上,编程语言在处理网络时都可以使用到Socket。Socket的英文原义是“孔”或“插座”,通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。网络上的两个程序通过一个双向的通信连接实现数据的交换,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。