HTTP简介
功能
HTTP协议功能:传送web数据(HTML 文件, 图片文件, 查询结果等)
连接常见术语
1、HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
2、Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
3、Web服务器根据接收到的请求后,向客户端发送响应信息。
4、HTTP默认端口号为80,但是你也可以改为8080或者其他端口
HTTP三点注意事项:
1、HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
2、HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。
3、HTTP是无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
HTTP工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 请求/响应的步骤
HTTP=请求+响应
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
客户端请求信息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求状态行(request line)、请求头部(header)、空行和请求数据(body)四个部分组成,下图给出了请求报文的一般格式。
服务器响应信息
HTTP响应也由四个部分组成,分别是:响应状态行、消息报头、空行和响应正文。
提出一个问题
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求服务器会认为新的客户端;
为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息,
Cookie通过在客户端记录信息确定用户身份
Session通过在服务器端记录信息确定用户身份
HTTP报文分析
HTTP请求(客户端)
HTTP 请求包括三部分,分别是请求状态行、请求头和请求正文(请求数据)。HTTP 请求第三行为请求正文,请求正文是可选的,它最常出现在 post 请求方式中,get 请求无正文,所以回车之后为空。示例如下:
GET方法:
请求行
由三部分构成:
第一部分说明请求类型为 get 方法请求。
第二部分(用/分开) URL:([/562f25980001b1b106000338.jpg])为要访问的资源,
第三部分说明使用的是 HTTP1.1 版本。
常用请求报头
请求头(消息头)包含(客户机请求的服务器主机名,客户机的环境信息等)。具体内容及含义如下:
•Host
Host初始URL中的主机和端口,用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
•Connection
表示客户端与服务连接类型;
•client 发起一个包含Connection:keep-alive的请求
•server收到请求后,如果server支持keepalive,回复一个包含Connection:keep-alive的响应,不关闭连接,否则回复一个包含Connection:close的响应,关闭连接。
•如果client收到包含Connection:keep-alive的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。Keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间HTTP
•Accept
表示浏览器支持的 MIME 类型
MIME的英文全称是 Multipurpose Internet Mail Extensions(多用途互联网邮件扩展)
eg:
Accept-Charset:用于告诉服务器,客户机采用的编码格式;
Accept:image/gif,表明客户端希望接受GIF图象格式的资源;
Accept:text/html,表明客户端希望接受html文本。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
意思:浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、 application/xml 和 */*,优先顺序是它们从左到右的排列顺序。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Application:用于传输应用程序数据或者二进制数据
Referer:客户机通过这个头告诉服务器,它(客户端)是从哪个url来访问服务器的(防盗链);
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器版本等);
Cookie:客户机通过这个头,将 Coockie 信息带给服务器;
请求正文
浏览器端通过 HTTP 协议发送给服务器的实体数据。get 请求时,通过 url 传给服务器的值 name=dylan&id=110。post 请求时,通过表单发送给服务器的值。也可以为空。
POST请求
第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。
最多的方法是 get 方法和 post 方法,二者的区别:
GET 请求的正文在请求头里面,一般没有请求正文。
POST 请求的数据一般放在末尾。
1.GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
2.GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4.GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
URL
统一资源定位符(URL,英语 Uniform / Universal Resource Locator的缩写)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
URL格式:
基本格式如下
schema://host[:port#]/path/…/[?query-string][#anchor]
•schema 协议(例如:http, https, ftp)
•host 服务器的IP地址或者域名
•port# 服务器的端口(如果是走协议默认端口,缺省端口80)
•path 访问资源的路径
•query-string 参数,发送给http服务器的数据
•anchor- 锚(跳转到网页的指定锚点位置)
例子:
•http://www.sina.com.cn/
•http://192.168.0.116:8080/index.jsp
•http://item.jd.com/11052214.html#product-detail
•http://www.website.com/test/test.aspx?name=sv&x=true#stuff一个URL的请求过程:
当你在浏览器输入URL http://www.website.com 的时候,浏览器发送一个Request去获取 http://www. website.com的html.
服务器把Response发送回给浏览器.浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如图片,CSS文件,JS文件。浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。当所有的文件都下载成功后, 网页就被显示出来了。
HTTP响应(服务器)
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一部分: 状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分: 消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行和第四行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1
第三部分: 空行,消息报头后面的空行是必须的第四部分: 响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
其中 HTTP 响应常见的状态码及其含义如下:
响应头
-
响应头有若干个字段组合(根据具体情况选择),常见字段及其含义如 下:
-
Content-Type:服务器给客户端传回来的文件格式;
-
Content-Length:这个是返回的实体在压缩之之后的长度为 8 byte;
-
Last-Modified:文档的最后改动时间;
-
ETag:这个响应头中有种Weak Tag,值为W/“xxxxx”。它声明Tag是弱 匹配的,只能做模糊匹配,在差异达到一定阈值时才起作用。
-
Accept-Ranges:表示该服务器是否支持文件的范文请求;
-
Server:设置服务器名称;
-
Date:当前 GMT 时间,这个就是你请求的东西被服务器创建的时间。
响应包含浏览器能够解析的静态内容,例如:HTML,纯文本,图片等等信息。
协议缓存的响应分析
浏览器缓存访问过程及机制
WEB 缓存一般分为浏览器缓存、代理服务器缓存、网关缓存。
WEB 缓存就在服务器-客户端之间搞监控,监控请求,并且把请求输出的内容(例如 HTML 页面、图片和文件)另存一份(统称为副本);然后,如果下一个请求是相同的 URL ,则直接请求保存的副本,而不是再次访问资源服务器。
使用缓存的 2 个主要优势:
降低延迟:缓存离客户端更近,因此,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,网站就显得更灵敏;
降低网络传输:副本被重复使用,大大降低了用户的带宽使用,其实也是一种变相的省钱(如果流量要付费的话),同时保证了带宽请求在一个低水平上,更容易维护了。
HTTP 协议缓存
HTTP 协议缓存是 WEB 缓存的一种,它是通过 HTTP 头信息来控制缓存的,HTTP 头信息可以让你对浏览器和代理服务器如何处理你的副本进行更多的控制。他们在 HTML 代码中是看不见的,一般由 Web 服务器自动生成。但是,根据你使用的服务器,你可以在某种程度上进行控制。
浏览器第一次请求流程如下图所示:
浏览器在第一次请求的时候不存在缓存,直接从浏览器请求,等请求返回结果之后再根据 HTTP 头信息将数据缓存在内存或者硬盘中。
浏览器再次请求同一 URL 时的流程如下图所示:
浏览器需要根据 HTTP 头信息来判断是否直接从缓存读取数据,还是交由服务器来判断是否从缓存读取数据。
几种状态码的区别如下图所示:
HTTP报文中与缓存有关的字段:
HTTP 状态码(status code)
200 请求成功,浏览器会把响应回来的信息显示在浏览器端;
304 第一次访问一个资源后,浏览器会将该资源缓存到本地;第二次再访问该资源时,如果该资源没有发生改变或失效,那么服务器响应给浏览器 304 状态码,告诉浏览器使用本地缓存的资源。
HTTP 响应时,如何判断是该返回 200 还是 304 呢?
与之相关的字段是:
Last-Modified: 表示这个响应资源的最后修改时间。web 服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since: 当资源过期时(使用 Cache-Control 标识的 max-age),发现资源具有 Last-Modified 声明,则再次向 WEB 服务器请求时,带上 If-Modified-Since,表示请求时间。
WEB 服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源有被改动过,则响应资源内容(写在响应消息包体内),HTTP 200 ;若最后修改时间较旧,说明资源无新修改,则响应 HTTP 304 (无需包体,节省流量),告知浏览器继续使用缓存。
HTTP 协议缓存捕获操作方法与步骤
1.启动浏览器,确保浏览器的缓存被清除。在 Firefox 下执行此操作,请选择“工具” - > “清除最近历史记录”,然后检查缓存框;
2.启动 Wireshark 数据包嗅探,在浏览器中输入某一 URL ,浏览器应显示一个 HTML 文件;
3.再次快速地将相同的 URL 输入到浏览器中(或者只需在浏览器中点击刷新按钮);
4.停止 Wireshark 数据包捕获,并在 display-filter-specification 窗口中输入“http”,以便只捕获 HTTP 消息,并在数据包列表窗口中显示。
HTTP对长文件的处理
TCP报文段
在以太网中,最大传输单元(MTU)为 1500 个字节,在一个 IP 包中,去除 IP 包头的 20 个字节,可以传输的最大数据长度为 1480 个字节。在 TCP 包中,去除 20 个 TCP 包头,可以传输的最大数据段为 1460 个字节。因此,当数据超过最大数据长度时,将对该数据进行分片处理,在 IP 包头中会看到有多个片在传输,但标识号是相同的,表示是同一个数据包。
HTML 文件相当长时,例如: 4861 字节太大,一个 TCP 数据包不能容纳。因此,单个 HTTP 响应消息由 TCP 分成几个部分,每个部分包含在单独的 TCP 报文段中,如下图:长度为 4861 的报文被分为长度分别为 1440,1440,1440,541 的 4 个 TCP 段,编号分别为 8715,8716,8718,8719 。
数据包
分为请求数据包和响应数据包:展开 HTTP 分组,查找浏览器发送的请求消息,所以此时我们捕捉到的只有 1 个请求消息。
请求数据包
单击 get 数据包,其内容包含:请求行,请求头,空行,请求体。
响应数据包
点开响应数据包,其状态码和短语都在此数据包里。并且其状态码为 200 ,短语为 OK :
相应内容包括:状态行,响应头,空行,响应正文: