ReZero's Utopia.

http学习记录

Word count: 6kReading time: 23 min
2016/11/04 Share

本文整理自
https://www.zybuluo.com/yangfch3/note/167490


Begin

http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff Schema: http
host: www.mywebsite.com
path: /sj/test
URL params: id=8079
Query String: name=sviergn&x=true Anchor: stuff
scheme:指定低层使用的协议(例如:http, https, ftp)
host:HTTP服务器的IP地址或者域名
port#:HTTP服务器的默认端口是80,这种情况下端口号可以省略。
如果使用了别的端口,必须指明,例如
http://www.mywebsite.com:8080/
path:访问资源的路径
url-params
anchor:锚


无状态的协议

http协议是无状态的:

同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。

解决方法:Cookie机制来维护状态

既然Http协议是无状态的,那么Connection:keep-alive 又是怎样一回事?

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。

Http消息结构

Request 消息的结构:三部分

> 第一部分叫Request line(请求行), 第二部分叫http header, 第三部分是body
> 请求行:包括http请求的种类,请求资源的路径,http协议版本 http header:http头部信息
> body:发送给服务器的query信息  当使用的是"GET" 方法的时候,body是为空的(GET只能读取服务器上的信息,post能写入)


GET /hope/ HTTP/1.1   //---请求行
Host: ce.sysu.edu.cn
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6
Cache-Control: max-age=0
Cookie:.........
Referer: http://ce.sysu.edu.cn/hope/
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36
---分割线---
POST /hope/ HTTP/1.1   //---请求行
Host: ce.sysu.edu.cn
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6
Cache-Control: max-age=0
Cookie:.........
Referer: http://ce.sysu.edu.cn/hope/
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36
...body...

Response消息的结构

也分为三部分,第一部分叫request line, 第二部分叫request header,第三部分是body request line:协议版本、状态码、message request header:request头信息 body:返回的请求资源主体

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Encoding: gzip
Content-Length: 4533
Content-Type: text/html
Date: Sun, 06 Sep 2015 07:56:07 GMT
ETag: "2788e6e716e7d01:0"
Last-Modified: Fri, 04 Sep 2015 13:37:55 GMT
Server: Microsoft-IIS/7.5
Vary: Accept-Encoding
X-Powered-By: ASP.NET
<!DOCTYPE html>
...
<>
...

getpost 区别

http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE。 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE 就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

GET 提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST 方法是把提交的数据放在HTTP包的Body中。

GET 提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

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

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

状态码

Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.

HTTP/1.1中定义了 5 类状态码。

状态码由三位数字组成,第一个数字定义了响应的类别

1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求

200 OK 
请求被成功地完成,所请求的资源发送回客户端
302 Found 
重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request
304 Not Modified 
文档已经被缓存,直接从缓存调用
400 Bad Request 
客户端请求与语法错误,不能被服务器所理解 
403 Forbidden 
服务器收到请求,但是拒绝提供服务 
404 Not Found 
请求资源不存在
500 Internal Server Error 
服务器发生了不可预期的错误 
503 Server Unavailable 
服务器当前不能处理客户端的请求,一段时间后可能恢复正常

http reauest header

