1.5 什么是套接字

socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样。使用socket可以将应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之亦然。

不同类型的socket与不同类型的底层协议族以及同一协议族中的不同协议栈相关联,本书只涵盖了TCP/IP协议族的内容。现在TCP/IP协议族中的主要socket类型为流套接字(stream socket)和数据报套接字(datagram socket)。流套接字将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务。一个TCP/IP流套接字代表了TCP连接的一端。数据报套接字使用UDP协议(底层同样使用IP协议),提供了一个“尽力而为”(best-effort)的数据报服务,应用程序可以通过它发送最长65 500字节的个人信息。当然,其他协议族也支持流套接字和数据报套接字,但本书只对TCP流套接字和UDP数据报套接字进行讨论。一个TCP/IP套接字由一个互联网地址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定。随着进一步学习,你将了解到把一个套接字绑定到一个互联网地址上的多种方法。

图1-2描述了一个主机中,应用程序、套接字抽象层、协议、端口号之间的逻辑关系。值得注意的是一个套接字抽象层可以被多个应用程序引用。每个使用了特定套接字的程序都可以通过那个套接字进行通信。前面已提到,每个端口都标识了一台主机上的一个应用程序。实际上,一个端口确定了一台主机上的一个套接字。从图1-2中我们可以看到,主机中的多个程序可以同时访问同一个套接字。在实际应用中,访问相同套接字的不同程序通常都属于同一个应用(例如,Web服务程序的多个副本),但从理论上讲,它们是可以属于不同应用的。

figure_0018_0003

图 1-2 套接字、协议、端口