浅学HTTP协议

1 什么是HTTP协议

HTTP(HyperText Transfer Protocol) 即超文本传输协议,现在基本上所有web项目都遵从HTTP协议;
目前绝大部分使用的都是HTTP/1.1版本,另外还有已经淘汰的1.0和未普及使用的2.0(2.0只用于https网址);
HTTP协议是属于TCP/IP协议簇;

2 什么是TCP/IP协议簇

互联网协议族(Internet Protocol Suite,缩写IPS)是一个网络通信模型,以及一整个网络传输协议家族,
为互联网的基础通信架构。它常被通称为TCP/IP协议族(TCP/IP Protocol Suite,或TCP/IP Protocols),
简称TCP/IP。TCP/IP协议族分层详解

3 TCP/IP四层模型

TCP/IP按照层次从上至下分为四层:应用层,传输层,网络层,数据链路层

浅学HTTP协议

4 TCP/IP如何通信

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。这种把数据信息包装起来的做法称为封装(encapsulate)。
  • 封装

浅学HTTP协议

  • 分用

浅学HTTP协议

负责传输的IP协议

  • 按层次分,IP(Internet Protocol)网际协议位于网络层。TCP/IP协议族中的IP指的就是网际协议,协议名称中占据了一半位置,其重要性可见一斑。可能有人会把IP和IP地址搞混,IP其实是一种协议的名称。
  • IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址(Media Access Control Address)。IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。
  • 使用ARP协议凭借MAC地址进行通信。IP间的通信依赖MAC地址。在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用ARP协议(Address Resolution Protocol)。ARP 是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。
  • 没有人能够全面掌握互联网中的传输状况,即在传输过程中每一个节点只需要了解下一个节点的信息,再往下的信息就交给下个节点去处理就行了。

浅学HTTP协议

确保可靠性的TCP协议

  • 按层次分,TCP位于传输层,提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。
  • 确保数据能到达目标。为了准确无误地将数据送达目标处,TCP协议采用了三次握手(three-way handshaking)策略。用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志 ——SYN(synchronize) 和ACK(acknowledgement)。发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表握手结束。若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。除了上述三次握手,TCP协议还有其他各种手段来保证通信的可靠性。

浅学HTTP协议

负责域名解析的DNS服务

  • DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。计算机既可以被赋予IP地址,也可以被赋予主机名和域名。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。

浅学HTTP协议

5 HTTP协议与其他TCP/IP协议如何协作

浅学HTTP协议

6 什么是URI和URL

URI是Uniform Resource Identifier的缩写,即统一资源标识符。

RFC2396分别对这3个单词进行了如下定义:

  • Uniform :规定统一的格式可方便处理多种不同类型的资源, 而不用根据上下文环境来识别资源指定的访问方式。另外, 加入新增的协议方案(如http:或ftp:) 也更容易。
  • Resource :资源的定义是可标识的任何东西。 除了文档文件、 图像或服务(例如当天的天气预报) 等能够区别于其他类型的, 全都可作为资源。 另外, 资源不仅可以是单一的, 也可以是多数的集合体。
  • Identifier :表示可标识的对象。 也称为标识符。

综上所述,URI就是由某个协议方案表示的资源的定位标识符。 协议方案是指访问资源所使用的协议类型名称。 采用HTTP协议时, 协议方案就是http。 除此之外,常见还有ftp、file、mailto、telnet等(共30多种)。

URI用字符串标识某一互联网资源, 而URL表示资源的地点(互联网上所处的位置)。 可见URL是URI的子集。(当然通常可以大致把URL理解成URI)

URI的格式

要想表示指定的资源, 就得使用涵盖全部必要信息的绝对URI,同样的也会有相对URI。这里以相对URL为例,就是指从浏览器中基本URL处指定的URL,形如/image/logo.gif这种形式。

浅学HTTP协议

  • 协议方案名:使用http:或https:等协议方案名获取访问资源时要指定协议类型。 不区分字母大小写, 最后附一个冒号(:)。也可使用data:或javascript:这类指定数据或脚本程序的方案名。

RFC : Request for Comments, 征求修正意见书。一些用来制定HTTP协议技术标准的文档,当然并不是强制性的,所以还是有一小部分应用程序并没有遵从RFC标准,这也就导致了其他应用不同标准的互联网资源可能就无法与该应用程序进行通讯了。

RFC3986列举了几种URI的常用语法格式:

  1. tp://ftp.is.co.za/rfc/rfc1808.txt
  2. http://www.ietf.org/rfc/rfc23...
  3. ldap://[2001:db8::7]/c=GB?objectClass?one
  4. mailto:John.Doe@example.com
  5. news:comp.infosystems.www.servers.unix
  6. tel:+1-816-555-1212
  7. telnet://192.0.2.16:80/
  8. urn:oasis:names:specification:docbook:dtd:xml:4.1.2

7 HTTP协议通信过程

HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换个意思就是客户端建立通信的,服务器端在没有接收到请求之前不会发送响应。来一个示例:

浅学HTTP协议

客户端向服务端发送内容:

GET / HTTP/1.1
HOST: HACKR.JP

起始行开头的GET表示请求访问服务器的类型, 称为方法(method) 。 随后的字符串/index.htm指明了请求访问的资源对象,也叫做请求URI(request-URI) 。 最后的HTTP/1.1, 即HTTP的版本号, 用来提示客户端使用的HTTP协议功能。
总结:请求报文是由请求方法、 请求URI、 协议版本、 可选的请求首部字段和内容实体构成的。

接下来服务器端接收到请求,会将请求内容的处理结果以相应的形式返回:

HTTP /1.1 200 OK
Date:Tue,10 JUL 2016 10:50:20 GMT
Content-length:398
Content-Type:text/html

浅学HTTP协议

HTTP协议是无状态的协议

HTTP是一种不保存状态, 即无状态(stateless) 协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。

使用HTTP协议, 每当有新的请求发送时, 就会有对应的新响应产生。 协议本身并不保留之前一切的请求或响应报文的信息。 这是为了更快地处理大量事务, 确保协议的可伸缩性, 而特意把HTTP协议设计成如此简单的。为了实现【期望的保存状态】功能,引入了Cookis技术。有了Cookie 再用HTTP协议通信,就可以管理状态了。

请求URI定位资源

浅学HTTP协议

【HTTP/1.0】和【HTTP/1.1】支持的方法

浅学HTTP协议


GET:获取资源

浅学HTTP协议

浅学HTTP协议


POST:传输实体主体

  • 虽然用GET方法也可以传输实体的主体, 但一般不用GET方法进行传输, 而是用POST方法。 虽说POST的功能与GET很相似, 但POST的主要目的并不是获取响应的主体内容。

浅学HTTP协议

浅学HTTP协议


PUT:传输文件

  • PUT方法用来传输文件。 就像FTP协议的文件上传一样, 要求在请求报文的主体中包含文件内容, 然后保存到请求URI指定的位置。由于put的方法不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的web网站不适用该方法。

浅学HTTP协议


HEAD: 获得报文首部

  • HEAD方法和GET方法一样, 只是不返回报文主体部分。 用于确认URI的有效性及资源更新的日期时间等。

浅学HTTP协议


DELETE: 删除文件

  • DELETE方法用来删除文件, 是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。 但是,HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制, 所以一般的Web网站也不使用DELETE方法。 当配合Web应用程序的验证机制, 或遵守REST标准时还是有可能会开放使用的。

浅学HTTP协议

浅学HTTP协议


OPTIONS: 询问服务器支持的方法

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

浅学HTTP协议


TRACE: 追踪路径

  • TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。

浅学HTTP协议


CONNECT: 要求用隧道协议连接代理

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

浅学HTTP协议

浅学HTTP协议


HTTP状态码

2XX 成功

  • 200 OK
  • 204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要使用返回数据时使用。
  • 206 Partial Content :表示客户端进行了范围请求。响应报文包含由 Content-Range 指定范围的实体内容。

3XX 重定向

  • 301 Moved Permanently :永久性重定向
  • 302 Found :临时性重定向
  • 303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。

注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会 在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。

  • 304 Not Modifie :如果请求报文首部包含一些条件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,但是不满足条件,则服务器会返回 304 状态码。
  • 307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。

4XX 客户端错误

  • 400 Bad Request :请求报文中存在语法错误。
  • 401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC认证、DIGEST认证)。如果之前已经进行过一次请求,则表示用户认证失败。
  • 404 Not Found :服务器正在执行请求时发生错误。

5XX 服务器错误

  • 500 Internal Server Error :服务器正在执行请求时发生错误。
  • 503 Service Unavilable :服务器暂时出于超负荷状态或正在进行停机维护,现在无法处理请求。

持久化

当频繁访问web网页的时候,每次都要进行TCP/IP通信,TCP/IP通信三次握手四次断开,代价是很昂贵的,增加了通信量的开销,为解决上述TCP连接的问题,HTTP就诞生了持久连接的方法。特点是只要任意一端没有明确提出断开连接,则保持TCP连接状态。

  • HTTP初始版本中,每进行一次HTTP通信就要断开一次TCP连接

浅学HTTP协议

  • 初始版本中,HTML文档的传输方式

浅学HTTP协议

  • 持久连接

HTTP keep-alive 特点:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
其好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务端的负载。【在HTTP/1.1中,所有的连接默认都是持久连接】,示例:

浅学HTTP协议

  • 管线化

持久连接 使得多数请求以【管线化pipelining】方式发生成为可能。

浅学HTTP协议

使用Cookie的状态管理

  • 如果让服务器管理全部客户端状态 则会成为负担

Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态

浅学HTTP协议

报文示例:

浅学HTTP协议

相关推荐