http 请求头包括很多键值对,这些键值对有什么意义与作用?如何根据功能为他们分一下组呢?

  1. cache 头域

    • If-Modified-Since
      用法:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
      把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

    • If-None-Match
      用法:If-None-Match: “03f2b33c0bfcc1:0”
      If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能

    • Pragma:Pragma: no-cache
      Pargma只有一个用法, 例如: Pragma: no-cache
      作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样

    • Cache-Control
      用法:

      • Cache-Control:Public 可以被任何缓存所缓存()
      • Cache-Control:Private 内容只缓存到私有缓存中
      • Cache-Control:no-cache 所有内容都不会被缓存
        作用:用来指定Response-Request遵循的缓存机制
  2. Client 头域

    • Accept
      用法:Accept: */*,Accept: text/html
      作用: 浏览器端可以接受的媒体类型;

    • Accept: */* 代表浏览器可以处理所有回发的类型,(一般浏览器发给服务器都是发这个)

    • Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html ;如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)

    • Accept-Encoding
      用法:Accept-Encoding: gzip, deflate
      作用: 浏览器申明自己接收的文件编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是指字符编码)

    • Accept-Language
      用法:Accept-Language: en-us
      作用: 浏览器申明自己接收的语言。
      语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;

    • User-Agent
      用法: User-Agent: Mozilla/4.0……
      作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.

    • Accept-Charset
      用法:Accept-Charset:utf-8
      作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案)

    • Cookie/Login 头域

      Cookie
      
      Cookie: bdshare_firstime=1439081296143; ASP.NET_SessionId=rcqayd4ufldcke0wkbm1vhxb; pgv_pvi=7361416192; pgv_si=s6686106624; ce.sysu.edu.cn80.ASPXAUTH=9E099592DD5A414BEECD8CF43CFC71664
    • 作用: 最重要的header, 将cookie的值发送给HTTP 服务器

  3. Entity 头域
    Content-Length
    用法:Content-Length: 38
    作用:发送给HTTP服务器数据的长度。

    • Content-Type
      用法:Content-Type: application/x-www-form-urlencoded
      不常出现,一般出现在response头部,用于指定数据文件类型

    • Miscellaneous 头域

    • Referer
      用法:Referer: http://ce.sysu.edu.cn/hope/
      作用:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

  4. Transport 头域

    • Connection
      Connection: keep-alive: 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

    • Connection: close: 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接

    • Host
      用法:Host: ce.sysu.edu.cn
      作用: 请求报头域主要用于指定被请求资源的Internet主机和端口号(默认80),它通常从HTTP URL中提取出来的


HTTP Response header

  1. Cache 头域

    • Date
      用法:Date: Sat, 11 Feb 2012 11:35:14 GMT
      作用: 生成消息的具体时间和日期

    • Expires
      用法:Expires: Tue, 08 Feb 2022 11:35:14 GMT
      作用: 浏览器会在指定过期时间内使用本地缓存

    • Vary
      用法:Vary: Accept-Encoding

  2. Cookie/Login 头域

    • P3P
      用法:
      P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
      作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
    • Set-Cookie
用法: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com  
作用:非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.
  1. Entity 头域

    • ETag
      用法:ETag: “03f2b33c0bfcc1:0”
      作用: 和request header的If-None-Match 配合使用

    • Last-Modified
      用法:Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
      作用:用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)

    • Content-Type
      用法:

    Content-Type: text/html; charset=utf-8
    Content-Type:text/html;charset=GB2312
    Content-Type: image/jpeg

作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集

*   Content-Encoding  
    用法:Content-Encoding:gzip  
    作用:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
*   Content-Language  
    用法: Content-Language:da  
    WEB服务器告诉浏览器自己响应的对象的语言
  1. Miscellaneous 头域

    • Server
      用法:Server: Microsoft-IIS/7.5
      作用:指明HTTP服务器的软件信息

    • X-AspNet-Version
      用法:X-AspNet-Version: 4.0.30319
      作用:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本

    • X-Powered-By
      用法:X-Powered-By: ASP.NET
      作用:表示网站是用什么技术开发的

  2. Transport头域

    • Connection
      用法与作用:
      Connection: keep-alive:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
      Connection: close:代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接
      Location头域

    • Location
      用法:Location:http://ce.sysu.edu.cn/hope/
      作用: 用于重定向一个新的位置, 包含新的URL地址


X-Forwarded-For: client1, proxy1, proxy2, proxy3

其中的值通过一个 逗号+空格
把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址,
代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1,proxy2 及proxy3。
请求刚从client1中发出时,XFF是空的,请求被发往proxy1;
通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;
通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。
鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址,
这通常是一个比较可靠的信息来源。

