互联网上被当做请求对象的内容,通常称为web资源(web resource)。
web资源是web内容的主要组成部分,最简单的资源就是一个超文本文档(html),还可以是一个纯文本文件,一般都是静态的超文本文件。但是基于MIME机制以后,那些本身不会发生变化的所有文件,也可以称为静态文件。
web资源:
静态文件:.jpg,.gif,.html,.txt,.js,.css,.mp3,.avi
动态文件:.php,.jsp
MIME:multipurpose internet mail extension
早期为了smtp协议设计的,邮件传输时仅能传输文本信息,后来为了发送附件等非文本格式的数据,只能将附件等编码成文本格式传送,对方打开就是一段乱码文本。 MIME机制能够实现将非文本数据编码成文本,对方还能够通过反向操作机制还原回来
web资源是有类型的,像.jpg等都称为媒体,媒体是有类型的
媒体类型(MIME类型):major/minor
text/html //文本类型中的超文本文档
text/plain //纯文本文档
image/jpeg
image/gif
打开一个网页,网页就是一个资源,网页中很可能会通过超链接的方式链接至多个其他资源。
那么,互联网中如何去标记每一个资源,如何能够知道每个资源在什么地方,而且能够引用它?
这就需要靠URL,URL是URI的一个子集。
URI:Uniform Resource Identifier,统一资源标识符,用来标识互联网上每一个可被引用的资源,不光是web资源,任何资源都可以使用URI的格式表示
URI有两种规范:
URN:Uniform Resource Naming,统一资源命名服务
URL:Uniform Resource Locator,统一资源定位符,是资源标识符的最常用形式,用来描述某服务器某特定资源的位置
URL的基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
scheme:url方案
比如:http://,https://
<user>:<password> : 用户名密码
<host>:<port> : 服务器地址
<path>: 资源路径
<params>: 参数
比如:http://www.ckh.com/bbs/hello;gender=f
<query>:查询条件
比如:http://www.ckh.com/bbs/item.php?username=tom&title=ab
<frag>: 片段
# ....
http:hyper text transfer protocol,超文本传输协议
http协议是一个应用层协议,它监听在80/tcp,所以它使用流式数据协议来完成数据交换,http协议的主要目的是实现跨主机发送文档。
http协议版本:
HTTP/0.9:第一个被广泛采用的版本,称为原型版本,这个协议有很多严重的设计缺陷,仅能够实现简单的资源交互,不支持多媒体内容
HTTP/1.0:第一个真正被广泛使用的版本,引入了MIME机制
HTTP/1.1:增强了缓存功能
spdy:谷歌研发的协议,为了加速http协议的资源获取性能而专门设计的
HTTP/2.0:参考spdy协议的优势,引入整合以后的版本,谷歌现在也放弃spdy的支持,转而支持HTTP/2.0
httpd协议是无状态的(stateless), 服务器无法持续追踪访问者来源, 但可以基于cookie、session机制来追踪客户端的行为
cookie:当用户第一次访问站点时,服务器会发送一个随机数据,这个随机数据是唯一的,对当前服务器来说,可以唯一的标识客户端的身份信息。
发送完以后,客户端浏览器进程接收下来,会将其保存在本地磁盘的某一段存储空间中,保存的信息就叫cookie.
每一个cookie还有其作用范围,访问A服务器A服务器发送的cookie,访问B服务器有B服务器发送的cookie。
为了让服务器能够识别客户端,客户端再第二次及以后访问同一个站点时,会把适用于这个站点的cookie信息提交给服务器端,服务器端就能追踪识别客户端了。
cookie是有风险的,所以对于敏感数据,浏览器关闭时,会自动清除cookie信息
session:服务器为每一个客户端浏览器进程专门维护了一个微小数据结构,它记录了用户在当前服务器上的访问行为。
session是关联至某个cookie上的,所以服务器端用一个内存空间,保存了此前用户浏览网站时的操作行为。用户第一次访问时,会发一个cookie给服务器,
服务器会在用户第二次访问时,根据cookie中的标识查找关联至本地某个session上,从而知道当前用户做了什么操作。
http事务:一次请求和一次响应的过程
请求:request
响应:response
请求是由请求报文来进行,响应是由响应报文来构建的响应进行。
请求报文有其特定格式,响应报文也有其特定格式。
报文语法格式:
request报文:
<method> <request-URL> <version>
<headers>
换行两次
<entity-body>
response报文:
<version> <status> <reason-phrase>
<headers>
换行两次
<entity-body>
method:请求方法,标明客户端希望服务器对资源执行的动作
GET: 从服务器获取一个资源
HEAD: 只从服务器获取文档的响应首部
POST:向服务器发送要处理的数据,请求表单
PUT: 将请求的主体部分存储在服务器上,上传资源
DELETE: 请求删除服务器上指定的文档
TRACE: 追踪请求到达服务器中间经过的代理服务器
OPTIONS: 请求服务器返回对指定资源支持使用的请求方法
version:http协议的版本
HTTP/<major>.<minor>
status:status code,状态码
1XX: 100-101,信息提示
2XX: 200-206,成功类信息
3XX:300-305,重定向,提示需进一步提供补充类信息的状态码
4XX:400-415,客户端错误
5XX:500-505,服务器端错误
常用的状态码:
200:成功,请求的所有数据通过响应报文的entity-body部分发送,对应的原因短语:OK
301: 请求的url指向的资源已经被删除;但在响应报文中通过首部location指明了资源现在所处的新位置,永久重定向,原因短语:Moved Permanently
302:与301相似,但在响应报文中通过location指明了资源现在所处的临时的新位置,将来可能还会回来,原因短语:Found
304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此状态码通知客户端,not modify
401:需要输入账号和密码认证方能访问资源:unauthorized
403: 请求被禁止,forbidden
404:服务器无法找到客户端请求的资源,not found
500: 服务器内部错误: internal server error
502: 代理服务器从后端服务器收到了一条伪响应,bad gateway
reason-phrase:原因短语
状态码所标记的状态的简要描述
headers:首部,用来标记请求或响应的属性
每个请求或响应报文可包含任意个首部:每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值
格式:
Name: Value
首部分类:
通用首部
请求首部
响应首部
实体首部
扩展首部
通用首部:
Date: 报文的创建时间
Connection: 连接方式,如keep-alive,close
Via: 显示报文经过的中间节点
Cache-control:控制缓存的生效机制
Pragma:为了兼容http/1.0,有时还会有这个选项,用来控制缓存的
请求首部:
accept: 通知服务器自己能够接受的媒体类型,也就是MIME类型
accept-charset: 通知服务器接受的字符集
accept-encoding: 通知服务器接受哪些种编码格式,如gzip
accept-language: 通知服务器接受的语言
client-IP:客户端IP
Host: 请求的服务器名称和端口号
Referer: 包含当前正在请求的资源的上一级资源
User-Agent: 客户端代理
条件式请求首部
Expect:期望发什么信息
If-modify-since: 自从指定的时间之后,请求的资源是否发生修改过
If-unmodified-since: 自从指定的时间之后,请求的资源是否没有修改过
If-none-match: 本地缓存中存储的文档的etag标签是否与服务器端的文档的etag不匹配
If-match:本地缓存中存储的文档的扩展标签etag是否与服务器端的文档的etag匹配
安全请求首部:
authorization: 向服务器发送认证信息,如账号和密码
cookie: 客户端向服务器端发送cookie
cookie2:cookie的第二个版本
代理请求首部:
proxy-authorization:向代理服务器认证
响应首部:
信息性首部:
Age: 响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-ranges: 服务器可接受的请求范围类型
Vary: 服务器查看的其他首部列表
安全响应首部
Set-cookie: 向客户端设置cookie
Set-cookie2:向客户端设置第二版的cookie信息
WWW-Authenticate: 来自服务器对客户端的认证质询表单
实体首部:
Allow: 列出对此实体可使用的请求方法
Location: 告诉客户端真正的实体位于何处,重定向时使用
Content-Encoding:内容的编码格式
Content-Language:内容的语言
Content-Length: 主体的长度
Content-Location: 实体真正所处位置
Content-Type: 主体的对象类型
缓存相关
ETag: 实体的扩展标签
Expires: 实体的过期时间
Last-Modified: 最后一次修改的时间
entity-body:实体部分,请求时附加的数据或响应时附加的数据
一次完整的http请求过程:
1.建立或处理连接(客户端请求到达时,由于http协议是基于tcp进行连接的,所以二者之间要事先建立一个能够完成数据通信的连接,也就是接收请求或不期望接收客户端请求就关闭连接)
2.接收请求(从网络中读取到的客户端发送的http请求报文是什么)
接收来自于网络的请求报文中对某资源的一次请求的过程
并发访问响应模型(Web I/O)
单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
多进程I/O结构:并行启动多个进程,每个进程响应一个请求
复用I/O结构:一个进程响应N个请求
多线程模型:一个进程生成N个线程,每个线程响应一个用户请求
事件驱动:event-driven
复用的多进程I/O结构:启动多个(m)进程,每个进程响应N个请求
3.处理请求(对请求报文进行解析,了解客户端请求的是什么资源,主要是看客户端基于什么方法请求哪个资源)
一般是根据请求报文的首部来判定请求资源
请求报文当中首行通常是由特定格式组成:
请求报文中有很多元数据:请求报文首部
比如:<method><URL><VERSION>
Host:www.ckh.com //请求的主机名称
Connection: //这次连接用什么方式
4.访问资源(获取请求报文请求的资源,资源一般都是在硬盘上存放)
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
比如:/var/www/html/imgages/1.jpg,那么URL中请求资源:http://www.ckh.com/images/1.jpg
web服务器资源路径映射方式:
a.通过docroot定义,直接进行映射
b.路径别名映射
c.虚拟主机docroot映射
d.用户家目录的docroot映射
5.构建响应报文(访问到的资源拿来以后,打包封装成http的响应报文)
根据资源类型构建响应报文
MIME类型:
显示分类:直接在服务器上定义好资源的类型是什么
魔法分类:有些服务器能够自行扫描资源内容并判定类型
协商分类:服务器端和客户端协商一下哪种类型
URL重定向:
web服务构建的响应并非客户端请求的资源,而是资源另一个访问路径
6.发送响应报文
7.记录日志
http服务器程序:
常见的有:httpd(apache)
nginx
lighttpd
应用程序服务器:上面三种只能解析静态内容,应用程序服务器即能解析静态内容,又能解析动态内容
IIS
tomcat,jetty,jboss,resin
webshpere,weblogic,oc4j
应用程序服务器占据的市场份额查看:www.netcraft.com
协议查看或分析的工具:
tcpdump, tshark, wireshark