CSAPP(第三版)第十一章网络编程学习笔记
客户端-服务器编程模型
一个客户端-服务器事务由以下四步组成:
- 当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
- 服务器收到请求后,解释它,并以适当的方式操作它的资源。
- 服务器给客户端发送一个响应,并等待下一个请求。
- 客户端收到响应并处理它。
网络
客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
互联网至关重要的特性是,他能由采用完全不同的不兼容技术的各种局域网和广域网组成。每台主机和其他每台主机都是物理相连的,但是如何能够让某台源主题跨过所有这些不兼容的网络发送数据位到另一台目的主机呢?
解决办法是一层运行在每台主机和路由器上的协议软件,它消除了不同网络之间的差异。这个软件实现一种协议,这种协议控制主机和路由器如何协同工作来实现数据传输。这种协议必须提供两种基本能力:
- 命名机制。
- 传送机制。
全球IP因特网
我们可以把因特网看作一个世界范围的主机集合,满足以下特性:
- 主机集合被映射为一组32位的IP地址。
- 这组IP地址被映射位一组成为因特网域名的标识符。
- 因特网主机上的进程能够通过链接和任何其他因特网主机上的进程通信。
IP地址
一个IP地址就是一个32位无符号整数。
因特网域名
因特网客户端和服务器互相通信时使用的是IP地址,然而不好记忆,所以因特网定义了更加人性化的域名,以及一种将域名映射到IP地址的机制。
因特网连接
因特网客户端和服务器通过在连接上发送和接受字节来通信。
套接字接口
套接字接口是一组函数,它们和Unix I/O 函数结合起来,用以创建网络应用。
套接字地址结构
从Linux内核的角度来看,一个套接字就是通信的一个端点。
socket函数
客户端和服务器使用socket函数老创建一个套接字描述符。
connect函数
客服端通过调用connect函数来建立和服务器的连接。
bind函数
剩下的套接字函数-bind,listen和accept,服务器用他们来和客户端建立连接。
listen函数
客户端是发起连接请求的主动实体,服务器是等待来自客户端的连接请求的被动实体。
listen函数将sockfd从一个主动套接字转化为一个监听套接字,该套接字可以接受来自客户端的连接请求。
accept函数
服务器通过调用accept函数来等待来自客户端的连接请求
主机和服务的转换
1.getaddrinfo函数
getaddrinfo函数将主机名,主机地址,服务名和端口号的字符串表示转化成套接字地址结构。
2.gentnameinfo函数
这个和上面的函数是相反的,将一个套接字地址结构转换成相应的主机和服务名字符串。
套接字接口的辅助函数
1.open_clientfd函数
open_clientfd函数建立与服务器的连接,改服务器运行在主机hostname上,并在端口号port上监听连接请求。
2.open_listenfd函数
调用open_listenfd函数,服务器创建一个监听描述符,准备好接收连接请求。
Web服务器
web基础
Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP。
Web内容
对于Web客户端和服务器而言,内容是一个MIME类型相关的字节序列。
Web服务器以两种不同的方式向客户端提供内容:
- 取一个磁盘,并将它的内容返回给客户端。磁盘文件称为静态内容,而返回给客户端的过程称为服务静态内容
- 运行一个可执行文件,并将它的输出返回给客户端。
HTTP事务
1.HTTP请求:
去一个HTTP请求的组成:一个请求行,后面跟随零个或者更多个请求报头,再跟随一个空的文本行来终止报头列表。
2.HTTP响应
一个HTTP响应的组成:
一个响应行,后面跟随零个或者更多的响应报头,再跟随一个响应主体。
服务器动态内容
1.客户端如何将程序参数传递给服务器
2.服务器如何将参数传递给子进程
3.服务器如何将其他信息传递给子进程
4.子进程将他的输出发到哪里