一、HTTP协议
1、简介
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件,查询结果等)的应用层协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。这就是你为什么在浏览器中看到的网页地址都是以http://开头的原因。
2、协议工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是HTTP请求/响应的步骤:
1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
3、WEB客户端与WEB服务器之间的通信
WEB内容都是存储在WEB服务器上。WEB服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。客户端向服务器发送HTTP请求,服务器会在HTTP响应中返回请求的数据,HTTP客户端和HTTP服务器共同构成了万维网的基本组件。
例如,浏览器输入URL后按回车的详细流程:
- 浏览器先通过DNS服务器对URL域名进行解析,得到域名对应的服务器IP。
- 向服务器发起三次握手,三次握手成功,客户端与服务器建立TCP连接。
- 浏览器向服务器发送HTTP请求,服务器响应HTTP请求,通过URL路径搜索对应资源。
- 如果搜索成功,就将资源打包放在HTTP响应中返回给浏览器。
- 浏览器解析数据,通过浏览器显示给用户。
4、报文
- 客户端与服务器之间的信息传递使用的载体叫作报文,报文分为请求报文与响应报文两部分。
- 客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头和请求体。
- 服务器反馈给客户端一个响应报文,响应报文包含协议的版本、成功或失败的响应码、服务器信息、响应头和响应体。
5、HTTP请求(request)
5.1、请求报文
请求报文.png请求报文的结构分为3部分:
- 请求行(request line)
- 请求头部(header)
- 请求数据(body)
5.2、请求方法
HTTP1.0定义了三种请求方法:GET、POST、HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT方法。
5.3、URL(统一资源定位符)
URL(Uniform Resource Locator),中文叫统一资源定位符。是用来标识某一处资源的地址,它可以明确说明如何从一个精确、固定的位置获取资源。也即是我们常说的网址。发送http请求时,通过URL对网络资源进行定位。
URL.pngURL几个部分:
- 协议:指明网络使用的是什么协议。在"HTTP"后面的是"//"分隔符。
- 域名:域名由IP+端口组成。一个URL也可以直接使用IP地址作为域名使用。
- 端口:跟在域名后面的是端口,域名与端口之间使用":"作为分隔符。当没有指定端口时,将使用默认端口(HTTP协议默认端口80,HTTPS协议默认端口443)
- 路径:指域名后第一个"/"开始到最后一个"/"为止。
- 文件名:指域名后最后一个"/"到"?"。如果没有"?"或"#",则从域名最后一个"/"开始到结束都是文件名部分。
- 参数:从"?"开始到"#"之间的部分为参数部分。参数与参数之间使用"&"作为分隔符。
- 锚:从“#”开始到最后。
5.4、请求头(request header)
请求头 | 说明 |
---|---|
Accept | 告诉服务器当前浏览器能接受和处理的介质类型,如果/表示支持所有类型 |
Accept-Charset | 浏览器可接受的字符集 |
Accept-Encoding | 告诉服务器客户端支持gzip格式压缩 |
Accept-Language | 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 |
Authorization | 授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。 |
Connection | 告诉服务器在完成本次请求的响应后,保持该TCP连接不释放,等待本次连接的后续请求,这样可以减少打开关闭TCP连接的次数,提升处理性能。 |
Content-Length | 表示请求消息正文的长度 |
From | 请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它 |
Host | 要访问的服务器主机名或IP地址 |
If-Modified-Since | 只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答 |
Pragma | 指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝 |
Referer | 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 |
User-Agent | 当前客户端的操作系统和浏览器版本信息 |
5.5、请求体(request body)
请求正文通常是使用POST方法进行发送的数据,GET方法是没有请求正文的。请求正文跟上面的消息报头由一个空行隔开。
请求体.png6、HTTP响应(response)
6.1、响应报文
响应报文.png响应报文主要分为三部分:
- 响应状态(response code)
- 响应头(response header)
- 响应主体(response body)
6.2、响应状态码(response code)
每条HTTP 响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。伴随着每个数字状态码,HTTP 还会发送一条解释性的“原因短语”文本。包含文本短语主要是为了进行描述,所有的处理过程使用的都是数字码。HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。
HTTP状态码共分为5种类型:
分类 | 说明 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的HTTP响应状态码:
响应状态码 | 说明 |
---|---|
200 | 客户端请求处理成功,并成功返回响应 |
203 | 返回信息不确定或不完整 |
204 | 请求收到,但返回信息为空 |
301 | 客户端请求资源永久重定向 |
302 | 客户端请求资源临时重定向 |
304 | 客户端请求资源自从上次请求之后,就再也没有改动过 |
400 | 请求报文存在错误 |
401 | 请求不合法,或是没有被授权的客户端请求 |
403 | 服务器成功收到客户端请求,但是服务器拒绝响应 |
404 | 客户端请求资源不存在 |
500 | 服务器内部出现错误 |
502 | 资源服务器错误 |
503 | 服务器暂时太忙 |
6.3、响应头(response header)
响应头 | 说明 |
---|---|
Allow | 服务器支持哪些请求方法 |
Content-Encoding | 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。 |
Content-Length | 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。 |
Content-Type | 表示后面的文档属于什么MIME类型。 |
Date | 当前的GMT时间。 |
Expires | 指明应该在什么时候认为文档已经过期,从而不再缓存它 |
Last-Modified | 文档的最后改动时间。 |
Location | 表示客户应当到哪里去提取文档。 |
Refresh | 表示浏览器应该在多少时间之后刷新文档。 |
6.4、响应体(response body)
响应体.png7、Cookie
Cookie就是服务器暂存放在用户计算机上的一组资料,用来辨认用户的计算机。当用户打开浏览网站后,Web服务器会先送出一小段资料放在用户的计算机上,这一小段资料就是Cookie,Cookie的内容就是保存用户在浏览器上的一段操作信息。
7.1、Cookie的使用原理
- 用户访问网站时提交信息给服务器。
- 服务器向客户端返回响应数据,同时返回一个Cookie。
- 当客户端接收到来自服务器的响应之后,浏览器会将Cookie存放在一个统一的位置。
- 客户端再向服务器发送请求的时候,会带上这个Cookie,发送给服务器。
- 服务器在接收到来自客户端的请求之后,就能够通过分析Cookie的内容得到客户端特有的信息,从而动态生成与该客户端相对应的内容。
7.2、获取Cookie的途径
- 通过浏览器开发者工具或者抓包工具获取。
- 从本地文件中获取。
- 通过前端技术获取。
7.3、Cookie的生命周期
- Cookie的生命周期是可以设置的。
- Cookie的生存时间是整个会话期间;浏览器将Cookie保存在内存中,浏览器关闭时自动清除Cookie。
- Cookie的生存时间是长久有效;Cookie保存在客户端硬盘中,浏览器关闭后,该Cookie也不会清除,下次打开浏览器访问对应网站时,这个Cookie就会自动再次发送给服务器。
注:Cookie不可跨域名以及跨浏览器使用。
8、Session
Session就是客户端与服务端之间的会话。Session针对的是某一用户的浏览器以及通过其当前浏览器窗口打开的任何窗口,它是存储具有针对性用户信息的存储机制。而Cookie则没有这样强的针对性,它可以在客户端存放很长时间。因为Session的标示是通过Cookie传递的,但是又不保存Cookie,所以Session有时被称为不保存Cookie,或者临时Cookie。
8.1、Session使用原理
- 服务器程序运行过程中创建Session,并且为该Session生成唯一的Session ID。
- 服务器将Session ID发到客户端。
- 当客户端再次发送请求时,会将这个Session ID带上。
- 服务器接收到请求之后依据Session ID找到对应的Session,完成请求响应。
8.2、Session生命周期
关闭浏览器不会导致Session被删除,可以设置服务器为Session设置一个失效时间,当距离客户端上一次使用Session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,服务器就会将Session删除,以节省存储空间。
8.3、Session与Cookie的区别
-
存储位置不同
Cookie的数据信息存储在客户端浏览器上。Session的数据信息存储在服务器上。 -
存储容量不同
单个Cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于Session并没有上限,但出于对服务端的性能考虑,Session内不要存放过多的东西,并且设置Session删除机制。 -
存取方式的不同
Cookie中只能保管ASCII字符串,需要通过编码的方式存取Unicode字符或者二进制数据,运用Cookie难以实现存储复杂的信息。Session中能够存放任何类型的数据。 -
隐私策略不同
Cookie对客户端是可见的。所以Cookie并不安全。Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 -
服务器压力不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户比较多,会产生特别多的Session,导致耗费大量的内存。Cookie保存在客户端,不占用服务器资源。
网友评论