HTTP协议学习随笔

简介

HTTP(Hyper Text Transfer Protocol),超文本传输协议,是一种建立在TCP上的无状态连接。一次完整的传输过程的基本流程如下:

  1. 客户端向服务端发送一个HTTP请求,说明客户端想访问的资源及操作
  2. 服务端接受到请求,根据请求进行相应的操作
  3. 服务端向客户端发送一个HTTP响应,把响应结果返回给客户端

一个请求的开始到一个响应的结束称为一个事务,。当一个事务结束后,服务端需要添加一条相应的日志记录。

   

HTTP请求

HTTP请求是客户端向服务端发送的报文 ,告知服务站自己的需求。

HTTP请求的报文分为三部分:

状态行

包含3部分:请求方式(Method)、资源路径(URL)、协议版本(Version)

请求头

包含关于请求的细节信息

请求正文

对请求操作的进一步补充,通常为空

举个例子,使用Charles抓包工具抓包的结果:

   

HTTP请求报文的格式入下图:

每个部分使用\r\n分隔,其中状态行的三个部分使用空格分隔。请求正文请求头间,又一组\r\n分隔

   

状态行的Method部分,在HTTP 1.0定义了三种方式:GETPOST、HEAD。在HTTP 1.1又新增了五种方式:OPTIONS、PUT、DELETE、TRACE、CONNECT。最常用的为GET和POST。详细可以参考《HTTP请求方法对照表》。

状态行的URL部分,只保存分级路径部分,不保存服务器名。

状态行的Version部分,保存HTTP协议版本,目前主流是HTTP/1.1。

   

请求头部分,有多组头域组成,每个头域由一个域名,冒号(:)和域值三部分组成。下文《HTTP头域》小结会详细描述。

   

HTTP请求报文的主体部分,通常不使用。

   

HTTP响应

服务端接受客户端的HTTP请求后,服务端会根据请求完成具体操作,之后将结果通过HTTP响应,返回给客户端。

HTTP响应的报文分也为三部分:

状态行

包含3部分:版本(Version)、状态码(Status-Code)、短语(Phrase)

响应头

包含关于响应结果的细节信息

响应正文

请求的结果

举个例子,使用Charles抓包工具抓包的结果:

   

HTTP响应的报文格式如下:

结构与HTTP请求的报文格式基本相同。

   

状态行的Version部分,保存HTTP协议版本。

状态行的Status-code部分,为一个3位数的整数,表示对请求的处理状态,常见的状态码有:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

状态码的第一个数字,定义的状态码的类型,状态码共分为5类:

1xx        

表示HTTP请求已经接受,继续处理请求

2xx        

表示HTTP请求已经处理完成

3xx        

表示把请求访问的URL重定向到其他目录

4xx        

表示客户端出现错误

5xx        

表示服务端出现错误

状态行的Phrase部分,是对状态码的简单描述。

对状态码的详细描述,可以参考《HTTP状态码对照表》。

   

响应头部分与请求头部分相同,同样有头域组成,是对响应结果的描述。通常会包含Content-Type头域,描述返回内容的MIME类型。HTTP协议支持的MIME类型可以参考《HTTP Content-type 对照表

   

响应正文就服务端向客户端返回的内容,可以是文本、图片、音频等各种类型的二进制数据,类型由响应头的Content-Type头域描述。

   

HTTP头域

HTTP请求头(响应头)提供了关于请求,响应或者其他的发送实体的信息。HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。

  • 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
  • 请求头标:允许客户端传递关于自身的信息和希望的响应形式。
  • 响应头标:服务器和于传递自身信息的响应。
  • 实体头标:定义被传送资源的信息。即可用于请求,也可用于响应。

   

常用的有:

  • Accept,指定客户端能够接受的内容格式
  • User-Agent,用户代理,向服务器说明自己的操作系统、浏览器等信息
  • Connection,是否开启持久连接
  • Host,服务器域名
  • Content-Type,返回内容的MIME类型

其他跟多的请求头头域,可以参考《HTTP Request Header》、《HTTP头信息总结

   

HTTP版本

HTTP发展至今,经历的多个版本的更替,虽然已经提出了HTTP/2.0版本,但目前主流依然是HTTP/1.1版本

HTTP/0.9

仅支持GET方法,仅能访问HTML格式的资源

HTTP/1.0

添加了POST和HEAD方法;

可以根据Content-Type,传输多种MIME类型的资源;

支持cache。

HTTP/1.1

添加了OPTIONS, PUT, DELETE, TRACE 和 CONNECT方法;

加入了持久连接(keepalive),一个TCP连接可以允许多个HTTP请求;

加入了管道机制,一个TCP连接同时允许多个请求同时发送。

HTTP/2.0

增加双工模式;

使用索引号访问头域信息,并以压缩的方式传输。

   

进阶

想深入学习HTTP协议,可以参考以下两本书籍:

《图解HTTP》

《HTTP权威指南》

   

参考

http://blog.51cto.com/13570193/2108347

   

   

posted on 2019-01-09 10:57  foundkey  阅读(244)  评论(0编辑  收藏  举报

导航