理解计算机系统_网络编程(6)_web服务器
前言
以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定
引入
接续上一篇理解计算机系统_网络编程(5)_echo客户端和服务器-CSDN博客,前面是个网络程序,如其名echo(回响),客户端发什么内容给服务器端,服务器就返回什么给客户端.我们可以这样总结:"套接字+Unix I/O函数=网络基本传输(字节/文本行)".他的功能很简单,文本行传输,应用场景有限但也曾被使用过---上世纪末的时候网络上曾经流行过一种叫MUD的游戏,.
显然人是不满足于通过网络只能发文字的,他还想看图片,看视频,玩游戏,办公,需要程序员开发出能满足这些需求的APP,在这样的背景下,推出了Web.Web可以看作是一个封装了套接字的网络框架.程序员基于Web开发出满足人们需要的APP.当然还可以在Web基础上开发其他框架和库.Web在硬件软件中的图示如下(对照本书P646图11-8):
所以,软件开发是由需求驱动, 为满足用户目的而生.
Web基础
HTTP协议
本书P665原话:Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP(超文本传输协议).HTTP是一个简单的协议.一个Web客户端(即浏览器)打开一个到服务器的因特网连接,并且请求某些内容.服务器响应所请求的内容,然后关闭连接.浏览器读取这些内容,并把它显示在屏幕上.
---解读:基于文本的协议.前面的套接字是实现了文本的传输,所以http被看作是封装的套接字
http工作内容和"事务"相同:请求连接,响应连接;请求数据,响应请求;关闭连接.
浏览器读取内容显示在屏幕上,说明http源码有控制硬件的权限,可能调用了OpenGL等
HTML语言
Web服务和常规文件检索服务有什么区别呢?主要的区别是Web内容可以用一种叫做HTML的语言来编写.他们告诉浏览器如何显示这页中的各种文本和图形对象.---黑体字是原话
---解读:什么语言都不重要,最后都被编译成汇编代码,成为机器指令.笔者有个简单的视角:C语言是一切高级语言之父,其他语言都看作是对C语言的封装
然而,HTML真正的强大之处在于一个页面可以包含指针(超链接),这些指针可以指向存放在任何因特网主机上的内容.如果用户单击了这个高亮文本对象,浏览器就会从CMU服务器中请求相应的HTML文件并显示他---黑体字是原话
---解读:这点十分重要.超链接→请求文件.文件和超链接相联系,就可以用文件的读写来操作了.
Web内容
MIME类型
对于Web客户端和服务器而言,内容是与一个MIME(多用途的网际邮件扩充协议)类型相关的字节序列
---解读:和前面对HTML语言解读一样,基于web的MIME类型,看作是C/C++的struct结构问题也不大.就表中第一个类型text/html来说,笔者前面帖子分析过,他实际上是一个矩阵图形类对象数据类设计_图片类设计之7_矩阵图形类设计更新_实战之页面简单设计(前端架构)_数据矩阵视图界面设计-CSDN博客
静态内容和动态内容
Web服务器以两种不同形式向客户端提供内容:一个磁盘文件(静态内容),运行一个可执行文件,将他的输出返回给客户端(动态内容).
每条由Web服务器返回的内容都是和他管理的某个文件相关联的.这些文件中的每一个都有一个唯一的名字,叫做URL(通用资源定位符) ---黑体字是原话.
---解读:还是熟悉的内容:文件.Web服务器要么向客户端返回一个磁盘文件,要么调用一个可执行文件,返回内容给客户端.分别称为静态内容和动态内容.磁盘文件和可执行文件称为URL.
URL举例
静态文件html
客户端在浏览器中输入"http://域名:80/index.html",表示他想和某个域名的80端口建立套接字连接,并请求index.html的文件.端口号是可选的,默认为知名的HTTP端口80.
---解读:套接字连接的建立,是客户端IP地址+端口号及服务器IP地址(域名)+端口号的配对.
动态文件cgi-bin
客户端输入"http://域名:端口号/cgi-bin/adder?15000&23".这里用?字符分隔文件名和参数,每个参数用&字符隔开.
注意:服务器具体怎么配置并没有举例,笔者做了一些假设:服务器每个端口号对应一个主页文件.每个端口号下面有html目录和cgi-bin两个目录.如果使用某个Web框架,他会封装这部分内容.
=============================内容分割线↓===================================
服务器配置可以作为一个补充的知识点
=============================内容分割线↑===================================
HTTP事务
回忆:一个互联网连接事务包括:请求连接,连接响应;请求数据,数据响应.HTTP事务也是一个互联网连接事务,属于封装的一个互联网事务.经过封装,操作上会比较简单,也有特定的内容.他包括了HTTP请求和HTTP响应.
HTTP事务(下图)解析:第1,第5和第6行由程序员输入,其他行是反馈内容.
---解读:这部分内容写得很多,会用的话,把三行指令背下来就行了.
第1行:从Linux shell运行TELNET,要求他打开一个到AOL Web服务器的连接.域名+端口号
第5行:一个HTTP请求
第6行:Host报头(在HTTP1.0中不需要)
服务器返回HTTP响应(第8~17行),然后关闭连接(第18行)
HTTP请求
组成:一个请求行(第5行),请求报头(第6行)
请求行格式:method URI version
方法中有多种,广为应用的GET方法,如图中使用的情形.
GET / HTTP/1.1 /*表示请求静态内容---默认主页(/),以HTTP/1.1的标准*/
=============================内容分割线↓===================================
HTTP支持的方法有许多:GET,POST,OPTIONS,HEAD,PUT,DELETE和TRACE.可以作为一个补充的知识点
=============================内容分割线↑===================================
HTTP/1.1
对于HTTP1.0来说他是一种新标准, 本书主要提到了两点:持久连接和代理缓存.
1>持久连接
他支持一种机制,允许客户端和服务器在同一条持久连接上执行多个事务.---黑体字是原话
---解读:前面的套接字连接,一次数据请求后关闭文件描述符,下次需要请求数据需要重复这个过程:请求连接→响应连接→请求数据→响应数据,中间可能陷入阻塞(排队);持久连接理解为一次数据请求完毕后还可以继续请求数据而不需重新连接.直到某种情形或者某个api被调用后连接关闭.(笔者不保证)
2>代理缓存
Host报头中的数据指示了原始服务器的域名,使得代理链中的代理能够判断他是否可以在本地缓存中拥有一个被请求内容的副本.---黑体字是原话
---解读:这个是HTTP1.1自带的内容,记住这样用就行了,当然深入源码能理解更好.
HTTP响应
上图中第8~18行,意思很好看懂. 状态码(图中是200)如下图
服务动态内容
服务器动态内容的提供,有4个问题要解决.
1.客户端如何将程序参数传递给服务器?
2.服务器如何将参数传递给他所创建的子进程?
3.服务器如何将子进程生成内容所需要的其他信息传递给子进程?
4.子进程将他的输出发送到哪里?
---解读:问题总结起来有两个:参数如何传递,结果如何返回.
一个称为CGI(通用网关接口)的实际标准的出现解决了这些问题.
---解读:CGI和TCP/IP标准一样,由系统内核提供支持.如果不是系统内核支持,则是Web支持.
1.客户端如何传参数给服务器
GET请求的参数在URI中传递.如前所述:"?"分隔文件名和参数,"&"分隔参数.参数中不能有空格,如果一定要有,必须用字符串"%20"表示.其他字符有相似编码
注意:POST请求参数在请求主体中而不是URI中传递. -----因为没讲POST,所以用的时候再查
2/3.服务器如何将参数传递给子进程 /服务器如何将子进程所需要的信息传递给子进程
CGI脚本
像adder这样的程序,常常被称为CGI程序,因为他们遵守CGI标准的规则.而且,因为许多CGI程序是用Perl脚本编写的,所以CGI程序也常被称为CGI脚本.---黑体字是原话
---解读:虽然书中说用CGI是用Perl脚本编写的,但是笔者惊喜发现后面是C语言写的.这意味着不会Perl也没关系,用C语言一样可以写.
环境变量
参数传给子进程,用的是环境变量.个人理解,环境变量是操作系统支持的全局变量.程序运行在系统中,所以环境变量是可以直接使用的,就像程序中声明的全局变量一样
=============================内容分割线↓===================================
对于环境变量的解读,笔者找了篇帖子Linux:进程概念(四.main函数的参数、环境变量及其相关操作)_linux main-CSDN博客,有兴趣的可以看看.
=============================内容分割线↑===================================
.在调用execve之前,子进程将CGI环境变量QUERY_STRING设置为"15000&213",adder程序在运行时可以用Linux的getenv函数来引用他. ---黑体字是原话
4.子程序的输出
一个CGI程序将他的动态内容发送到标准输出.他使用dup2函数将标准输出重定向到客户端相关联的已连接描述符. ---黑体字是原话
---解读:dup2函数不知道在哪里调用的,但是结论有:发送到标准输出,则直接到达客户端.
小结
Web服务器的部分内容,如何完成一个事务的流程.
Web有很多值得思考的地方,本书内容只是做了个简单的梳理,更多的知识需要熟悉http协议.