HTTP协议介绍
http(超文本传输协议)是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。特点:
(1)支持客户/服务器模式。 HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。称这个客户端叫用户代理。服务器则在那个端口监听客户端发送过来的请求。应答的服务器上存储着(一些)资源,比如HTML文件和图像。称这个应答服务器为源服务器。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,其消息体即为服务器上的资源。HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
(2)简单快捷。 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
(3)灵活。 HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
(4)无连接。 意思限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
(5)无状态。 HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
对应的记录机制,如服务器记录用户登录信息,用户名,密码等信息,当用户登录上之后服务器会为该用户分配sesstion id唯一标识该用户,(浏览器)默认保存登录信息。客户端cookies 是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,作用是为解决HTTP协议无状态缺陷所做的努力。想深入了解可以点击http://www.lai18.com/content/407204.html
认识URL
通过HTTP协议请求的资源由统一资源定位器(URL)来标识。URL是一种特殊类型的URI(统一资源标识符,用来唯一的标识一个资源。),包含了用于查找某个资源的足够的信息。(另外,URN,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。) 通俗来讲URL即浏览器的地址栏里输入的网站地址。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。格式如下:
http://host[":"port][abs_path]
请求与响应
图示如下:
1、http请求
GET 请求获取Request-URI所标识的资源;
POST 在Request-URI所标识的资源后附加新的数据;
HEAD 请求获取由Request-URI所标识的资源的响应消息报头;
PUT 请求服务器存储一个资源,并用Request-URI作为其标识;
DELETE 请求服务器删除Request-URI所标识的资源;
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断;
CONNECT 保留将来使用;
Accept:image/gif,image/x-xbit,... (CRLF) //请求报头,后面详细解释
...
HOST: www.guet.edu.cn (CRLF)
Content-Length: 22 (CRLF) //(字长描述,防止数据粘包)
Connection:Keep-Alive (CRLF) //普通报头域允许发送指定连接的选项。
Cache-Control:no-cache (CRLF) //普通报头,后面详细解释。
(CRLF) //空行,该CRLF表示消息报头已经结束,在此之前为消息报头。
2、http响应
HTTP-Version Status-Code Reason-Phrase CRLF
1xx:指示信息--表示请求已接收,继续处理;
2xx:成功--表示请求已被成功接收、理解、接受;
3xx:重定向--要完成请求必须进行更进一步的操作;
4xx:客户端错误--请求有语法错误或请求无法实现;
5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述、说明:
200 OK //客户端请求成功;
400 Bad Request //客户端请求有语法错误,不能被服务器所理解;
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 ;
403 Forbidden //服务器收到请求,但是拒绝提供服务;
404 Not Found //请求资源不存在,eg:输入了错误的URL;
500 Internal Server Error //服务器发生不可预期的错误;
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
eg:HTTP/1.1 200 OK (CRLF)
消息报头
HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。
1、普通报头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。例如:Date 普通报头域表示消息产生的日期和时间。
eg:Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
eg:为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:response.sehHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");//作用相当于上述代码,通常两者//合用。
这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache
Connection普通报头域允许发送指定连接的选项。例如指定连接是连续 Connection:Keep-Alive,或者指定Connection:close选项,通知服务器,在响应完成后,关闭连接
2、请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头
Accept 请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Charset 请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding 请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
Accept-Language 请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
Authorization 请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Host (发送请求时,该报头域是必需的)请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的(前文已有例子),此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
User-Agent 在登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。
请求报头举例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)
3、响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI 所标识的资源进行下一步访问的信息。
常用的响应报头
Location 响应报头域用于重定向接受者到一个新的位置。常用在更换域名的时候。
Server 响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是Server响应报头域的一个例子:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出服务器对请求资源采用的是基本验证机制。
4、实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的源信息。
常用的实体报头
Content-Encoding 实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
Content-Language 实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
者。eg:Content-Language:da
Content-Length 实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Content-Type 实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified 实体报头域用于指示资源的最后修改日期和时间。
Expires 实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader("Expires","0");
利用telnet观察通讯过程
实验目的及原理:
利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗口上显示出来,从而从感性上加深对http协议的通讯过程的认识。
实验步骤:
1、打开telnet
1.1 打开telnet
运行-->cmd-->telnet
1.2 打开telnet回显功能
set localecho
2、连接服务器并发送请求
2.1 open www.guet.edu.cn 80 //注意端口号不能省略
HEAD /index.asp HTTP/1.0
Host:www.guet.edu.cn
/*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/
open www.guet.edu.cn 80
GET /index.asp HTTP/1.0 //请求资源的内容
Host:www.guet.edu.cn
2.2 open www.sina.com.cn 80 //在命令提示符号下直接输入telnet www.sina.com.cn 80
HEAD /index.asp HTTP/1.0
Host:www.sina.com.cn
3.实验结果:
3.1 请求信息2.1得到的响应是:
HTTP/1.1 200 OK //请求成功
Server: Microsoft-IIS/5.0 //web服务器
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private
//资源内容省略
下图是我在Linux下测试结果,只指定了个别字段信息:
测试时,服务器端信息:
本文基于http/1.0 版本,从1.0版本后,http做了很大改进,加入了一些其他技术,如长连接等,了解一些更新的版本点击
以上为学习总结,参考文章:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
和http/1.以及http/2.0的区别
1、影响http访问速度的因素
带宽:带宽影响网速,现在网络基础建设已经使得带宽得到极大的提升。
延迟:
(1)浏览器阻塞:浏览器对于同一域名,同时只能有 4 个连接(根据浏览器内核不同会有所差异,谷歌同时能有 6个连接),超过浏览器最大连接数限制,后续请求就会被阻塞。(2)DNS 查询:浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是 DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的。 (3)建立连接:HTTP 基于 TCP 协议,浏览器最快在第三次握手时才能捎带 HTTP 请求报文,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
2、http1.0的新增功能和问题
包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接,新建成本较高,并且开始时发送速率较慢(slow start)。
3、http1.1新增的功能
持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。以前,在同一个TCP连接里,先发送A请求,待服务器响应后,再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。
Content-length字段的作用,声明本次回应的数据长度。在1.0版中,Content-Length字段不是必需的,因为浏览器发现服务器关闭了TCP连接,就表明收到的数据包已经全了。
分块传输编码:用Content-Length字段的条件是,服务器发送回应之前,须知道回应的数据长度。对于一些耗时的动态操作,这意味着服务器要等所有操作完成,才能发送数据。更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。因此,1.1版规定可以不使用Content-Length字段,而使用"分块传输编码"(chunked transfer encoding)。只要请求或回应的头信息有Transfer-Encoding字段,就表明回应将由数量未定的数据块组成。
1.1版还新增了许多动词方法:PUT、PATCH、HEAD、 OPTIONS、DELETE。客户端请求的头信息新增了Host字段,用来指定服务器的域名。Host: www.example.com
Host字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础。
1.1的问题:同一TCP连接里,所有的数据通信是按次序的。服务器一个个依次序处理请求。要是有回应特别慢,后面就会请求排队等着。这称为"队头堵塞"。两种方法:一是减少请求数,二是同时多开持久连接。
HTTP1.0和HTTP1.1的区别
(1)缓存处理:1.0中主要使用header里的If-Modified-Since,Expires做为缓存判断的标准,1.1引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
(2)带宽优化及网络链接的使用:1.0中,浪费带宽如客户端只需对象的一部分,服务器将整个对象发送过来,且不支持断点续传,1.1在请求头引入range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接。
(3)错误通知:1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
(4)Host头处理:1.0认为每台服务器都绑定唯一IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。虚拟主机技术,在一台物理服务器上可存在多个虚拟主机(Multi-homed Web Servers)共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
(5)长连接,HTTP 1.1支持长连接和请求的流水线处理,一个TCP连接可传送多个请求和响应,减少了建立和关闭连接的消耗和延迟,默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
SPDY针对HTTP1.1的优化
(1)降低延迟,对高延迟,SPDY采取了多路复用。通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking问题,降低延迟,提高带宽的利用率。
(2)请求优先级。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。
(3)header压缩。HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
(4)基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
(5)服务端推送(server push),采用了SPDY的网页。
HTTP2.0和SPDY的区别:
HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS;HTTP2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE。2.0版本是SPDF的升级版。
HTTP2.0与HTTP1.1的区别
- HTTP/2采用二进制格式而非文本格式
- HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
- 使用报头压缩,HTTP/2降低了开销
- HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
(1)应用层与传输层之间增加一个二进制分帧层,以此达到“在不改动 HTTP 的语义,HTTP 方法、状态码、URI 及首部字段的情况下,突破 HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。”在二进制分帧层上,HTTP2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中 HTTP1.x 的首部信息会被封装到 Headers 帧,而我们的 request body 则封装到 Data 帧里面。
(2)客户端和服务器把 HTTP 消息分解为互不依赖的帧,乱序发送,在另一端重新组合起来。同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送 stream,也可以一边接收者服务器的响应,而服务器那端同理。
(3)数据流:因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。
HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。
数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。1.1版取消数据流的唯一方法,就是关闭TCP连接。这就是说,HTTP/2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应。
(4)头部压缩 :HTTP 协议不带状态,每次请求都须附上所有信息。请求的很多字段都是重复的,比如Cookie和User Agent。HTTP/2引入了头信息压缩机制。一头信息使用gzip或compress压缩后再发送;另一,客户端和服务器同时维护一张头信息表,所有字段都存入这个表,生成一个索引号,以后不发送同样字段,只发送索引号。
(5)服务端推送:HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。
常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。
HTTP与HTTPS的区别
-
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
-
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
-
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
-
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
https://www.cnblogs.com/digdeep/p/4832885.html