HTTP协议

HTTP协议是一种规范,制定了从客户端到服务端等一系列运作的流程(读书笔记)

介绍


HTTP协议(HyperText Transfer Protocal,通俗叫做超文本传输协议,严谨译名为超文本转移协议),是Web的一种规范,完成从客户端到服务器端一系列的运作流程规范。

诞生


1989年3月,HTTP诞生。
最初,CERN(欧洲核子研究组织)的蒂姆·博纳斯-李(Tim BernersLee)博士提出了一种能让远隔两地的研究者们共享知识的设想。
基本理念是:借助多文档之间关联形成的超文本,连成可相互参阅的WWW(World Wide Web,万维网)
现在已提出了3项WWW构建技术:

  1. HTML(HyperText Markup Launguage,超文本标记语言):把SGML(Standard Generalized Markup Launguage,标准通用标记语言)作为页面的文本标记语言。
  2. HTTP:作为文档传递协议的HTTP
  3. URL(Uniform Resource Locator,统一资源定位符):制定文档所在地址

WWW(World Wide Web,万维网),是Web浏览器当年用来浏览超文本的客户端应用程序的名称,现在用来表示这一些列的集合,简称为Web。

成长

1990年11月,CERN成功研发了世界上第一台Web服务器和Web浏览器。
1992年9月,日本第一个网站的主页上线http://www.ibarakiken.gr.jp/www
1993年1月,现代浏览器的祖先NCSA(National Center For Supercomputer Applications,美国国家超级计算机应用中心)研发的Mosaic 问世了,以内联形式显示HTML图像。
1994年12月,网景通信公司发布了Netscape Navigator 1.0
1995年,微软公司发布Internet Explorer 1.0和2.0

HTTP版本


HTTP/0.9

HTTP1.0之前的版本,于1990年问世,还不是标准

HTTP/1.0

1996年5月正式作为标准,命名为HTTP/1.0,记载为RFC1945

HTTP/1.1

1997年1月公布,作为目前主流的HTTP协议版本。记载为RFC2068,后修订为RFC2616.

HTTP/2.0

下一代的HTTP协议

HTTP、DNS、TCP、IP的互相运作过程


以客户端发送一个Web页面的HTTP请求为例:

  1. 客户端发送请求,域名是yuming.cn,DNS通过域名找出其IP地址
  2. 应用层的HTTP协议生成针对目标Web服务器的HTTP请求报文
  3. 传输层的TCP协议,为了方便通信,把HTTP报文分割成报文段
  4. 网络层的IP协议,搜索对方的地址,一边中转一边传送,中间可能会经过多台路由器
  5. 找到后Web服务器后,传输层的TCP协议根据序号重组报文段
  6. 应用层的HTTP协议处理请求,同样利用TCP/IP通信协议回传结果

HTTP协议


HTTP协议规定了客户端和服务端通信的规范,通过请求和响应达成通信的目的。
客户端会发给服务器请求报文,服务器会返回响应报文

请求报文
请求报文的构成
响应报文
响应报文的组成
特点:无状态

HTTP是不保存状态,无状态的协议,不对通信状态进行保存。

HTTP方法

HTTP方法的作用是告知服务器请求意图。


