11.1 客户端-服务器编程模型
每个网络应用都是基于客户端-服务器模型的。一个应用是由一个服务器进程和一个或者多个客户端进程组成。客户端和服务器是运行在主机上(同一主机或不同主机)的进程。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。
11.2 网络
对主机而言,网络只是一种I/O设备,插到I/O总线扩展槽的适配器提供了到网络的物理接口。从网络上接收到的数据从适配器经过I/O和内存总线复制到内存,通常是通过DMA传送。相似的,数据也能从内存复制到网络。
物理上而言,网络是一个按照地理远近组成的层次系统。
- 最低层:以太网段(Ethernet segment)包活一些主机,由电缆相连到集线器。
- 通常在一个房间或一个楼层中
- 每个以太网适配器都有一个唯一的48位地址(MAC地址)E.g., 00:16:ea:e3:54:e6
- 主机可以发送帧(frame)到这个网段内的任何其他主机。集线器不加分辨地将一个端口收到的每个位复制到其他所有的端口上,因此每个主机都能看到这个帧,但只有目的主机实际读取它。
- 注:集线器是过时的概念,现在的网桥/交换机/路由器已经足够便宜来替代它了
- 桥接以太网(Bridged Ethernet Segment):通过网桥(bridge)/交换机(switch)将多个以太网段连接成较大的局域网。
- 跨越整个建筑物或者校区
- 能够自动学习哪个主机可以通过哪个端口可达,有选择地将帧从一个端口复制到另一个端口
- 互联网络(internet):多个不兼容的局域网可以通过叫做路由器(router)的特殊计算机连接起来。
互联网络至关重要的特性是,它能由采用完全不同和不兼容技术的各种局域网和广域网组成。如何跨过这些不兼容的网络发送数据?解决方法是一层运行在每个主机和路由器上的协议软件。
- 命名机制:协议通过定义一种一致的主机格式来消除差异,唯一地标识每台主机。
- 传送机制:协议定义了一种标准传送单元:包(packet)。包括包头和有效载荷。
11.3 全球IP因特网
每台因特网主机都运行实现TCP/IP协议的软件。客户端和服务器混合使用套接字接口函数和Unix I/O函数来进行通信。通常将套接字函数实现为系统调用,这些系统调用会陷入内核,并调用各种内核模式的TCP/IP函数。
TCP/IP是一个协议族,包括例如IP协议提供基本的命名方法和递送机制,从一台主机往其他主机发送包,但它是不可靠的,包在网络中丢失或者重复,它并不会试图恢复。UDP稍微扩展了IP协议,包可以在进程间传送而不是在主机间传送。TCP提供可靠的全双工连接。
11.3.1 IP地址
一个IP地址就是一个32位的无符号整数,存放在如图所示的IP地址结构中。
- 在IP地址机构中存放的地址总是以大端法网络字节顺序存放的
- 通常用点分十进制来表示。0x8002c2f2 = 128.2.194.242
- 用
getadrrinfo和getnameinfo函数来进行ip地址和点分十进制之间的转换
11.3.2 域名
域名和IP地址的映射是通过分布世界范围内的数据库,称为DNS来维护的。
> nslookup whleshark.ics.cs.cmu.edu查找域名对应的ip地址
> hostname确定本地主机的实际域名
11.3.3 连接
- 点对点、全双工、可靠的
- 一个套接字是连接的一个端点,套接字地址为(IP地址:端口号)。一个连接是由它两端的套接字地址唯一确定的。
- 临时端口:当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核随机分配的
- 知名端口:服务器套接字地址中的端口通常是某个知名端口,是和这个服务相对应的。例如,web服务器使用80端口,电子邮件服务器使用25端口。知名名字和端口的映射保存在文件/etc/services中