预计阅读本页时间:-
10.5.2 网络
I/O的另外一个例子是网络,由Berkeley UNIX首创并在Linux中差不多原封不动引入。在Berkeley的设计中,关键概念是套接字(socket)。套接字与邮筒和墙壁上的电话插座是类似的,因为套接字允许用户连接到网络,正如邮筒允许用户连接到邮政系统,墙壁上的电话插座允许用户插入电话并且连接到电话系统。套接字的位置见图10-19。套接字可以被动态创建和销毁。创建一个套接字成功后,系统返回一个文件描述符。创建连接、读数据、写数据、解除连接时要用到这个文件描述符。

每个套接字支持一种特定的网络类型,这在套接字创建时指定。最常用的类型是:
1)可靠的面向连接的字节流。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
2)可靠的面向连接的数据包流。
3)不可靠的数据包传输。
第一种套接字类型允许在不同机器上的两个进程之间建立一个等同于管道的连接。字节从一个端点注入然后按注入的顺序从另外一个端点流出。系统保证所有被传送的字节都能够到达,并且按照发送时的顺序到达。
除保留了数据包之间的分界之外,第二种类型和第一种是相同的。如果发送者调用了5次写操作,每次写了512字节,而接收者要接收2560字节,那么使用第一种类型的套接字,接收者接收一次会立刻接收到所有2560个字节。要是使用第二种类型的套接字,接收者一次只能收到512个字节,而要得到剩下的数据,还需要再进行4次调用。用户可以使用第三种类型的套接字来访问原始网络。这种类型的套接字尤其适用于实时应用和用户想要实现特定错误处理模式的情况。数据包可能会丢失或者被网络重排序。和前两种方式不同,这种方式没有任何保证。第三种方式的优点是有更高的性能,而有时候它比可靠性更加重要(如在传输多媒体时,快速比正确性更有用)。
在创建套接字时,有一个参数指定使用的协议。对于可靠字节流通信来说,使用最广泛的协议是TCP(传输控制协议)。对于不可靠数据包传输来说,UDP(用户数据报协议)是最常用的协议。这两种协议都位于IP(互联网协议)层之上。这些协议都源于美国国防部的ARPANET,现在成为互联网的基础。没有可靠数据包流类型的通用协议。
在一个套接字能够用于网络通信之前,必须有一个地址与它绑定。这个地址可以是几个命名域中的一个。最常用的域为互联网(Internet)命名域,它在V4(第4个版本)中使用32位整数作为其命名端点,在V6中使用128位整数(V5是一个实验系统,从未成为主流)。
一旦套接字在源计算机和目的计算机都建立成功,则两个计算机之间可以建立起一个连接(对于面向连接的通信来说)。一方在本地套接字上使用一个listen系统调用,它创建一个缓冲区并且阻塞,直到数据到来。另一方使用connect系统调用,并且把本地套接字的文件描述符和远程套接字的地址作为参数传递进去。如果远程一方接受了此次调用,则系统在两个套接字之间建立起一个连接。
一旦连接建立成功,它的功能就类似于一个管道。一个进程可以使用本地套接字的文件描述符来从中读写数据。当此连接不再需要时,可以用常用的方式,即通过close系统调用来关闭它。