方法
  • GET:获取资源
  • POST:传输实体主体
  • PUT:传输文件,要求在请求报文中的主体中包含有文件内容,然后保存到请求URI指定的位置(由于其不带验证机制,存在安全问题,一般不使用)
  • HEAD:获取报文首部,不返回报文主体,用于确认URI的有效性及资源更新的日期时间。
  • DELETE:删除文件,与PUT相反的方法,同PUT一样不带验证机制。
  • OPTIONS:询问支持,用来查询针对请求URI指定的资源支持的方法,客户端查询其支持哪些方法,服务端会返回其支持的方法
  • TRACE:追踪路径,让服务器将之前的请求通信环返回给客户端(容易引发XST(Cross-Site Tracing,跨站追踪))
  • CONNECT:要求用隧道协议连接代理,主要使用SSL(Secure Sockets Layer,安全套阶层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
持久链接

通常HTTP请求在每次请求之后都会断开TCP链接(握手断开),会增加通信开销。
为了解决通信开销的问题,有了持久链接(HTTP Persistent Connections,也成为HTTP keep-alive),主要为了建立1次TCP链接后可以进行多次请求和响应交互。减少TCP连接的重复建立和断开造成的额外开销。
特点:只要任意一段没有明确断开链接,就保持TCP链接状态。
管线化:持久连接让请求可以管线化发送,即并发发送,不用等到响应后再发送。

Cookie进行状态管理

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

  1. 客户端发出请求
  2. 服务器生成Cookie,标识发请求的客户端,然后把Cookie放在Set-Cookie字段中返回
  3. 客户端发现了Set-Cookie字段,保存Cookie,再次发送时,在请求中带上Cookie字段。
  4. 服务器接受到请求中有Cookie,检查记录,确认后返回信息

HTTP报文


HTTP报文:用于HTTP协议交互的信息,由多行数据构成的字符串文本。(用CR+LF换行)
请求报文:客户端发送的HTTP报文
响应报文:服务端返回的HTTP报文。

HTTP报文结构
报文结构

请求报文(上)和响应报文(下)

有四种首部:

  1. 通用首部
  2. 请求首部
  3. 响应首部
  4. 实体首部
编码

传输数据时编码,可以提升传输数据。
1、内容编码:指明应用在实体内容上的编码格式,并压缩。
常用内容编码:

  • gzip (GNU zip)
  • compress (UNIX系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

2、分块传输编码(Chunked Transfer Coding)
在传输大容量数据时,通常把数据分割多块,让浏览器逐步显示
实体主体分成的部分叫做块,每一块用十六进制标记块的大小,最后一块用“0(CR+LF)”标记

发送多种类型数据集合

多部分对象集合:包含了不同类型数据的集合
通常是在图片或文本文件上传时使用。
HTTP报文使用多部分对象集合需要增加首部字段:Content-type
多部分对象集合包含的对象:

  • multipart/form-data:Web表单文件上传时使用


    表单文件上传
  • multipart/byteranges:部分内容

划分实体的标识:boundary字符串。在各个实体的起始行之前插入“--xx”标记,在最后一个实体上加上“--xx--”标记结束。

范围请求

背景:需要可恢复的机制进行恢复请求或者续传。
范围请求:制定范围发送的请求。
首部字段:

  1. Range,制定资源的byte范围。
  2. Content-type:multipart/byteranges
    实例:
  3. 5001~10000字节:Range:bytes=5001-10000
  4. 从5001之后全部:Range:bytes=5001-
  5. 从一开始到3000,和5000~10000:Range:bytes=-3000,5000-10000
    响应状态:206(Partial Content)
内容协商

内容协商就是客户端和服务器就响应的资源内容进行交涉,然后服务器提供给客户端合适的资源。
判断依据:语言、字符集、编码方式
判断基准:某些首部字段

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language
    协商类型:
    1、服务器驱动协商:服务器自动根据首部协商
    2、客户端驱动协商:用户从浏览器显示的可选列表中手动选择
    3、透明协商:服务器和客户端驱动结合

HTTP状态码


状态码 = 3位状态数字+原因短语

类别
类别
2xx 成功
  • 200 OK:请求正常处理
  • 204 No Content:请求处理成功,不返回资源
  • 206 Partial Content:请求一部分资源
3xx重定向

表明浏览器需要执行某些特殊的处理来正确处理请求

  • 301 Moved Permanently:永久性重定向
  • 302 Found:临时性重定向
  • 303 See Other:表示请求对应的资源存在另一个URI,应该用GET方法获取请求资源
  • 304 Not Modifined:允许访问资源,但是资源不符合条件请求(一些条件首部)
  • 307 Temporary Redireect : 临时重定向,
4xx客户端错误
  • 400 Bad Request :请求报文中存在语法错误
  • 401 Unauthorized:请求需要通过认证
  • 403 Forbidden:请求被服务器拒绝(没有权限等)
  • 404 Not Found:找不到
5xx服务器错误
  • 500 Internal Server Error:服务器执行请求时错误
  • 503 Service Unavailable:服务器超负载或正在维护,无法处理请求

Web服务器


通信数据转发程序:代理、网关、隧道

通信数据转发程序,是程序或者服务器,可以转发请求

  • 代理:有转发功能的应用程序,不改变请求URI,每次经过代理服务器时会修改Via首部,表示经过了那些代理服务器。
    使用理由:利用缓存技术减少网络带宽,针对特定网站进行访问控制
    使用方法:(判断标准:是否使用缓存,是否修改报文)
    1. 缓存代理:转发时会先把资源副本保存在代理服务器,再次受到请求时直接返回缓存
    2. 透明代理:转发时不做任何加工,加工的叫做非透明代理
  • 网关:转发其他服务器数据的服务器
    使用理由:可以利用网关转化为其他协议通信,可以提高通信安全
  • 隧道:在相隔很远的客户端和服务器之间进行中转,保持双方通信连接的应用程序。
缓存

缓存是代理服务器或者客户端本地磁盘保存的资源副本,利用缓存可以减少对源服务器的访问,节省通信流量和通信时间

HTTP首部


HTTP首部字段是构成HTTP报文的要素之一,

类型

HTTP 首部字段根据实际用途被分为以下 4 种类型

  • 通用首部字段:请求报文和响应报文都会使用的首部


    通用首部
  • 请求首部字段:请求报文使用


    请求首部
  • 响应首部字段:响应报文使用


    响应首部
  • 实体首部字段:针对实体部分使用的首部,补充了资源内容更新时间等于实体有关的信息


    实体首部
非HTTP/1.1首部字段
  • Cookie
  • Set-Cookie
根据缓存代理分类
  • 端到端首部(End-to-end Header):会转发给请求、响应对应的最终接受目标,而且必须保存在缓存,必须被转发
  • 逐跳首部(Hop-by-hop Header):只对单词转发有效,会因通过缓存或代理而不再转发,除以下首部外,其他都是端到端首部
    • Connection
    • Keep-Alive
    • Proxy-Authenticate
    • Proxy-Authorization
    • Trailer
    • TE
    • Transfer-Encoding
    • Upgrade
通用首部字段
  • Cache-Control:控制缓存行为,参数可选,多个指令之间用“,”分隔
    缓存请求指令:


    缓存请求指令

    缓存响应指令:


    image.png
  • Connection:作用:控制不再转发给代理的首部字段或者管理持久连接
    指令:
    1、Connection:不再转发的首部字段名
    2、Connection:Close:HTTP/1.1版本的链接默认是持久连接,服务器想明确断开链接时发送
    3、Connection:Keep-Alive:想要在旧版本(HTTP/1.0,旧版本不是默认持久连接)上维持持久连接时发送

请求首部字段
  • Accept:通知服务器用户代理能够处理的媒体类型和优先级
    媒体类型:
    • 文本文件
      text/html,text/plain,text/css
      application/xhtml+xml
    • 图片文件
      image/jped,image/gif
    • 视频文件
      video/mpeg,video/quicktime
    • 应用程序使用的二进制文件
      application/octet-stream,application/zip

推荐阅读更多精彩内容