———— HTTP协议详细总结 ————

HTTP超文本传输协议,是WWW上应用的最多的协议。了解和掌握HTTP协议是对程序人员的基本要求。

一、HTTP介绍

  HTTP是一个基于请求/响应模式的、无状态的协议。即,浏览器与服务端连接之后,浏览器向服务器发送一个请求,服务器返回响应信息之后,双方的链接就被关闭。我们要知道,应用层的HTTP要使用传输层的TCP协议来完成。而TCP协议是通过“3次握手”建立连接,是面向连接的协议。默认情况下,浏览器与Web服务器上80端口监听的服务器程序建立TCP连接。

  HTTP1.0是典型的请求/响应模式。为了减少服务器的开销,HTTP1.1默认有“持续连接”的机制。通过这种机制,客户端发送请求得到响应后,连接不会马上关闭,可以继续发送请求,还可以流水线发送多个请求、而不用等待每一个响应的到来。

二、URI和URL

  URI(统一资源标识符)纯粹是一种符号结构,用于指定构成Web资源的字符串的各个不同部分。而URL(统一资源定位符)是一种特殊的URI,包含了用于查找某个资源的足够信息。

  URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative
URL,则是针对另一个absolute URL,本质上还是绝对的。

三、HTTP请求

格式如图:(CRLF表示回车符+换行符,不同颜色之间用空格隔开

第一行叫做请求行。所以我们可以说HTTP请求由请求行、消息报头、请求正文组成。

1、请求行

如上,请求行以一个方法符号开头,空格之后,一个请求URI,再空格,然后一个HTTP版本,最后一个回车换行。

其中请求方法有如下几种:

我们在浏览器地址栏直接输入地址的时候,采用的就是GET方法。

HEAD方法一般用于测试超链接的有效性,因为它只是请求响应消息的报头。消息报头后面会讲。

(HTTP协议中,请求方法必须全部大写)

2、请求正文

类似name=XXX&pwd=XXXX的内容

四、HTTP响应

格式与HTTP请求类似,如图:

第一行叫做状态行。所以我们可以说HTTP响应由状态行、消息报头、响应正文组成。

1、状态行

如上,状态行由一个HTTP版本,空格后,一个状态码,再空格,一个状态码的文本描述,最后一个回车换行构成。

状态代码有3位数字组成,状态描述给出了状态代码简短的描述。状态码第一个数字定义了响应的类别,有五种可能取值:
  1xx  :  指示信息--表示请求已接收,继续处理
  2xx  :  成功--表示请求已被成功接收、理解、接受
  3xx  :  重定向--要完成请求必须进行更进一步的操作
  4xx  :  客户端错误--请求有语法错误或请求无法实现
  5xx  :  服务器端错误--服务器未能实现合法的请求

全部取值如下:

  100——客户必须继续发出请求
  101——客户要求服务器根据请求转换HTTP协议版本

  200——交易成功
  201——提示知道新文件的URL
  202——接受和处理、但处理未完成
  203——返回信息不确定或不完整
  204——请求收到,但返回信息为空
  205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
  206——服务器已经完成了部分用户的GET请求

  300——请求的资源可在多处得到
  301——删除请求数据
  302——在其他地址发现了请求数据
  303——建议客户访问其他URL或访问方式
  304——客户端已经执行了GET,但文件未变化
  305——请求的资源必须从服务器指定的地址得到
  306——前一版本HTTP中使用的代码,现行版本中不再使用
  307——申明请求的资源临时性删除

  400——错误请求,如语法错误
  401——请求授权失败
  402——保留有效ChargeTo头响应
  403——请求不允许
  404——没有发现文件、查询或URl
  405——用户在Request-Line字段定义的方法不允许
  406——根据用户发送的Accept拖,请求资源不可访问
  407——类似401,用户必须首先在代理服务器上得到授权
  408——客户端没有在用户指定的饿时间内完成请求
  409——对当前资源状态,请求不能完成
  410——服务器上不再有此资源且无进一步的参考地址
  411——服务器拒绝用户定义的Content-Length属性请求
  412——一个或多个请求头字段在当前请求中错误
  413——请求的资源大于服务器允许的大小
  414——请求的资源URL长于服务器允许的长度
  415——请求资源不支持请求项目格式
  416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
  417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求

  500——服务器产生内部错误
  501——服务器不支持请求的函数
  502——服务器暂时不可用,有时是为了防止发生系统过载
  503——服务器过载或暂停维修
  504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
  505——服务器不支持或拒绝支请求头中指定的HTTP版本

消息报头下面会讲。

2、响应正文

  所谓响应正文,就是服务器返回的资源的内容。即整个HTML文件。

五、消息报头

  HTTP请求和HTTP响应都有消息报头。而消息报头是由众多报头域组成。每一个报头域都由名字+“:”+空格组成,消息报头域的名字是大小写无关的。

HTTP消息报头包括普通报头、请求报头、响应报头和实体报头。

1、普通报头:

在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。

普通报头包括:

常见的普通报头:

1)Cache-Control

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.

2)Date

Date普通报头域表示消息产生的日期和时间

3)Connection

Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接

2、请求报头

请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

请求报头包括:

常见的请求报头:

1)Accept

Accept请求报头域用于指定客户端接受哪些类型的信息。

2)Accept-Charset

Accept-Charset请求报头域用于指定客户端接受的字符集。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

3)Accept-Encoding

Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。

4)Accept-Language

Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

5)Authorization

Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

6)Host

发送请求时,该报头域是必需的。Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP
URL中提取出来的。

7)User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就
无法得知我们的信息了。

3、响应报头

响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。

响应报头包括:

常见的实体报头:

1)Location

Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。

2)Server

Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。

3)WWW-Authenticate

WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。

4、实体报头

请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。

实体报头包括:

常见的实体报头:

1)Content-Encoding

Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding主要用于记录文档的压缩方法。

2)Content-Language

Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言
阅读者。

3)Content-Length

Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。即一个数字字符占一个字节,用其对应的ASCII码来存储传输。

4)Content-Type

Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。

5)Expires

Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。

6)Last-Modified

Last-Modified实体报头域用于指示资源的最后修改日期和时间。

六、长度限制

1、URL长度限制

1)HTTP协议中没有对URL的长度进行限制,但是Web服务器和浏览器对URI都有自己的长度限制。服务器一般是通过控制http请求头的长度来进行限制的。tomcat的请求配置参数为maxHttpHeaderSize。

2)浏览器的限制

每种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)

  IE  :  2803ASCII字符

  Firefox  :  65536ASCII字符 

  Chrome  :  8182ASCII字符

  Safari  :  80000ASCII字符

  Opera  :  190000ASCII字符

对于get请求,在url的长度限制范围之内,请求的参数个数没有限制。

2. Post数据的长度限制

Post数据的长度限制与url长度限制类似,也是在Http协议中没有规定长度限制,长度限制可以在服务器端配置最大http请求头长度的方式来实现。

3、Cookie的长度限制

1)浏览器所允许的每个域下的最大cookie数目

IE :原先为20个,后来升级为50个

Firefox: 50个

Opera:30个

Chrome:180个

Safari:无限制

当Cookie数超过限制数时浏览器的行为:IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。当然无论怎样的策略,还是尽量不要让Cookie数目超过浏览器所允许的范围。

2) 浏览器所允许的每个Cookie的最大长度

Firefox和Safari  :  4079字节

Opera  :  4096字节

IE  :  4095字节

(3) 服务器中Http请求头长度的限制。

Cookie会被附在每次http请求头中传递给服务器,因此还会受到服务器请求头长度的影响。

4. Html5 LocalStorage的长度限制

Html5提供了本地存储机制来供Web应用在客户端存储数据,尽管这个并不属于Http协议的一部分,但是随着Html5的流行,我们可能需要越来越多使用LocalStorage,甚至当它普及的时候跟它打交道就会同今天我们跟Cookie打交道一样多。

对于LocalStorage的长度限制,同Cookie的限制类似,也是浏览器针对域来限制,只不过cookie限制的是个数,LocalStorage限制的是长度:

Firefox\Chrome\Opera  :  5MB

IE  :  10MB

时间: 05-25

———— HTTP协议详细总结 ————的相关文章

I3C 总线协议详细解析(第一章)

目前随着手机等移动设备包含的sensor越来越多,传统应用在sensor上的I2C/SPI接口的局限性也越来越明显,典型的缺陷如下: 1.sensor等设备的增加,对控制总线的速度和功耗提出了更加严苛的要求: 2.虽然I2C是一中2线接口,但是往往此类device需要额外增加一条中断INT信号线: 处于解决上述问题的原因,推出了I3C的接口总线和协议,下面一起来看下I3C总线的特性. 一.I3C的应用场景 从上图中我们可以看到: 1.I3C总线可以应用在各种sensor中: 2.可以使用在任何传

