解读《深入理解计算机系统 (CSAPP)》第 11 章网络编程
前言:📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫 🏆 Java 领域新星创作者、阿里云专家博主、华为云享专家🏆🔥 如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦
本文导读
所有网络应用都基于相同的编程模型,有相似的整体结构,依赖相同的编程接口。我们需要理解基本的客户端-服务器编程模型,以及如何编写网络程序。
重点解读
一、客户端-服务器编程模型
每个网络应用都是基于客户端-服务器编程模型,一个应用是由一个服务器进程和一或多个客户端进程组成,服务器管理资源,并通过操作这种资源来为他的客户端提供某种服务(web 服务器管理一组磁盘文件,它会代表客户端进行检索和执行)。
客户端-服务器编程模型中的基本操作都是事务(transaction),由以下四部分组成:(1)当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务;(2)服务器收到请求后,解释它并以适当的方式操作它的资源;(3)服务器给客户端一个响应,等待下一个请求;(4)客户端收到响应并处理。
二、网络
客户端和服务器通常运行在不同主机,通过计算机网络的硬件和软件资源来通信。对主机而言网络只是一种 IO 设备,是数据源和数据接收方,一个插到 IO 总线扩展槽的适配器提供了网络的物理接口。从网络上接收到的数据从适配器经过 IO 总线复制到内存,通常通过 DMA 传送,同时数据也能从内存复制到网。
下图展示了 主机和路由器如何使用互联网协议在不兼容的局域网间传送数据的一个示例:(1)主机 A 的客户端进行一个系统端用,从客户端的虚拟地址空间复制数据到内核缓冲区中(2)主机 A 上的协议软件通过在数据前附加互联网网络包头和 LAN 帧头,创建一个 LAN 的帧。互联网包头寻址到主机 B。LAN 帧头寻址到路由器,然后传送此帧到适配器。(3)LAV1 适配器复制该帧到网络上(4)当次帧打到路由器时,路由器的 LAN 适配器从电缆上读取它,并把它传送到协议软件(5)路由器从互联网包头中提取出目的互联网络地址,并用它作为路由表的索引,确定向哪里转发这个包(6)路由器 LAN 适配器复制该帧到网络(7)当此帧达到主机 B 时,它的适配器从电缆上读取次帧,并传送到协议软件(8)最后主机 B 上的协议软件剥落包头和帧头。当服务器读取这些数据的系统调用时,协议软件最终将得到的数据复制到服务器的虚拟地址空间
三、全球 IP 因特网
每台主机都运行 TCP/IP 协议(Transmission Control Protocol / Internet Protocol,传输控制协议/互联网网络协议)。客户端和服务器混合使用套接字接口函数(Socket)进行通信。SOCKET 典型的作为会陷入内核的系统调用实现。
IP 协议提供基本的命名方法和传送机制;从某种意义上来说是不可靠的,因为,如果丢失或者重复,并不会试图恢复。UDP 扩展 IP 协议,包可以在进程间而不是主机间进行传输。TCP 提供了进程之间可靠地全双工的连接。
IP 地址,一个 IP 地址就是一个 32 位无符号整数,TCP/IP 网络字节顺序(network byte order 大端字节顺序)。主机一般都是小端法,IP 地址通过点分十进制表示。
因特网域名,因特网定义了域名集合和 IP 地址集合之间的映射,这是通过 DNS(Domain Name System,域名系统)来维护的。每个主机条目都是一个域名和 IP 地址的等价类。本地回送地址:127.0.0.1.它为运行在同一台机器上的客户端和服务器提供了一种便利和可移植的方式,可以用来调试。域名和 IP 地址的映射基本是一对一的,但是也有多对一和一对多 的。
因特网连接是点对点的。一个套接字是链接的一个端点,每个套接字都有相应的套接字地址,用"地址:端口"表示。临时端口:客户端发起请求时,内核自动分配;知名端口:服务器套接字端口。一个连接由它两端的套接字地址唯一确定;这一对地址叫做套接字对(socket pair)(cliaddr:cliport,servadde:servport)例如((238.2.194.242:8080),(208.216.181.15:8081))
四、socket interface(套接字接口)
socket :的作用是创建一个套接字描述符:connect :制定地址和端口的服务器建立连接 bind :将套接字描述符和服务器套接字地址联系起来(即和自己的 IP 等信息)listen:服务器调用告诉内核,这是一个主动套接字并使用主动连接描述符(被服务器使用)。accept:返回给客户端一个已连接描述符,使用已连接描述符客户端可以和服务器端进行通信。
五、Web 服务器
Web 客户端(浏览器)和服务器之间的交互使用 HTTP 协议。HTTP 是一个简单的协议:一个 Web 库换段打开一个到服务器的因特网连接,并且请求某些内容。服务器响应请求内容,关闭连接,浏览器读取内容,并且显示在屏幕上。
HTTP 请求,首先要连接服务器和客户端。格式:method URI version,method 一般为 GET,URI 为 URL 端口后面的部分,version 为 HTTP 版本,一般为 HTTP/1.0 或 HTTP\1.1HTTP 响应的常见状态码
传递动态内容,?分割文件名和参数,每个参数用 & 隔开,举例: GET /adder?1500&user=213 HTTP/1.1
小结
1、每个网络应用都是基于客户端-服务器模型的。2、根据这个模型一个应用是由一个服务器和一个或多个客户端组成的、服务器管理资源,以某种方式操作资源,为它的客户端提供服务。客户端-服务器模型中的基本操作是客户端-服务器事务,它是由客户端请求和跟随其后的服务器响应组成的。
3、客户端和服务器通过因特网这个全球网络来通信。从程序员的观点来看,我们可以把因特网看成是一个全球范围的主机集合,具有以下几个属性:1)每个因特网主机都有一个唯一的 32 位名字,称为它的 IP 地址。 2)IP 地址的集合被映射为一个因特网域名的集合。3)不同因特网主机上的进程能够通过连接互相通信。4、客户端和服务器通过使用套接字接口建立连接。一个套接字是连接的一个端点,连接以文件描述符的形式提供给应用程序。5、套接字接口提供了打开和关闭套接字描述符的函数。客户端和服务器通过读写这些描述符来实现彼此间的通信。
6、Web 服务器使用 HTTP 协议和它们的客户端(例如浏览器)彼此通信。浏览器向服务器请求静态或者动态的内容。7、对静态内容的请求是通过从服务器磁盘取得文件并把它返回给客户端来服务的。对动态内容的请求是通过在服务器上一个子进程的上下文中运行一个程序并将它的输出返回给客户端来服务的。8、CGI 标准提供了一组规则,来管理客户端如何将程序参数传递给服务器,服务器如何将这些参数以及其他信息传递给子进程,以及子进程如何将它的输出发送回客户端。
版权声明: 本文为 InfoQ 作者【小明Java问道之路】的原创文章。
原文链接:【http://xie.infoq.cn/article/a8340124ad26118622dfa0330】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论 (1 条评论)