博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Http笔记

Posted on 2017-04-07 14:13  Jasonhy  阅读(148)  评论(0)    收藏  举报

    HTTP协议即Hyper Text Transfer Protocol的缩写,中文名超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传输协议,基于TCP/IP通信协议来传递数据(比如HTML文件,图片文件,查询结果等)。是一个属于应用层的面向对象的协议,工作于客户端-服务端架构上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务端发送所有请求,WEB服务端根据接收到请求后,向客户端发送响应信息。

    特点

      ①支持客户/服务器模式,支持基本认证和安全认证

      ②简单快速:客户端向服务端发送请求时,只需传送请求方法和路径,常用的请求方法有:get,post,每种方法规定了客户端与服务器联系的类型不同,由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快

      ③灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记

      ④无状态:HTTP协议是无状态,指的是对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大

    关于URL:HTTP使用统一资源标识符(URI)来传输数据和建立连接,URL是一种特殊类型的URI,包含了用于查找某个资源的足够信息。URL中文叫同一资源定位符,是互联网上用来标识某一处资源的地址,比如有这么一组URL:

      http://127.0.0.1:8080/student/index.html?nid=1&page=1#name

    解释:

      ①协议部分:http: ,这代表网页使用的是HTTP协议,在Internet中可以使用多种协议,如HTTP,FTP等,// 这是分隔符

      ②域名部分:127.0.0.1,在这里我们直接使用ip作为域名

      ③端口部分:跟在域名的后面就是端口,域名和端口之间使用 :作为分隔符,端口不是一个URL必须部分,如果省略端口部分,将采用默认端口

      ④虚拟目录部分:从域名后的第一个"/"开始到"?"为止,是文件名部分,如果没有"?",则是从域名最后一个"/'开始到"#"为止,是文件部分,如果没有"?"和"#",那么从域名的最后一个"/"开始到结束,都是文件名部分。本例index.html是一个文件名,文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认文件名

      ⑤锚部分:从"#"开始到最后,都是锚部分,本列中的name,锚也不是一个URL必须的

      ⑥参数部分:从"?"开始到"#"为止的之间的部分,又称为搜索部分,查询部分,本例中的nid=1&page=1,参数可以有多个,参数与参数之间用"&"作为分隔符

    URI与URL的区别

      URI,是统一资源标识符,用来唯一标识一个资源,web上可用的每种资源如HTML文档,图像,视频片段,程序等都是一个URI来定位的,一般由三部分组成:a 访问资源的命名机制,b 存放资源的主机名,c 资源自身的名称,由路由表示,着重强调资源

      URL,是统一资源定位器,是一种具体的URI,既可以用来标识一个资源,又指明了如何locate这个资源,是Internet上用来描述信息资源的字符串,主要用在各种www客户程序和服务程序上,一般也由三部分组成: a 协议(或称为服务方式),b 存有该资源的主机ip地址(有时也包括端口号),c 主机资源的具体地址,如目录和文件名等

    HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

说明:
GET     请求指定的页面信息,并返回实体主体。
HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST     向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT     从客户端向服务器传送的数据取代指定的文档的内容。
DELETE      请求服务器删除指定的页面。
CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS     允许客户端查看服务器的性能。
TRACE     回显服务器收到的请求,主要用于测试或诊断。

 

    HTTP的工作原理及流程:一次HTTP称为一个事务

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 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的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

5、释放 TCP连接;

6、浏览器将该 html 文本并显示内容;

 

    HTTP请求信息:由请求行(request line)、请求头(header)、空行和请求数据四部分组成

            

    以下是一个GET请求例子,使用Charles抓取的request:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8

说明:
第一部分:请求行,用来说明请求类型,要访问的资源以及HTTP版本
第二部分:请求头,紧接着请求行(即第一行)之后的一部分,用来说明服务器要使用的附加信息。从第二行起为请求头部,HOST指出请求的目的地,User-Agent,服务器端和客户端都能访问它,它是浏览器类型检测类型的重要基础,该信息由我们的浏览器信息来定,并且在每个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的,即第四部分的请求数据为空,也必须有空行
第四部分:请求数据,也叫主体,可以添加任意的数据,本例的请求数据为空

 

    以下是POST请求列子:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

说明:
第一部分:请求行
第二部分:请求头,从第二行到第六行
第三部分:空行,也就是第七行
第四部分:请求数据,也就是第八行

    HTTP响应信息:由状态行,消息报头,空行和响应正文组成

              

    例子:

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>

说明:
第一部分:状态行,由HTTP协议版本号、状态码、状态消息三部分组成
第二部分:消息报头,用来说客户端要使用的一些附加信息,本例中,第二和第三行
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息

    HTTP状态码

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        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    HTTP常用的头信息