传输层协议详细介绍(重点4,网络小白必备知识)

一.首先我们先了解一下传输层里面的两种协议TCP协议特点:安全,低效.UDP协议特点:高效,不安全二.TCP报文段的详细介绍TCP协议就是端和端的连接,应用到应用的通信源端口号:你自己服务或应用的端口号目标端口号:对应的别人的服务或应用的端口号我们来了解一下常用的端口号序号:发送端为每个字节编号,便于接收端正确重组确认号:用于确认发送端的消息首部长度:这个TCP头部的长度标志位:URG:紧急指针位,是1就是开启,是0就是关闭,不经过缓存直接到对方主机的应用层PSH:快速接受传递给应用层,需要经过

[javaEE] http协议详细

上一篇:http://www.cnblogs.com/taoshihan/p/5346731.html HTTP请求 请求行 GET /taoshihan/p/5346731.html HTTP/1.1 请求方式——请求资源名称 ——所遵循的协议 (POST,GET,DELETE,PUT,HEAD,OPTIONS,TRACE) GET一般要求不能超过1k,POST传输没有大小限制 请求头 Host: www.cnblogs.com 主机名 Connection: keep-alive 连接信息

HTTP协议详细分析

1.HTTP概述 1.1.什么是HTTP? 它是Hyper Text Transfer Protocol的缩写.超文本传输协议. 它是客户浏览器和web服务器之间的一种一问一答的规则.问答机制/握手机制. 1.2.HTTP版本 1.0版本: 创建连接(TCP/IP) 发送请求 接收响应 关闭连接 1.1版本: 创建连接(TCP/IP) 发送请求1 接收响应1 发送请求2 接收响应2........ 请求超时(手动关闭) 1.1版本比1.0版本多了几个消息头 1.3.特殊说明 当浏览器发现scri

http协议详细介绍

HTTP协议/IIS 原理及ASP.NET运行机制浅析[图解] 转自:http://www.cnblogs.com/wenthink/archive/2013/05/06/HTTP_IIS_ASPNET_Pipeline.html 前一段在整理邮件的时候发现几年前和CDD老师交流时的一份邮件.下面是简单摘要: “从技术角度来说,无论哪一个阵营,跟新技术都是不可避免的,也是很累的,当然作为一个程序员来说,也是必须的.要想让技术的更新对自己的影响减小,基础就必须打牢.所以,底层的东西和抽象层的东西需

MSTP协议详细介绍

MSTP概述MSTP是多生成树协议,允许一个交换环境中运行多个生成树,每个生成树称为一个实例,MSTP将路由环路网络修剪成一个无环的树形网络,避免广播风暴的产生,同时还提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡,MSTP还兼容STP和RSTP.MSTP的基本原理(1)MSTP的网络层次一个二层交换网络可以划分多个MST域,每个生成树域可以划分多个MSTI,每个实例中可以映射多个VLAN(2)MST域MST域是多生成树域,由局域网中的多台交换机他们之间的网段构成一个局

Java Web -- Servlet(9) Http协议详细分析--HTTP响应部分(Refresh、Content-Disposition、缓存例子)(2)

三.HTTP响应 一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行.若干消息头.以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开. (1)状态行 状态行用于描述服务器对请求的处理结果. (2)消息头 消息头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据. (3)实体内容 代表服务器向客户端回送的数据. 状态行 格式:HTTP版本号 状态码 原因叙述 举例:HTTP/1.1 2

流媒体传输协议系列之----RTP/RTCP协议解析

RTP协议 实时传输协议RTP(Real-time Transport Protocol)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的,后在RFC3550中进行更新. 国际电信联盟ITU-T也发布了自己的RTP文档,作为H.225.0,但是后来当IETF发布了关于它的稳定的标准RFC后就被取消了.它作为因特网标准在[ RFC 3550 ]有详细说明. RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式.它一开始被设计为一个多播协议,但后来被

HTTP1.1协议详解

1.3协议详细讲解 请求行:GET /App1/1.html HTTP/1.1 GET:请求方式.默认的请求方式.其他常用的请求方式还有POST. GET的特点:默认的请求方式. /App1/c.html?username=sdsfds&password=234324 把表单的请求的数据放在了请求的URI的后面.?username=sdsfds&password=234324 这样不好:暴露数据:请求行长度有限. POST的特点(经常使用的):借助HTML中的form表单.<form