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之间的关系:

URI和URL关系
正如上图所示,URL是URI的子集。例如,身份证号即为一个URI,它唯一标识了一个人。但只根据身份证号无法找到此人,如果再加上家庭住址,我们便可以定位到此人,"家庭住址+身份证号"即为一个URL (同时也为一个URI,因为它也可以唯一标识一个人)

URL格式

\[protocol://hostname[:port]/path/[;parameters][?query][\#fragment] \]

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所示:

URL示例

三、HTTP流程

流程如下图所示:

HTTP工作流程
  1. 如果采取"域名"方式访问相应资源,则首先需要通过DNS获取服务器的IP地址;
  2. 客户端根据IP地址与服务器建立TCP连接,端口号为80;
  3. 客户端向服务器发送请求消息;
  4. 服务端向客户端发送应答消息;
  5. 客户端根据应答消息进行本地渲染;
  6. 一般情况下,客户端和服务器之间的连接为长连接,客户端可以利用此连接再次发送请求消息;
  7. 客户端或者服务端想要关闭连接或者到达dead-time时,断开长连接。

四、HTTP消息

1、请求 (Request)

消息格式:

Request消息格式

注:图中方框大小不代表消息实际长度

消息实例:

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)

消息格式:

Response消息格式

注:图中方框大小不代表消息实际长度!

消息实例:

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)。

  1. 如果为正数,则该Cookie在maxAge秒之后失效;
  2. 如果为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效,浏览器也不会以任何形式保存该Cookie;
  3. 如果为0,表示删除该Cookie;
  4. Cookie默认的maxAge值为-1。

Cookie工作示意图

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工作示意图

Session

六、HTTP和HTTPS的区别

  • HTTP超文本传输协议,明文传输;HTTPS即HTTP over SSL,是具有安全性的SSL加密传输协议;

  • HTTP使用80端口,HTTPS使用443端口;

  • HTTPS协议握手阶段比较费时;



对Cookie和Session的理解比较浅显,可能充斥着大量的错误,希望大家批评纠正。
posted @ 2020-10-10 17:10  YuHover  阅读(98)  评论(0)    收藏  举报