Accept:指定客户端能够接收的内容类型
Accept: text/plain, text/html
Accept-Charset:浏览器可以接受的字符编码集。
Accept-Charset: iso-8859-5
Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型。
Accept-Encoding: compress, gzip
Accept-Language:浏览器可接受的语言
Accept-Language: en,zh
Accept-Ranges:可以请求网页实体的一个或者多个子范围字段
Accept-Ranges: bytes
Authorization:HTTP授权的授权证书
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cookie:HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。
Cookie: $Version=1; Skin=new;
Content-Length:请求的内容长度
Content-Length: 348
Content-Type:服务器告诉浏览器自己响应的对象的类型。
Content-Type:application/xml
Content-Encoding:服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
Content-Encoding:gzip
Content-Language:服务器告诉浏览器理解主体时最适宜使用的自然语言。 Content-Length:服务器告诉浏览器自己响应的对象的长度或尺寸
Content-Length: 26012
Cache-Control:指定请求和响应遵循的缓存机制,在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached各个消息中的指令含义如下:
no-cache:指示请求或响应消息不能缓存,实际上是可以存储在本地缓存区中的,只是在与原始服务器进行新鲜度验证之前,缓存不能将其提供给客户端使用。
no-store:缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会包含敏感信息。
max-age:缓存无法返回缓存时间长于max-age规定秒的文档,若不超规定秒浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。若同时还发送了max-stale指令,则使用期可能会超过其过期时间。
min-fresh:至少在未来规定秒内文档要保持新鲜,接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象。
max-stale:指示客户端可以接收过期响应消息,如果指定max-stale消息的值,那么客户端可以接收过期但在指定值之内的响应消息。
only-if-cached:只有当缓存中有副本存在时,客户端才会获得一份副
Public:指示响应可被任何缓存区缓存,可以用缓存内容回应任何用户。
Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理,只能用缓存内容回应先前请求该内容的那个用户。
Pragma:用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。 Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Close:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了。
Keepalive:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求。
Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒),如Keep-Alive:300。
Date:表示消息发送的时间,服务器响应中要包含这个头部,因为缓存在评估响应的新鲜度时要用到,其时间的描述格式由RFC822定义,Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
Date:Mon, 31 Dec 2001 04:25:57 GMT
Transfer-Encoding:WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。
Transfer-Encoding: chunked
Last-Modified:WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。
Last-Modified:Tue, 06 May 2008 02:42:43 GMT
Host:指定请求的服务器的域名和端口号
Etag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。 If-Match:只有请求内容与实体相匹配才有效
If-Match: “737060cd8c284d8af7ad3082f209582d”
If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码
If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match:如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变
If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range:如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag
If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since:只在实体在指定时间之后未被修改才请求成功
If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Range:只请求实体的一部分,指定范围
Range: bytes=500-999
Referer:浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL
Referer:http://www.ecdoer.com/
User-Agent:浏览器表明自己的身份(是哪种浏览器)。
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN;rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Server:服务器表明自己是什么软件及版本等信息。
Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。 Expires:服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0 的头部。
Expires:Sat, 23 May 2009 10:02:12 GMT
Via:列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,当下一个代理服务器 收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,并把自己的相关信息加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)

    GET和POST的区别

      ①GET提交的数据会放在URL之后,以?分隔URL和传输数据,参数之间用&连接,POST是将提交的数据放在HTTP包的body中

      ②GET提交的数据有限制(因为浏览器对URL的长度都限制),而POST提交的数据没有限制

      ③GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值

      ④GET方式提交会带来安全性问题,比如一个登录页面,通过GET来提交的话,用户名和密码将会出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史获取该用户的账号和密码

    解决HTTP无状态问题:由于HTTP不能像socket那样建立两个终端,双方是可以互相通信的,HTTP的客户端只能通过请求服务器来获取相关的内容或文件信息。对于解决这种无状态问题可以通过Cookie和Session来解决。

      ①Cookie,是由服务器端生成的,发送给User-Agent(一般是web浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求统一网站时就发送该Cookie给服务器(前提是浏览器设置为启用Cookie)

       用途:可用来判断用户是否已经登录,还有就是处理购物车,比如我们在淘宝上将不同的商品加入购物车,而这些商品信息都会写入Cookie,以便在最后付款时提取信息

       生命周期:Cookie在生成时就会被指定一个Expire值,这就是Cookie的生命周期,在这个周期内,Cookie有效,超出了Cookie就会被清除了

      ②Session,指一个终端用户与交互系统进行通信的时间间隔,通常指从登录进入系统到注销退出系统之间所经过的时间以及如果有需要的话,可能还有一定的操作空间。所以,我们又可以说Session是一个特定的时间概念。当用户访问服务器时,服务器根据需求设置Session,将会话信息保存在服务器,同时将标示Session的SessionId传递给客户端浏览器,浏览器将这个SessionId保存在内存中,我们称之为无过期时间的Cookie,浏览器关闭之后,这个Cookie就会被清掉,不会存在用的Cookie临时文件,以后浏览器每次访问,都会额外这个参数值,服务器会根据这个SessionId就能获取客户端的数据信息

      ③Cookie和Session的区别:

a、Cookie数据存放在客户的浏览器上,Session数据放在服务器上;
b、Cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用Session;
c、Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
d、单个Cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能超过4K;