HTTP简析
HTTP简析
一、HTTP简介
HTTP (HyperText Transfer Protocol) 即超文本传输协议,是一个基于TCP的Client-Server的请求和应答标准。通过使用Web浏览器、网络爬虫或者其他工具,客户端发起一个HTTP请求到指定服务器的指定端口 (默认端口为80),指定的服务器处理相应请求,并返回应答消息。我们称这个客户端为用户代理 (User-Agent)。在应答服务器上存储着一些资源,比如HTML文件和图片,我们称应答服务器为源服务器 (Origin-Server)。在用户代理和源服务器中间可能存在多个中间层,比如代理、网关或者隧道。
通过HTTP (或者HTTPS) 协议请求的资源由统一资源标志符 (Uniform Resource Identifiers 简称URI) 来标识,由统一资源定位符 (Uniform Resource Locator 简称URL) 来定位。其中URL是URI的子集。
二、URL简介
URI和URL的关系
在讨论URL之前,我们先弄清楚URL和URI之间的关系:
URL格式
protocol (协议) :HTTP、HTTPS、FTP等协议;
hostname (主机名) :存放资源的服务器IP地址或者域名。有时,在主机名前也可以包含连接到服务器所需的用户名和密码 (格式:username:password@hostname) ;
port (端口号) :可选,省略时使用协议的默认端口,HTTP为80,HTTPS为443,FTP为20和21;
path (路径) :由零个或者多个"/"隔开的字符串,一般用来表示服务器上的一个目录或文件地址;
parameters (参数) :可选,特殊参数,参数形式为"Key=Value";
query (查询) :可选,用于给动态网页传递参数,可有多个参数,用符号"&"隔开,参数形式为"Key=Value";
fragment (片段):用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
如下URL所示:
三、HTTP流程
流程如下图所示:
- 如果采取"域名"方式访问相应资源,则首先需要通过DNS获取服务器的IP地址;
- 客户端根据IP地址与服务器建立TCP连接,端口号为80;
- 客户端向服务器发送请求消息;
- 服务端向客户端发送应答消息;
- 客户端根据应答消息进行本地渲染;
- 一般情况下,客户端和服务器之间的连接为长连接,客户端可以利用此连接再次发送请求消息;
- 客户端或者服务端想要关闭连接或者到达dead-time时,断开长连接。
四、HTTP消息
1、请求 (Request)
消息格式:
注:图中方框大小不代表消息实际长度
消息实例:
消息说明:
请求方法:
| HTTP请求 方法 | Request是否含有Body字段 | Response是否含有Body字段 | 说明 |
|---|---|---|---|
| GET | No | Yes | 当客户端要从服务器上读取文档,点开某个链接,或者是通过浏览器输入网址来浏览网页的时候,使用的都是GET方法。GET方法请求参数和对应的值附加在URL后面,利用一个?代表URL的结尾以及附带参数的开始,参数用key=value键值对的方式书写,参数和参数之间用&符号隔开。 |
| HEAD | No | No | HEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。 |
| POST | Yes | Yes | POST方法将请求的参数封装在了HTTP请求的请求体中,以key=value的方式书写,多个参数用&分隔,可以传输大量的数据。POST请求一般用于表单数据的提交。 |
| PUT | Yes | Yes | 请求服务器存储一个资源,并用URI作为其标识。 |
| DELETE | No | Yes | 请求服务器删除URI所指示的资源。 |
| CONNECT | Yes | Yes | CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。 |
| OPTIONS | No | Yes | 用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为"Allow"的头,值是所支持的方法,如"GET,POST"。 |
| TRACE | No | Yes | 请求服务器回显收到的请求,主要用于测试或诊断。 |
| PATCH | Yes | Yes | 用于局部修改资源。 |
头部属性:
| 字段 | 说明 |
|---|---|
| Accept | 客户端可接收的响应内容类型 Accept:*/* 表示客户端接受所有类型 |
| Accept-Encoding | 声明浏览器支持的压缩 (编码) 类型 |
| Accept-Language | 浏览器所希望的语言种类 |
| Connection | 连接方式,如果为keep-alive则为长连接,close则为短连接 |
| Content-Length | 以8进制表示的请求体的长度 |
| Content-Type | 请求体的MIME类型 |
| Cookie | 将Cookie值发送给服务器 |
| Host | 服务器域名和端口号,默认端口可省略 |
| Referer | 包含一个URL,表示跳转到当前页面的之前的页面 |
| User-Agent | 客户端身份标识字符串 |
| ...... | ...... |
2、响应 (Response)
消息格式:
注:图中方框大小不代表消息实际长度!
消息实例:
消息说明:
状态码:
| 状态码 | 类别 | 状态描述 |
|---|---|---|
| 1XX | Information | 请求已接受,继续处理 |
| 2XX | Success | 请求正常处理完毕 |
| 3XX | Redirection | 需要采取进一步措施才能完成请求 |
| 4XX | Client Error | 请求有语法错误、请求无法实现或资源不存在 |
| 5XX | Server Error | 服务器内部错误,无法满足合法请求 |
注:3XX的"进一步措施"对用户透明,这里对3XX作进一步说明
| 状态码 | 状态描述 | 含义 |
|---|---|---|
| 300 | Multiple Choices(多项选择) | 客户端请求了指向多个资源的URL。300代码和一个选项列表一起返回,用户根据列表选择希望的资源。 |
| 301 | Moved Permanently (永久移动) | 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URL之一。Response中应该包含一个Location URL,说明资源现在所处的位置。 |
| 302 | Found (已找到) | 请求的资源现在临时从不同的URL响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。 |
| 303 | See Other (参见其他) | 类似302。 |
| 304 | Not Modified (未修改) | 客户的缓存资源是最新的, 要客户端使用缓存。 |
| 305 | Use Proxy (使用代理) | 必须通过代理访问资源, 代理的地址在Response 的Location中。 |
| 306 | 保留 | 这个状态码当前没使用。 |
| 307 | Temporary Redirect (临时重定向) | 类似302。 |
头部属性:
| 字段 | 说明 |
|---|---|
| Connection | 连接方式,如果为keep-alive则为长连接,close则为短连接 |
| Content-Type | 响应体的类型和字符集 |
| Content-length | 响应体的长度 |
| Location | 重定向的URL |
| Date | 生产消息的具体时间和日期 |
| Set-Cookie | 将Cookie发送给客户端,客户端下次请求会把Cookie写入到Request-Header中 |
| Server | 服务器名字 |
| X-Powered-By | 表示是网站使用的开发技术 |
| ...... | ...... |
五、Cookie和Session
HTTP无状态性的缺陷
WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应的过程。
会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在淘宝购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户信息,所以需要引入新的技术来跟踪对话,常用的两种技术为Cookie和Session。
1、Cookie
Cookie介绍
Cookie是一种在客户端保持HTTP状态信息的技术。比如我们在某些网站上会勾选"记住密码"选项,此时账户和密码就被存储在Cookie中;当我们在购物时,Cookie会记录是谁在购物,在加购物品时,物品就会被正确地放入到我们的购物车中。
Cookie实际上是一段文本信息。客户端向服务器发送请求消息,如果服务器需要记录该用户状态,就在Respond-Header中添加Set-Cookie字段将Cookie消息发送给客户端。客户端浏览器会把Cookie保存起来。当浏览器向该服务器再次发送请求时,浏览器会在Request-Header中添加Cookie字段将保存的Cookie提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
Cookie的不可跨域名性
Cookie在客户端由浏览器来管理,浏览器能够保证一个网站不能访问和操作具有其他域名网站的Cookie。
比如,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。这样就能保证我们的Goolge账户和Baidu账户在自动登录时不会混淆。
Cookie的有效期
Cookie的maxAge决定着Cookie的有效期,单位为秒 (Second)。
- 如果为正数,则该Cookie在maxAge秒之后失效;
- 如果为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效,浏览器也不会以任何形式保存该Cookie;
- 如果为0,表示删除该Cookie;
- Cookie默认的maxAge值为-1。
Cookie工作示意图
2、Session
Session介绍
使用Cookie可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。Session技术是一种将会话状态保存在服务器端的技术 ,不同会话由服务器派发给客户端的SessionID来标识。
WEB服务器会在服务端创建一个与该客户端对应的HttpSession对象,并为HttpSession对象分配一个独一无二的SessionID,然后在响应消息中将这个SessionID传递给客户端。客户端需要记住SessionID,并在后续的每次访问请求中都把这个SessionID传送给WEB服务器,WEB服务器端依据回传的SessionID就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。
Session的有效期
WEB服务器采用"超时"的办法来判断客户端是否还在继续访问:如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象释放。
如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话,将为之创建新的HttpSession对象和分配新的SessionID。
Session传递方式
利用Cookie传递SessionID
如果WEB服务器处理某个访问请求时创建了新的HttpSession对象,它将把SessionID作为一个Cookie加入到响应消息中。通常情况下,浏览器在随后发出的访问请求中又将Session以Cookie的形式回传给WEB服务器。
利用URL重写传递SessionID
如果浏览器不支持Cookie或者用户禁用掉Cookie,那么SessionID可以通过URL来传递。
一种是作为parameters参数
http://www.wantsoft.com/index.asp;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
一种是作为query参数
http://www.wantsoft.com/index?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
Session工作示意图
六、HTTP和HTTPS的区别
-
HTTP超文本传输协议,明文传输;HTTPS即HTTP over SSL,是具有安全性的SSL加密传输协议;
-
HTTP使用80端口,HTTPS使用443端口;
-
HTTPS协议握手阶段比较费时;
对Cookie和Session的理解比较浅显,可能充斥着大量的错误,希望大家批评纠正。

浙公网安备 33010602011771号