Accept 定义客户端可以处理的媒体类型,按优先级排序;在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符。 Accept-Encoding 定义客户端可以理解的编码机制。例如:Accept-Encoding:gzip,compress Accept-Language 定义客户端乐于接受的自然语言列表。例如:Accept-Language: en,de Accept-Ranges 一个响应头标,它允许服务器指明:将在给定的偏移和长度处,为资源组成部分的接受请求。该头标的值被理解为请求范围的度量单位。例如Accept-Ranges: bytes或Accept-Ranges: none Age 允许服务器规定自服务器生成该响应以来所经过的时间长度,以秒为单位。该头标主要用于缓存响应。例如:Age: 30 Allow 一个响应头标,它定义一个由位于请求URI中的次源所支持的HTTP方法列表。例如:Allow: GET,PUT aUTHORIZATION 一个响应头标,用于定义访问一种资源所必需的授权(域和被编码的用户ID与口令)。例如:Authorization: Basic YXV0aG9yOnBoaWw= Cache-Control 一个用于定义缓存指令的通用头标。例如:Cache-Control: max-age=30 Connection 一个用于表明是否保存socket连接为开放的通用头标。例如:Connection: close或Connection: keep-alive Content-Base 一种定义基本URI的实体头标,为了在实体范围内解析相对URLs。如果没有定义Content-Base头标解析相对URLs,使用Content- Location URI(存在且绝对)或使用URI请求。
例如:Content-Base:http://www.myweb.com Content-Encoding 一种介质类型修饰符,标明一个实体是如何编码的。例如:Content-Encoding: zipContent-Language 用于指定在输入流中数据的自然语言类型。
例如:Content-Language: en Content-Length 指定包含于请求或响应中数据的字节长度。
例如:Content-Length:382 Content-Location 指定包含于请求或响应中的资源定位(URI)。如果是一绝。对URL它也作为被解析实体的相对URL的出发点。
例如:Content-Location: http://www.myweb.com/news Content-MD5 实体的一种MD5摘要,用作校验和。发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较。
例如:Content-MD5: Content-Range 随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。例如:Content-Range: 1001-2000/5000 Contern-Type 标明发送或者接收的实体的MIME类型。
例如:Content-Type: text/html Date 发送HTTP消息的日期。
例如:Date: Mon,10PR 18:42:51 GMT ETag 一种实体头标,它向被发送的资源分派一个唯一的标识符。对于可以使用多种URL请求的资源,ETag可以用于确定实际被发送的资源是否为同一资源。 Expires 指定实体的有效期。
例如:Expires: Mon,05 Dec 2008 12:00:00 GMT Form 一种请求头标,给定控制用户代理的人工用户的电子邮件地址。例如:From: webmaster@myweb.com Host 被请求资源的主机名。对于使用HTTP/1.1的请求而言,此域是强制性的。
例如:Host: www.myweb.com If-Modified-Since 如果包含了GET请求,导致该请求条件性地依赖于资源上次修改日期。如果出现了此头标,并且自指定日期以来,此资源已被修改,应该反回一个304响应代 码。
例如:If-Modified-Since: Mon,10PR 18:42:51 GMT If-Match 如果包含于一个请求,指定一个或者多个实体标记。只发送其ETag与列表中标记区配的资源。
例如:If-Match: '208f-419e-308dc99' If-None-Match 如果包含一个请求,指定一个或者多个实体标记。资源的ETag不与列表中的任何一个条件匹配,操作才执行。
例如:If-None-Match: '208f-419e-308dc99' If-Range 指定资源的一个实体标记,客户端已经拥有此资源的一个拷贝。必须与Range头标一同使用。如果此实体自上次被客户端检索以来,还不曾修改过,那么服务器 只发送指定的范围,否则它将发送整个资源。
例如:Range: byte=0-499<CRLF>If-Range:'208f-419e-30f8dc99' If-Unmodified-Since 只有自指定的日期以来,被请求的实体还不曾被修改过,才会返回此实体。
例如:If-Unmodified-Since:Mon,10PR 18:42:51 GMT Last-Modified 指定被请求资源上次被修改的日期和时间。
例如:Last-Modified: Mon,10PR 18:42:51 GMT Location 对于一个已经移动的资源,用于重定向请求者至另一个位置。与状态编码302(暂时移动)或者301(永久性移动)配合使用。
例如:Location: http://www2.myweb.com/index.jsp Max-Forwards 一个用于TRACE方法的请求头标,以指定代理或网关的最大数目,该请求通过网关才得以路由。在通过请求传递之前,代理或网关应该减少此数目。
例如:Max-Forwards: 3 Pragma 一个通用头标,它发送实现相关的信息。例如:Pragma: no-cache Proxy-Authenticate 类似于WWW-Authenticate,便是有意请求只来自请求链(代理)的下一个服务器的认证。
例如:Proxy-Authenticate: Basic realm-admin Proxy-Proxy-Authorization 类似于授权,但并非有意传递任何比在即时服务器链中更进一步的内容。
例如:Proxy-Proxy-Authorization: Basic YXV0aG9yOnBoaWw= Public 列表显示服务器所支持的方法集。
例如:Public: OPTIONS,MGET,MHEAD,GET,HEAD Range 指定一种度量单位和一个部分被请求资源的偏移范围。
例如:Range: bytes=206-5513 Refener 一种请求头标域,标明产生请求的初始资源。对于HTML表单,它包含此表单的Web页面的地址。
例如:Refener: http://www.myweb.com/news/search.html Retry-After 一种响应头标域,由服务器与状态编码503(无法提供服务)配合发送,以标明再次请求之前应该等待多长时间。此时间即可以是一种日期,也可以是一种秒单位。
例如:Retry-After: 18 Server 一种标明Web服务器软件及其版本号的头标。
例如:Server: Apache/2.0.46(Win32) Transfer-Encoding 一种通用头标,标明对应被接受方反向的消息体实施变换的类型。
例如:Transfer-Encoding: chunked Upgrade 允许服务器指定一种新的协议或者新的协议版本,与响应编码101(切换协议)配合使用。
例如:Upgrade: HTTP/2.0 User-Agent 定义用于产生请求的软件类型(典型的如Web浏览器)。例如:User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT; DigExt) Vary 一个响应头标,用于表示使用服务器驱动的协商从可用的响应表示中选择响应实体。
例如:Vary: * Via 一个包含所有中间主机和协议的通用头标,用于满足请求。
例如:Via: 1.0 fred.com, 1.1 wilma.com Warning 用于提供关于响应状态补充信息的响应头标。
例如:Warning: 99 www.myweb.com Piano needs tuning www-Authenticate 一个提示用户代理提供用户名和口令的响应头标,与状态编码401(未授权)配合使用。响应一个授权头标。
例如:www-Authenticate: Basic realm=zxm.mgmt

