11.1 客户端-服务器编程模型
客户端-服务器由4个事务组成,如下图
认识到客户端和服务器是进程,而不是常常提到的机器或者主机,这很重要。
.
11.2 网络
对于一个主机而言,网络只是又一种I/O设备,作为数据源和数据接收方。就想键盘、鼠标等其他I/O一样,作为一个文件进行操作。
图 一个网络主机的硬件组成
LAN:局域网
1、较小的局域网(例如一个楼层),如下图所示,是用连接主机的双绞线和集线器(hub)组成,并称之为:以太网段。
图 以太网段
2、较大的局域网(跨越建筑物或者校区),如下图所示,是由网桥将不同的以太网段组成起来,称之为:桥接以太网。
图 桥接以太网
3、简化,上两幅图我们经常简化如下图,代表一个局域网:
4、WAN:广域网
在更高层次中,多个不兼容的局域网可以通过叫做路由器的特殊工具连接起来,组成一个互联网络.
.
每台路由器对于它所连接到的每个网络都有一个适配器(端口,或者说是网口,类似PC的网络适配器(网卡))。
现在看起来我们打通了所有的主机,利用集线器、网桥、路由器,但是这并不代表主机之间的数据就可以随意串流。为了数据的传达到该到的地方,而且能够完整的传达到。需要很多不同的协议,在本次通信中是使用了TCP协议,当然路由器之间也有更多的协议帮助我们传播数据,如下图所示,对于我们要传播的data,还需要很多一定的加工,符合协议要求才能传送到对的地方。
PH: 互联网络包头
FH1: LAN1帧头
11.3 全球IP因特网
1、 每台因特网主机都运行实现TCP/IP协议的软件。
2、因特网的客户端和服务器混合使用套接字接口函数和Unix I/O函数来进行通信。
3、套接字函数典型的是作为会陷入内核的系统调用来实现的,并调用各种内核模式的TCP/IP函数。
.
IP协议提供基本的命名方法和递送机制。
.
TCP是一个构建在IP之上的复杂协议,提供了进程间可靠的全双工连接。
从程序员的角度,可以把因特网看做一个世界范围的主机集合,它满足以下特性:
1、主机集合被映射成一组32位的IP地址。
2、这组IP地址被映射成一组叫做因特网域名的标识符。
3、因特网主机上的进程能够通过连接和任何其他因特网主机上的进程通信。
11.3.1 IP地址
IP的表达方式
网络字节顺序(大端法)(高–>低)
主机字节顺序(小端法)(低–>低)
在程序中发数据包时,将主机字节顺序—转换—>网络字节顺序,收数据包时网—->主,这是因为基于X86平台的PC机是小端字节序(主)。(注:一些嵌入式平台为大端序)
11.3.2 因特网域名
因特网客户端和服务器互相通信时使用的是IP地址。
因特网定义了域名集合和IP地址集合之间的映射。
客户端和服务器通信时使用的是IP地址,然而对于人们而言大整数是很难记住的,因此因特网也定义了一组更加人性化的域名,以及一种将域名映射到IP地址的机制。
域名是一串用点分隔的单词(字母、数字和破折号),它有自己的层级结构。
除了根节点,第二层是一组一级域名,常见的一级域名有com、edu、gov、org等。
二级域名如mit、berkeley、csdn等。
DNS(Domain Name System, 域名系统)
1、域名集合和IP地址集合之间的映射由分布世界范围内的数据库(DNS,域名系统)来维护。
2、一个域名可以与一个IP地址一一对应;或者多个域名映射到多个IP地址;或者某些合法的域名没有IP地址的映射。
3、每台因特网主机都有本地定义的域名localhost,这个域名是映射为本地回送地址(loopback address)127.0.0.1。
11.3.3 因特网连接
套接字:一种文件形式(一种用来通过网络与其他进程通信的文件)
一个套接字是一个端点。
每个套接字都有对应的套接字地址,它由一个IP地址和一个16位的整数端口组成,用“地址:端口”表示。
当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核自动分配的,称为临时端口。然而,服务器套接字地址中的端口通常是某个知名的端口,是和这个服务相对应的。例如,Web服务器通常使用端口80,Email服务器通常使用端口25。
一个连接是由它两端的套接字地址唯一确定的,这对套接字地址叫做套接字对(socket pair)。由下列元祖来表示:
(cliaddr:cliport,servaddr:servport)
客户端端口号51212是内核分配的临时端口号。
服务器端口号80是和Web服务相关联的知名端口号。