1. MIME
MIME多用途互联网邮件扩展
作用
:将非文本数据在传输前重新编码为文本格式,接受方能够用相反的编码方法将其重新还原为原来的格式,还能够调用相应的程序来打开此文件
如:在web服务中,http协议也会用到此项技术,在传输前先协商为什么格式的编码,然后进行传输方便传输后文件识别。
2. HTTP协议首部
http协议首部就像信封的选项,方便进行发信和回信
2.1 请求报文语法
<method> <request-URL> <version> #起始行
<header> #首部
#必须要有此空行
<entity-body> #相应主体
2.1.1 header结构
http协议的玩法的精髓就在header首部
,一切技能都在header首部展现的淋漓尽致。header的构成类似字典的形式,关键字:值
,首部信息可以有很多,所有http协议的功能都包含在header中。
举例抓包如下:
GET / HTTP/1.1 #起始行
Host: www.b.com #host字段
Connection: keep-alive #头部表示保持连接
Upgrade-Insecure-Requests: 1 #可支持ssl协议
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36 #浏览器信息
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 #mime类型
Accept-Encoding: gzip, deflate #可支持压缩
Accept-Language: zh-CN,zh;q=0.9 #可支持编码
2.1.2 虚拟主机
由上可知一个http请求如下,但是基于域名的虚拟主机如何实现呢?根据请求协议可知:host字段时一个域名对应一个目录,request-RUL又是一个路径,因此二合一就可以确定一个精确的URL。
<method> <request-URL> <version>
<header>
<entity-body>
举例如下:
[root@localhost ~]#telnet 172.16.102.100 80
Trying 172.16.102.100...
Connected to 172.16.102.100.
Escape character is '^]'.
GET /b.txt HTTP/1.1
Host:www.b.com
HTTP/1.1 200 OK
Date: Fri, 01 Jun 2018 21:59:42 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Fri, 01 Jun 2018 09:06:28 GMT
ETag: "c-56d90e6340040"
Accept-Ranges: bytes
Content-Length: 12
Content-Type: text/plain; charset=UTF-8
hello b.txt
2.2 相应报文语法
<version> <status> <reason-phrase> #reason-phrase是描述信息 起始行
<header> #首部
#必须要有此空行
<entity-body > #相应主体
2.2.1 status
状态码
1xx:纯信息
2xx:”成功”类信息
3xx:重定向类的信息
301 表示永久重定向
302 表示临时重定向
304 表示缓存资源相应4xx 客户端错误类信息
404 表示访问的错误资源,即服务器没有对应的资源5xx 服务器端错误类的信息
3. web服务器
3.1 服务器主要操作
1.建立连接 —–》tcp三次握手建立连接
2. 接受请求 —–》通过网络读取http请求报文
3. 处理请求—–》通过请求报文利用读函数进行读取请求内容
4. 访问资源—-》根据读取请求报文进行访问对于资源,读取到内存
5. 构建相应报文—–》根据请求内容和服务器配置信息进行构建相应报文
6. 发送相应—–》向客户端发送相应报文
7. 记录日志—–》完成日志的记录
3.2 服务器IO模型
根据服务器IO模型,能够指导程序员友好编程的思路,运维人员更深刻理解优化应用。
3.2.1 多线程轮询模型——apache的worker模型
在此种模型中,多进程可以同时工作,每进程又可以生产一个主线程和多个子线程,每个子线程进行相应http请求,对于相应完成后对线程资源的释放是通过for循环定期的检查每个线程,完成请求则释放线程资源
3.2.2 事件驱动模型——apache的event模型
事件驱动模型相当于对线程设置flag=FALSE,当线程完成相应请求时,flag=TRUE,此时需要两种方式进行检测线程的状态,一种为for循环检测flag为TRUE的线程,若为TRUE则释放此线程的资源,另外一种方式为一旦线程为TRUE,则通知主线程,请求主线程释放此线程的资源。
3.3 CGI工作原理
都知道web服务器只能处理静态页面,动态页面只能通过对于的解释器才能解释为对应的内容,再次通过web服务器构建相应报文发送给客户端。