http-equiv属性 

http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值。 

meta标签的http-equiv属性语法格式是: 

<metahttp-equiv="参数"content="参数变量值">; 

其中http-equiv属性主要有以下几种参数: 

A、Expires(期限) 

说明:可以用于设定网页的到期时间。一旦网页过期,必须到服务器上重新传输。 

用法:<metahttp-equiv="expires"content="Fri,12Jan200118:18:18GMT"> 

注意:必须使用GMT的时间格式。 

B、Pragma(cache模式) 

说明:禁止浏览器从本地计算机的缓存中访问页面内容。 

用法:<metahttp-equiv="Pragma"content="no-cache"> 

注意:这样设定,访问者将无法脱机浏览。 

C、Refresh(刷新) 

说明:自动刷新并指向新页面。 

用法:<metahttp-equiv="Refresh"content="2;URL=http://www.jb51.net">(注意后面的引号,分别在秒数的前面和网址的后面) 

注意:其中的2是指停留2秒钟后自动刷新到URL网址。 

D、Set-Cookie(cookie设定) 

说明:如果网页过期,那么存盘的cookie将被删除。 

用法:<metahttp-equiv="Set-Cookie"content="cookievalue=xxx;expires=Friday,12-Jan-200118:18:18GMT;path=/"> 

注意:必须使用GMT的时间格式。 

E、Window-target(显示窗口的设定) 

说明:强制页面在当前窗口以独立页面显示。 

用法:<metahttp-equiv="Window-target"content="_top"> 

注意:用来防止别人在框架里调用自己的页面。 

F、content-Type(显示字符集的设定) 

说明:设定页面使用的字符集。 

用法:<metahttp-equiv="content-Type"content="text/html;charset=gb2312"> 

G、content-Language(显示语言的设定) 

用法:<metahttp-equiv="Content-Language"content="zh-cn"/> 

H、Cache-Control指定请求和响应遵循的缓存机制。 

在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。

请求时的缓存指令包括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。

各个消息中的指令含义如下 
Public 指示响应可被任何缓存区缓存  

Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。
这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效 

no-cache 指示请求或响应消息不能缓存 

no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 

max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应 

min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应 

max-stale 指示客户机可以接收超出超时期间的响应消息。

如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
CATALOG
  1. 1. Begin:
  2. 2. 无状态的协议
    1. 2.1. Http消息结构
    2. 2.2. 状态码
    3. 2.3. http reauest header
    4. 2.4. HTTP Response header