HTTP协议
HTTP协议简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。属于应用层协议。
TCP/IP协议简单说明
TCP/IP协议是互联网的关键技术,两台计算机之间的通信是通过TCP/IP协议在因特网上进行的。它包括
TCP : Transmission Control Protocol (传输控制协议)
IP: Internet Protocol (网际协议)
IP协议负责因特网上计算机之间的通信
IP计算机在因特网上的唯一地址标识。
IP协议是计算机用来相互识别的通信的一种机制,负责在因特网上发送和接收数据包。通过 IP协议,消息(数据)被分割为小的独立的IP包,将每个包发送至它的目标计算机。IP协议功能仅仅在因特网上识别计算机相互发送消息,但它并保证消息的完整性,以及是否以发送的次序送到目标计算机应用程序。正因为有以上问题,所有在IP协议之上设计了TCP传输控制协议。
TCP协议负责因特网上进程之间的通信
TCP协议主要做一下工作
- 校验数据包是否以正确的次序到达。
- 校验数据包的内容没有修改。
- 确定数据包端口号,将数据包发送给监听端口的应用程序(服务/守护进程)
服务/守护进程:在提供服务的计算机上,有程序监听特定port(端口)上的通信流。例如电子邮件服务监听25端口,用于www的HTTP服务器监听80端口。
当一个进程希望通过 TCP 与另一个进程通信时,它会发送一个通信请求。通过ip找到因特网上的目标计算机。然后双方进行“握手”验证,之后TCP会在两个应用程序之间建立一个全双工 (full-duplex) 通信的通道,然后就可以发送数据包了。
TCP 用于从应用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达目标机后将它们重组。
TCP/IP 就是TCP 和 IP 两个协议在一起协同工作,有上下层次的关系。
TCP协议 负责进程(应用程序)和进程之间的通信。IP 协议负责计算机和计算机之间的通信。TCP 负责将数据分割并装入 IP 包,IP 负责将包发送至目标机,传输过程要经IP路由器由ARP协议正确地寻址,到达目标机重新组合数据包。
ip地址计算机在因特网上的唯一标识。port(端口号)计算机上应用程序对外提供服务的唯一标识。两者结合标识了因特网上的唯一进程(服务)。
TCP/IP参考模型
HTTP协议位于TCP协议的上层属于应用层协议。
HTTP 工作原理
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。是一个标准的客户端服务器模型(B/S)。HTTP协议永远都是客户端发起请求,服务器处理返回响应。
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
HTTP三点注意事项:
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP工作过程
一次HTTP操作称为一个事务,其工作整个过程如下:
- 地址解析,DNS解析:浏览器查询DNS缓存(浏览器缓存->系统缓存->路由器缓存->IPS缓存->根域名服务器缓存->顶级域名服务器缓存),获取URL所对应的IP地址
如用客户端浏览器请求这个页面:http://www.baidu.com:80/index.php
从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
协议名:http
主机名:www.baidu.com
端口:80
对象路径:/index.php
- 封装HTTP请求数据包
把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
- 封装成TCP包,建立TCP连接
在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行高层协议的连接,因此,首先要建立TCP连接(TCP的三次握手)。
- 客户机发送请求命令
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息等内容。(请求头,参数体)
- 服务器响应
服务器接到请求后,处理完毕后返回响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息。(响应头和实体消息)
实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type
应答头信息所描述的格式发送用户所请求的实际数据
- 服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求,保持连接节省了为每个请求建立新连接所需的资源开销,还节约了网络带宽。如果长时间没消息发送超时通道关闭。
TCP/IP网络模型中各层数据流
客户端发起请求,各层协议对的包装数据过程
客户端发起请求,服务端响应过程
- 客户机会将请求封装成http数据包–>封装成Tcp数据包–>封装成Ip数据包—>封装成数据帧—>硬件将帧数据转换成bit流(二进制数据)–>最后通过网卡发送到目标计算机。
- 服务器网卡首先收到bit流,通过以太网驱动程序解析成ip数据包。于是通过IP协议解析IP数据包,然后又发现里面是TCP数据包,就通过TCP协议解析TCP数据包,接着发现是HTTP数据包通过HTTP协议再解析HTTP数据包得到数据。
HTTP的消息结构
HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。
- 一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。
- 一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,
- 请求行:请求方法 地址 协议/版本
GET /index.php HTTP/1.1 - 请求头(Request Header)
Accept text/html,application/xhtml+xm…plication/xml;q=0.9,/;q=0.8
Accept-Encoding gzip, deflate, br
Accept-Language zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection keep-alive
Cookie BAIDUID=563BC9D4BC1DE53CE9643C…pgv_si=s7640095744; BDSVRTM=0
Host www.baidu.com
Referer https://offlintab.firefoxchina.cn/
Upgrade-Insecure-Requests 1
User-Agent Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/70.0 - 空行
请求头部和请求数据之间空白行 - 请求数据
username=aa&password=1234
请求头参数 | 含义 |
---|---|
请求方法 | GET、PUT、POST、DELETE、OPTIONS、HEAD、TRACE |
Host | 接受请求的服务器地址,可以是ip:port ,也可以是域名 |
Connection | 连接类型,通常是close或keep-alive |
User-Agent | 用来让服务器来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。 |
Accept | 用来告知服务器,当前客户端可以处理的内容类型 |
Accept-Encoding | 通知服务端可以发送的数据压缩格式 |
Accept-Language | 通知服务端可以发送的语言 |
服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
响应头 | 含义 |
---|---|
状态码 | 200代表请求成功。状态码格式:1xx、2xx、3xx、4xx、5xx |
Connection | 连接类型,通常是close或keep-alive |
Content-Encoding | 响应正文使用的数据压缩格式 |
Content-Type | 响应类型,常见的有:text/html、text/css、image/jpeg、image/png、application/json等 |
Content-Length | 响应正文长度 |
无状态协议
HTTP协议是无状态的(stateless
)。也就是说,同一个客户端第二次访问同一个服务器上的页面时,服务器响应与第一次被访问时相同(如果服务器尚未更新该页面),因为服务器并不知道这个客户端是否访问过自己,也不知道访问过几次。HTTP无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
这样做虽然简化了服务器的设计,但在实际工作中,一些站点却常常希望能够识别用户。例如网上购物,一个顾客要购买多种物品。当他把选好的物品加入购物车后,又要去浏览其他商品。因此网站需要识别该用户,使该用户后续选购的商品能够加入同一个“购物车”,这样便于集中结账。要做到这点,可以使用Cookie
来跟踪用户。用于HTTP服务器和客户端之间传递状态信息。其工作原理如下:
- 客户端访问支持
Cookie
的网站,提交用户名,密码等能验证身份的信息 - 服务器在响应头中回复
Set-Cookie
字段,为了保证安全,一般Set-Cookie
的值是要做加密处理的。 - 客户端收到以后以文本文件的形式保存在客户端(浏览器),以后的请求都会在请求头中带上
Cookie
字段 - 服务器识别身份,作出响应
总之Cookie
是服务器根据用户提交的身份信息,生成唯一的识别码,并且以文本文件的形式存储在客户端的。
服务器为了维护用户状态,还用到了另一种机制:Session
(会话)。Session
对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web
页之间跳转时,存储在 Session
对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web
页时,如果该用户还没有会话,则 Web
服务器将自动创建一个 Session
对象。当会话过期或被放弃后,服务器将终止该会话。Session
的实现方式主要有两种:
-
使用Cookie来实现
服务器根据用户提交的身份验证信息,生成一个session id
,然后以Set-Cookie
的形式返回给客户端,客户端每次请求都带上session id
,服务器就可以识别用户身份,维护会话状态。 -
使用URL回写,是指浏览器发送给客户端的所有URL后面,加上JSESSIONID这个参数,如果不加则无法验证用户身份。
两种方式都离不开
JSESSIONID
(不同语境下这个参数名不同,Java
叫JSESSIONID
,PHP
叫PHPSESSIONID
…),一种是放在请求头中传递,一种是以参数形式传递。由于Cookie
属于浏览器实现,Session
由服务器维护,所以常说Cookie
存在浏览器,Session
存在服务端。
HTTP 请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
重点介绍 GET、POST 和 HEAD 三个方法:
-
GET
GET 方法用于获取由 Request-URI 所标识的资源的信息,常见的形式是:
GET Request-URI HTTP/1.1
GET方法是默认的HTTP请求方法,例如当我们通过在浏览器的地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是 GET 方法向服务器获取资源。
我们可以使用GET方法来提交表单数据,用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如: Http://localhost/login.php?username=aa&password=1234
从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。这是因为浏览器对url的长度有限制
各种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)
IE : 2803
Firefox:65536
Chrome:8182
Safari:80000
Opera:190000 -
POST
POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。 在请求头信息结束之后的两个回车换行之后(实际是空一行),就是表单提交的数据。如上面提到的post表单数据: username=aa&password=1234
POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。
从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。
GET与POST方法有以下区别:
- 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放在HTTP包的body中。
- GET方式提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST则没有此限制。
- 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
- 服务器取值方式不一样。GET方式取值,如php可以使用
$_GET
来取得变量的值,而POST方式通过$_POST
来获取变量的值。
- HEAD
HEAD 方法与 GET 方法几乎是相同的,它们的区别在于 HEAD 方法只是请求消息报头,而不是完整的内容。对于 HEAD 请求的回应部分来说,它的 HTTP 头部中包含的信息与通过 GET 请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到 Request-URI 所标识的资源的信息。这个方法通常被用于测试超链接的有效性,是否可以访问,以及最近是否更新。
请求头详解
每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
HTTP最常见的请求头如下:
Transport 头域
Connection:
作用:表示是否需要持久连接。
如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;
例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的 网页,会继续使用这一条已经建立的连接
例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。
eg:http://localhost/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:localhost
此处使用缺省端口号80,若指定了端口号8080,则变成:Host:localhost:8080
Client 头域
Accept:
作用:浏览器可以接受的媒体类型(MIME类型),
例如: Accept: text/html
代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档, 如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。
通配符 * 代表任意类型。例如 Accept: */*
代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
Accept-Encoding:
作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
例如: Accept-Encoding: gzip, deflate
。Server能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 许多情形下这可以减少5到10倍的下载时间,也节省带宽。
Accept-Language:
作用: 浏览器申明自己接收的语言。
语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;
例如: Accept-Language:zh-cn
。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
User-Agent:
作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上, 服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Accept-Charset:
作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);
例如:Accept-Charset:iso-8859-1,gb2312.
如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Cookie/Login 头域
Cookie:
作用: 最重要的header, 将cookie的值发送给HTTP 服务器
Entity头域
Content-Length:
作用:发送给HTTP服务器数据的长度。即请求消息正文的长度;
例如: Content-Length: 38
Content-Type:
作用:
例如:Content-Type: application/x-www-form-urlencoded
Miscellaneous 头域
Referer:
作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里, 他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问 他的网站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Cache 头域
If-Modified-Since:
作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。
If-None-Match:
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
例如: If-None-Match: "03f2b33c0bfcc1:0
Pragma:
作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样
Pargma只有一个用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache
, 没有实现Cache-Control
Cache-Control:
作用: 这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下
Cache-Control:Public
可以被任何缓存所缓存
Cache-Control:Private
内容只缓存到私有缓存中
Cache-Control:no-cache
所有内容都不会被缓存
HTTP状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。
下面是常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
常见状态代码 - 200 OK //客户端请求成功
- 201 Created 已创建。成功请求并创建了新的资源
- 301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
- 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
- 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 一般用于登录
- 403 Forbidden //服务器收到请求,但是拒绝提供服务,一般是服务器路径没有权限或者是其他权限相关问题
- 404 Not Found //请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error //服务器发生不可预期的错误:一般来说,这个问题都会在服务器端的源代码出现错误时出现,比如出现死循环。
- 502 Bad Gateway//作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。比如LNMP ,php-fpm没有启动就会报502错误。
- 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常,比如java 容器部署war的时候,就出现503,或者是nginx处理的文件没有权限。
- 504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应,比如nginx和php-fpm, php设置sleep(200),就会收到504 Gateway Time-out。注意:某些代理服务器在DNS查询超时时会返回400或者500错误
HTTP 响应头信息
Cache头域
Date:
作用:生成消息的具体时间和日期,即当前的GMT时间。
例如: Date: Sun, 17 Mar 2013 08:12:54 GMT
Expires:
作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。
例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT
Vary:
作用:
例如: Vary: Accept-Encoding
Cookie/Login 头域
P3P:
作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie
作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Entity实体头域:
实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。
ETag:
作用: 和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
例如: ETag: "03f2b33c0bfcc1:0"
Last-Modified:
作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Content-Type:
作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Length:
指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。
例如:Content-Length: 19847
Content-Encoding:
作用:文档的编码(Encode)方法。一般是压缩方式。
WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
例如:Content-Encoding:gzip
Content-Language:
作用: WEB服务器告诉浏览器自己响应的对象的语言者
例如: Content-Language:da
Miscellaneous 头域
Server:
作用:指明HTTP服务器的软件信息
例如:Apache/2.2.8 (Win32) PHP/7.0
X-Powered-By:
作用:表示网站是用什么技术开发的
例如: X-Powered-By: PHP/7.0
Transport头域
Connection:
例如:Connection: keep-alive
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
例如: Connection: close
代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Location头域
Location:
作用: 用于重定向一个新的位置, 包含新的URL地址
实例请看304状态实例
HTTP协议是无状态的和Connection: keep-alive
的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
浏览器缓存
浏览器缓存:包括页面html缓存和图片js,css等资源的缓存。如下图,浏览器缓存是基于把页面信息保存到用户本地电脑硬盘里。
- 缓存的优点:
- 服务器响应更快:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让服务器看上去响应更快。
- 减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。
- 缓存工作原理
页面缓存状态是由http header决定的,一个浏览器请求信息,一个是服务器响应信息。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。
从图中我们可以看到原理主要分三步:
- 第一次请求:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向服务器请求,此时服务器记录第一次请求的Last-Modified/Etag
- 再次请求:当浏览器再次请求的时候,请求头附带Expires,Cache-Control,If-Modified-Since/Etag向服务器请求
- 服务器根据第一次记录的Last-Modified/Etag和再次请求的If-Modified-Since/Etag做对比,判断是否需要更新,服务器通过这两个头判断本地资源未发生变化,客 户端不需要重新下载,返回304响应。