一.概述
1.web应用的核心是http协议(HyperText Transfer Protocol),http协议的由两部分组成,客户端程序和服务器端程序,通过交换http报文进行会话。web页面则是由对象(也叫资源)组成的,对象直白的说就是一个个的文件,而这些对象可以通过URL引用,URL由两部分组成,存放对象的主机名和对象的文件路径,而这些对象都存储在web服务器之上。http协议以tcp作为他的支撑,一旦建立连接,用户的浏览器进程就能通过套接字接口访问TCP服务,这意味着客户端咩发出一个http请求都能完整的到达服务器,而http是一个无状态协议,因为服务器向客户端发送数据时并不存储任何有关客户端的状态信息,即使客户端在很短时间内对同一个资源做出请求,服务器端也会发送两次该资源,就像之前什么也没发生一样。
2.持久连接与非持久连接
当客户端与服务器端进行长时间的通信时,客户端会发出一系列的请求,服务器端要这些请求一一进行响应,而http协议基于tcp协议建立连接,于是对这一系列的请求和响应可以每次经过一个单独的tcp连接发送,也可以都经过同一个tcp连接进行发送;每次都经过不同的tcp进行发送的方式就叫做非持久连接,每次都经过同一个tcp连接发送的方式叫做持久连接。
假设我们请求一个包含10个资源的web页面,这里所说是http的基本形态,并不包括cookie,session等机制。
(1)对于非持久连接,整个过程是:
1.http客户端向服务器发起一个tcp连接,完成tcp的三次握手,建立连接 |
2.http客户端向服务器端发送一个http请求报文 |
3.http服务器端接受报文,经过在web服务器中进行资源检索,构建http响应报文,并发送给客户端 |
4.http服务器端断开tcp连接,但是要等到客户端确认已经完整的接受响应报文 |
5.http客户端接受响应报文,关闭tcp连接,从而完成一次http会话。 |
注意:每个tcp连接只只传输一个一个请求报文和一个响应报文,因此要请求10个资源需要建立10个tcp连接。
(2)对于持久连接,整个过程是:
1.http客户端向服务器发起一个tcp连接,完成tcp的三次握手,建立连接 |
2.http客户端向服务器端发送一个http请求报文 |
3.http服务器端接受报文,经过在web服务器中进行资源检索,构建http响应报文,并发送给客户端 |
4.http服务器端断开tcp连接,但是要等到客户端确认已经完整的接受响应报文 |
5.http客户端接受响应报文,关闭tcp连接,从而完成一次http会话。 |
所不同的是:必须为每个会话维护同一个连接,客户端和服务器端都要分配TCP的缓冲区,对于短时间之内的资源的发送,可以一个接一个的发出,在单个tcp连接上进行,http默认使用流水线的方式持久连接。
3.web缓存
web缓存服务器也叫代理服务器,他能代表初始web服务器来满足http请求的资源,web缓存服务器有自己的存储空间,存储着最近请求过的web资源的拷贝,当有web缓存服务器之后,当客户端通过浏览器请求资源以后,整个过程为:
1.浏览器与缓存服务器建立tcp连接,并向缓存服务器发送一个http请求 |
2.web缓存服务器检查本地是否存储了该资源的拷贝,如果有则直接响应 |
3.如果缓存服务器里没有该资源,则该服务器向后端初始服务器建立tcp连接,并帮助客户端去请求该资源 |
4.当缓存服务器接受到来自初始服务器的资源以后,现在本地缓存一份,然后构建响应报文给客户端 |
我们看到,这个过程中,缓存服务器即是客户端又是服务器,web缓存能从整体上降低网络中的web流量,加快对客户端请求的响应速度。
二.http报文
http报文分为请求报文和响应报文
1.http的请求报文
报文中各个字段分别为:
(1)方法:指明客户端对web资源的操作,常用的方法有
GET:从服务器获取资源 |
HEAD:从服务器获取文档的响应首部 |
POST:提交数据给服务器 |
PUT:将报文中主体部分指定的资源存储在服务器中 |
DELETE:删除服务器中的资源 |
TRACE:跟踪请求到达初始服务器经经过的代理服务器 |
OPTIONS:请求服务器返回对指定资源支持的使用方法 |
(2).URL:指明所要获取资源的位置
(3)版本:http的第一个版本是http/0.9,然后是http/1.0,http/1.1,直到今天的http/2.0
(4)首部:分为通用首部,请求首部,响应首部,实体首部,扩展首部,其格式为: Name Value
通用首部:
Date:报文创建的时间 |
Connection:连接状态 |
Via:显示报文经过的中间节点 |
Cache-Control:缓存控制信息 |
Pragma:编译控制信息 |
Upgrade:用于检测HTTP协议及其他协议是否可以使用更高版本进行通信 |
Warning:告知用户一些与缓存相关问题的警告 |
实体首部:
Allow:列出对此实体使用的请求方法 |
Location:客户端正真的实体所处的位置 |
Content-Encoding:内容的编码格式 |
Content-Language:内容所能接受的语言 |
Conntent-length:主体的长度 |
Content-Location:服务器端真正的主体所处的位置 |
Content-Type:主体对象的类型 |
缓存相关的标记 ETag:实体扩展标签 Expires:缓存的过期时间 Last-Modified:缓存最后一次修改的时间 |
Content-MD5:加密了的字符串,用于检验传输过程中首部信息的完整性 |
请求首部:
Accept:告诉务器用户代理可处理的媒体类型及媒体类型的优先级 |
Accept-Charset告诉服务器用户代理支持的字符集及字符集的优先级,可一次性指定多个字符集 |
Accept-Encoding:告诉服务器用户代理支持的内容编码及内容编码优先级顺序,可一次性指定多种内容编码 |
Accept-Language:告诉服务器用户代理能够处理的自然语言集,以及其相对有限集,可一次指定多种自然语言集 |
Client-IP:指明客户端自己的地址 |
Host:告诉服务器请求的资源所处的互联网主机名和端口号 |
Referer:告诉服务器原始链接的URI |
User-Agent:指明用户代理的信息 |
Max-Forwards:发送包含该字段的请求时,该字段以十进制整数形式指定可经过的服务器最大数目 |
条件式请求首部 Except:告诉服务器期望出现的行为 If-Modified-Since:指明自从指定时间开始资源是否方式改变 If-Unmodified-Since:指明自从指定时间开始资源是否没有发生改变 If-None-Match:本地缓存中存储的ETag是否与服务器文档的ETag不匹配 If-Match:服务器收到请求,只有判定条件为真时,才会执行请求 If-Range:告诉服务器若指定的值和请求资源的值一致,则作为范围请求处理,反之,则返回全部资源 |
安全请求首部 Authorization:向服务器发送认证信息,包括帐号和密码 Cookie:客户端向服务器端发送的cookie信息 Cookie2:cookie2是cookie的升级版 |
代理请求首部:Proxy-Authorization:向代理服务器发送认证信息 |
2.http的响应报文
(1)版本:http/1.1 ,http/2.0等根据使用的版本
(2)状态码:
1xx:提示类信息 |
2xx:成功响应客户端所请求资源的信息,200成功响应 |
3xx:资源被重定向的信息; 301:所请求的资源被删除,但是通过响应报文的location指明新位置 302:与301类似,通过响应报文的location指明资源现在所处的临时位置 304:客户端发出条件式请求,但在服务器中未曾发送改变 |
4xx:客户端错误信息 401:需要用户输入帐号和密码认证才能访问的资源,显示为Unauthorized 403:客户端所请求的资源被禁止,显示为Forbidden 404:服务器无法找到客户端所请求的资源,显示为Not Found |
5xx:服务器端错误信息 500:服务器端内部错误,显示为Internal Server Error 502:代理服务器从后端服务器收到一条伪响应,显示为Bad Gateway |
(3)响应首部
信息类 Age:响应持续的时长 Server:服务器软件的名称和版本 |
协商首部: Accept-Ranges:服务器可以接受的请求范围类型 Vary:服务器查看的其他首部列表 |
安全响应首部 Set-Cookie:向客户端发送cookie信息 Set-Cookie2:向客户端发送cooki2信息 www-Authenticate:对客户端的质询认证列表 |
原创文章,作者:zhangbao,如若转载,请注明出处:http://www.178linux.com/57120