【计网】HTTP协议详解

HTTP概述

  • HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

  • HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

  • RFC 1945定义了HTTP/1.0版本,又于1999年推出了HTTP/1.1版本,该版本是现在广泛使用的HTTP协议版本。

HTTP1.0 与 HTTP 1.1 的区别

1.长连接

  • HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接。

  • HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。

2.Host头域

  • HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名

  • HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)

3.错误提示

  • HTTP/1.0中只定义了16个状态响应码

  • HTTP/1.1中新增了24个状态响应码

4.缓存

  • HTTP/1.0中,使用Expire头域来判断资源的fresh或stale,并使用条件请求(conditional request)来判断资源是否仍有效

  • HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)

5.Transfer Codings

  • HTTP/1.0中,有一个Content-MD5的头域,要计算这个头域需要发送方缓冲完整个消息后才能进行。

  • HTTP1.1支持chunked transfer,所以可以有Transfer-Encoding头部域,发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。这种方法允许发送方只缓冲消息的一个片段,避免缓冲整个消息带来的过载

注:我在之后讲的是HTTP1.1协议。

HTTP协议的特点

1.简单快速

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

2、灵活

HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记,基于TCP协议。

3.无连接

限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

4.无状态

协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

5、支持B/S及C/S模式。

HTTP 的请求报文结构

【计网】HTTP协议详解_第1张图片

分析:由上图可以看出,请求报文由请求行、请求头、(头部结束标志:空行)、请求正文组成,接下来进行详细介绍。

1.请求行中的方法

(1)GET:获取资源

GET方法用来请求访问已被URI识别的资源,指定的资源经服务器端解析后返回响应内容。

(2)POST:传输实体主体

POST方法用来传输实体的主体。给服务器添加信息(例如,注释)

(3)HEAD:获得报文首部

HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性和资源更新的日期时间等,请求读取由 URL所标志的信息的首部。

(4)PUT:传输文件

PUT方法用来传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。

注:由于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,所以一般不使用该方法。

(5)DELETE:删除文件

DELETE方法用来删除文件。DELETE方法按请求URI删除指定的资源。但是和PUT一样不带验证机制,所以一般也不是用该方法。

(6)OPTIONS:询问支持的方法

OPTIONS方法用来查询针对请求URI指定的资源支持的方法。

(7)TRACE:追踪路径

TRACE方法时让Web服务器端将之前的请求通信环回给客户端的方法。用来进行环回测试的请求报文。

(8)CONNECT:用于代理服务器,要求用隧道协议连接代理

CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输安全层)协议把通信内容加密后经网络隧道传输。

2.请求行中的URL

(1)URL的格式:

http://host[“:”port][abs_path]

(2)含义

  • host: 代表主机域名或IP地址
  • port: 端口号,缺省端口80
  • abs_path : 请求资源的URL,如果没有,填 “/”,通常浏览器会帮我们自动完成。

(3)实例

例:输入网址:www.blog.csdn.net 浏览器自动转换成:http://blog.csdn.net/

3.请求行中的版本

一般情况是HTTP1.1 或 HTTP1.0

4.一个请求报文的实例

GET /day09/hello HTTP/1.1    //请求行
Host: localhost:8080         //请求头(多个key-value对象) 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
                          //一个空行
name=abc&password=xyz     //实体内容(可选)

HTTP 的响应报文结构

【计网】HTTP协议详解_第2张图片

分析:由上图可以看出,响应报文由状态行、响应头、(头部结束标志:空行)、响应实体组成,接下来进行详细介绍。

1.状态行中的版本

一般情况是HTTP1.1 或 HTTP1.0

2.状态行中的状态码

(1) 1xx 信息性状态码, 表示接收的请求正在处理

  • 100 Continue : 客户端应继续其请求

  • 101 Switching Protocols 服务器根据客户端的请求切换协议。只能切换到更高级的协议。

