2018-2019-1 20165323 《信息安全系统设计基础》第八周学习总结
第11章 网络编程 内容总结
11.1 客户端-服务器编程模型
1.每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个应用是由一个服务器户端提供某种服务。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。
2.客户端-服务器模型中的基本操作是事务。事务由四步组成
(1)当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
(2)服务器收到请求后,解释它,并以适当的方式操作它的资源。
(3)服务器给客户端发送一响应,并等待下一个请求。
(4)客户端收到响应并处理它。
11.2 网络
1.客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
2.对于一个主机而言,网络只是又一种I/O设备,作为数据源和数据接收方,如图所示。一个插到I/O总线扩展槽的适配器提供了到网络的物理接口。从网络上接收到的数据从适配器经过I/O和存储器总线拷贝到存储器,典型地是通过DMA(注:直接存储器存取方式)传送。相似地,数据也能从存储器拷贝到网络。
- 一个以太网段,包括电缆和集线器;每根电缆都有相同的最大位带宽;集线器不加分辩地将一个端口上收到的每个位复制到其他所有的端口上。因此,每台主机都能看到每个位。
- 每个以太网适配器都有—个全球唯一的48位地址,它存储在这个适配器的非易失性存储器上。每个主机适配器都能看到这个帧,但是只有目的主机实际读取它。
- 桥接以太网 由 电缆和网桥 将多个以太网段连接起来,形成的较大的局域网。连接网桥的电缆传输速率可以不同(例:网桥与网桥之间1GB/S, 网桥与集线器之间100MB/S)。
- 网桥作用:连接不同网段。同一网段内A向B传输数据时,帧到达网桥输入端口,网桥将其丢弃,不予转发。A向另一网段内C传输数据时,网桥才将帧拷贝到与相应网段连接的端口上。从而节省了网段的带宽
- 协议软件的基本能力:
命名机制 为每台主机至少分配一个互联网地址,从而消除不同主机地址格式的差异,是每台主机能被识别。
传送机制 不同格式的数据进行封装,使其具有相同的格式。 - 局域网由集线器和网桥及连接的电缆组成。
11.3 全球ip因特网
• 自从20世纪80年代早期以来,客户端-服务器应用的组织就一直保持相当的稳定。下图展示了一个因特网客户端-服务器应用程序的基本硬件和软件组织。每台因特网主机都运行实现TCP/TP协议的软件,几乎每个现代计算机系统都支持这个协议。因特网的客户端和服务器混合使用套接字接口函数和Unix I/O函数来进行通信。套接字函数典型地是作为会陷入内核的系统调用来实现的,并调用各种内核模式的TCP/IP函数。
11.3.1 ip地址
- 一个IP地址就是一个32位无符号整数。
- 因为因特网主机可以有不同的主机字节顺序,TCP/IP为任意整数数据项定义了统一的网络字节顺序(大端字节顺序)例如IP地址,它放在包头中跨过网络被携带。在IP地址结构中存放的地址总是以(大端法)网络字节顺序存放的,即使主机字节顺序是小端法。Unⅸ提供了下面这样的函数在网络和主机字节顺序间实现转换:
11.3.2 因特网域名
- 因特网客户端和服务器互相通信时使用的是IP地址。域名是一串用句点分隔的单词(字母、数字和破折号)。
- 域名集合形成了一个层次结构,每个域名编码了它在这个层次中的位置。通过一个示例你将很容易理解这点。下展示了域名层次结构的一部分。层次结构可以表示为一棵树。树的节点表示城名,反向到根的路径形成了域名。子树称为子域。层次结构中的第一层是个未命名的根节点。下一层是一组一级域名由非赢利组织(因特网分酒名字数字协会)定义。常见的第一层域名包括com、edu、gov、org、net,这些域名是由ICANN的各个授权代理按照先到先服务的基础分配的的。一旦一个组织得到了一个二级域名,那么它就可以在这个子域中创建任何新的域名了。
11.3.3 因特网连接
- 因特网客户端和服务器通过在连接上发送和接收字节流来通信。从连接一对进程的意义上而言,连接是点对点的。从数据可以同时双向流动的角度来说,它是全双工的。并且从由源进程发出的字节流最终被目的进程以它发出的顺序收到它的角度来说,它也是可靠的。
- 一个套接字是连接的一个端点。每个套接字都有相应的套接字地址,是由一个因特网地址和一个16位的整数端口组成的,用“地址:端口”来表示。当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核自动分配的,称为临时端口。然而,服务器套接字地址中的端口通常是某个知名的端口,是和这个服务相对应的。例如,web服务器通常使用端口80,电子邮件服务器使用端口25。
11.4 套接字接口
• 向导图
11.4.1 套接字地址结构
• 从Unix内核的角度来看,一个套接字就是通信的一个端点。
11.4.2 socket函数
-
Socket函数客户端和服务器使用函数来创建一个套接字描述符.
-
其中,AF_INET表明我们正在使用因特网,而SCKET_STREAM表示这个套接字是因特网连接一个端点。Socket返回的clientfd描述符仅是部分打开的,还不能用于读写。如何完成打开套接字的工作,取决于我们是客户端还是服务器。
11.4.3 connect函数
-
客户端通过connect函数来建立和服务器的连接。
-
connect函数试图与套接字地址为serv_addr的服务器建立一个因特网连接,其中addrlen是size of ( sockaddr_in )。Connect函数会阻塞,一直到连接成功建立或是发生错误如果成功,sockfd描述符现在就准备好可以读写了,并且得到的连接是由套接字对刻画的。
11.5.1 web基础
- Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP。
- HTTP是一个简单的协议。一个web客户端(即浏览器)打开一个到服务器的因特网连接。浏览器读取这些内容,并请求某些内容。服务器响应所请求的内容,然后关闭连接。浏览器读取并把它显示在屏幕内
- 主要的区别是Web内容可以用HTML来编写。一个HTML程序(页)包含指令(标记)它们告诉浏览器如何显示这页中的各种文本和图形对象。
11.5.2 web内容
Web服务器以两种不同的方式向客户端提供内容:
- 取一个磁盘文件,并将它的内容返回给客户端。
- 运行一个可执行文件,并将它的输出返回给客户端。
11.6 综合:tiny web服务器
- TINY的main程序
- doit函数
- clienterror函数
- read_requestthdrs函数
- parse_uri函数
- serve_static函数
- serve_dynamic函数