(2)2xx 成功状态码,表示请求正常处理完毕

  • 200 OK :从客户端发来的请求在服务器端处理成功了。

  • 201 Created :成功请求并创建了新的资源

  • 202 Accepted 已经接受请求,但未处理完成

  • 203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本

  • 204 No Content:该状态码代表服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分。

  • 205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域

  • 206 Partial Content:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的请求。响应报文中包含由Content-Range指定范围的实体内容。

(3)3xx 重定向状态码 表示需要进行附加操作以完成请求

  • 300 Multiple Choices :请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择

  • 301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应该使用现在资源所指的URI。

  • 302 Found:临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问。

  • 303 See Other:该状态码表示由于请求对应的资源存在着另外一个URI,应使用GET方法定向获取请求的资源。

  • 304 Not Modified:该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后直接返回304。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。

  • 305 Use Proxy :所请求的资源必须通过代理访问

  • 306 Unused 已经被废弃的HTTP状态码

  • 307 Temporary Redirect:临时重定向。该状态码与302 Found有着相同的含义。

(4)4xx 客户端错误状态码 ,表示客户端出现错误。

  • 400 Bad Request:该状态码表示请求报文中存在语法错误。

  • 401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。

  • 402 Payment Required: 保留,将来使用

  • 403 Forbidden:服务器收到请求,但是拒绝提供服务

  • 404 Not Found:该状态码表明服务器上无法找到请求的资源。

  • 405 Method Not Allowed :客户端请求中的方法被禁止

  • 406 Not Acceptable :服务器无法根据客户端请求的内容特性完成请求

(5)5xx 服务端错误状态码 ,表示服务器处理请求出错

  • 500 Internal Server Error:该状态码表明服务器端在执行请求时发生了错误,也有可能是Web应用存在的Bug或某些临时的故障。

  • 501 Not Implemented :服务器不支持请求的功能,无法完成请求

  • 502 Bad Gateway :充当网关或代理的服务器,从远端服务器接收到了一个无效的请求

  • 503 Service Unavailable:该状态码表明服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。

  • 504 Gateway Time-out :充当网关或代理的服务器,未及时从远端服务器获取请求

  • 505 HTTP Version not supported :服务器不支持请求的HTTP协议的版本,无法完成处理

3.一个响应报文的实例

HTTP/1.1 200 OK    //状态行
Server: Apache-Coyote/1.1   //响应头
Content-Length: 24
Date: Fri, 30 Jan 2015 01:54:57 GMT
                  //空行
this is hello servlet!!!   //响应实体

HTTP消息报头

1.普通报头

(1)定义

应用于所有请求和响应消息且和请求体与响应体无关的信息就存放在普通报头中。

(2)内容

  • Cache-Control: no-cache (用于指示请求或响应消息不能缓存)

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

  • Connection: close/keep-alive (是否开启长连接)

  • Pragma:仅作为向后兼容而定义的。它只用在客户端发送的请求中,要求中间服务器不返回缓存的资源(no-cache)。

  • Trailer:首部字段Trailer会事先说明在报文主体后记录了哪些首部字段,该首部字段可应用在HTTP/1.1版本分块传输编码时。

  • Transfer-Encoding:首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。

  • Upgrade:首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

  • Via:使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径,还可以避免请求回环的发生。报文经过代理或网关时,会先在受不字段Via中附加该服务器的信息,然后再进行转发。

  • Warning:首部字段Warning会告知用户一些与缓存相关的问题的警告

2 .请求报头

(1)定义

客户端向服务器端传递请求的附加信息以及客户端自身的信息存放在请求报头
常用的请求报头:

(2)内容

  • Accept:首部字段可通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。

    • 例:Accept: text/plain; q=0.3, text/htm
  • Accept-Charset:首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序

    • 例:Accept-Charset: iso-8859-5, unicode-1-1; q=0.8
  • Accept-Encoding:首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。

    • 例:Accept-Encoding: gzip, deflate
  • Accept-Language:首部字段用来告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。

    • 例:Accept-Language: zh-cn,zh; q=0.7, en-us,en; q=0.3
  • Authorization:首部字段是用来告知服务器用户代理的认证信息。

  • Expect:客户端使用Expect来告知服务器,期望出现的某种特定行为。如果服务器无法理解客户端的期望而发生错误时,会返回417 Expectation Failed。

  • Form首部字段用来告知服务器使用用户代理的用户的电子邮件地址。

  • Host:告知服务器,请求的资源所处的互联网主机名和端口号。它是唯一一个必须被包含在请求内的首部字段。当相同的IP地址下部署运行着多个域名,就需要使用首部字段Host来指出请求的主机名。

    • 例:Host: sp0.baidu.com
  • If-xxx:分为If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Ranged条件请求,服务器接收到附带条件的请求后,只有判定指定条件为真时才会执行请求。

  • Max-Forwards:通过TRACE或OPTIONS方法发送包含首部字段Max-Forwards的请求时,指定了可经过的服务器最大数目。当服务器接收到Max-Forward值为0的请求时,则不再进行转发,而是直接返回响应。

    • 例:Max-Forwards: 6
  • Proxy-Authorization:接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。

  • Range:对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。格式如下,表示请求获取5001字节到10000字节的资源:

    • 例:Range: bytes=5001-10000
  • Referer:告知服务器请求的原始资源的URI。

  • TE:告知服务器客户端能够处理响应的传输编码方式及相对优先级。

    • 例:TE: gzip, deflate; q=0.5
  • User-Agent:首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。

    • 例:User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36

3.响应报头

(1)定义

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

(2)内容

  • Accept-Ranges:告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。当可处理范围请求时其值为bytes,否则会none。

    • 例:Accept-Ranges: bytes
  • Age:告知客户端,源服务器在多久前创立了响应,单位为秒。若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。

    • 例:Age: 300
  • ETag:告知客户端实体标识。它是一种可将资源以字符串形式做唯一标识的方式,服务器会为每份资源分配对应的ETag值。

  • Location:将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3xx Redirection的响应,提供重定向的URI。

  • Proxy-Authenticate:把由代理服务器所要求的认证信息发送给客户端。

  • Retry-After:告知客户端应该在多久之后再次发送请求,主要配合状态码503 Service Unavailable响应或3xx Redirect响应一起使用。字段值可以是具体日期,也可以是秒数,

    • 例:Retry-After: 120
  • Server:告知客户端当前服务器上安装的HTTP服务器应用程序的信息。

    • 例:Server: Apache
  • Vary:可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。

  • WWW-Authenticate:用于HTTP访问认证。它会告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的质询。

4.实体报头

(1)定义

请求和响应消息都可以传送一个实体。

  • Content-Encoding:告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码食指在不丢失实体信息的前提下所进行的压缩。

    • 例:Content-Encoding: gzip
  • Content-Language:告知客户端,实体主体使用的自然语言。

    • 例:Content-Language: zh-CN
  • Content-Length:表明了实体主体部分的大小(字节)。

    • 例:Content-Length: 15000
  • Content-Location:给出与报文主体部分相对应的URI。和首部字段Location不同,Content-Location表示的是报文主体返回资源对应的URI。

  • Content-MD5:一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完成,以及确认传输到达。

  • Content-Range:针对范围请求,返回响应时使用的首部字段,能告知客户端作为响应返回的实体的哪个部分符合范围请求。

    • 例:Content-Range: bytes 5001-10000/100000
    • 表示一共10000字节,返回第5001-10000字节:
  • Content-Type:说明了实体主体内对象的媒体类型,和首部字段Accept一样,字段值用type/subtype形式赋值。

  • Expires:将资源失效的日期告知客户端,缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送来时,会转向源服务器请求资源。

  • Last-Modified:指明资源最终修改的时间。

HTTP的缺点

1.通信使用明文,内容可能会被窃听

2.不验证通信方的身份,因此有可能遭遇伪装

3.无法验证报文的完整性,所以有可能已遭篡改

解决方法:使用HTTPS,它是在HTTP上再加入加密处理和认证等机制,解决了以上几个问题。

小疑问

1.GET与POST方法的区别

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

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

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

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



本人才疏学浅,若有错,请指出
谢谢!

参考资料:《计算机网络 第六版》-谢希仁

你可能感兴趣的:(计算机网络)