HTTP协议(《图解HTTP协议》)

92 阅读12分钟

HTTP协议介绍

基本介绍

  • HTTP (Hyper Text Transfer Protocol) :全称超文本传输协议,是用于从万维网(www:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
  • web以http协议作为规范,完成从客户端到服务器端等一系列运作流程。(web是建立在http协议上通信的)HTTP协议用于客户端和服务端之间的通信
  • http属于TCP/IP协议族内部的一个子集
  • HTTP是一种应用层协议,是基于TCP/IP通信协议来传递数据的,其中HTTP1.0、HTTP1.1、HTTP2.0均为TCP实现,HTTP3.0基于UDP实现。现主流使用HTTP1.0和 HTTP3.O

协议:

  • 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。(通俗点讲,协议就是要保证网络通信的双方,能够互相对接上号。)

HTTP协议的工作过程

  • 当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个HTTP请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个HTTP响应。并且当我们访问一个网站时,可能涉及不止一次的HTTP请求和响应的交互过程。

HTTP协议的重要特点:

  1. 一发一收,一问一答
  2. 注意︰网络编程中,除了一发一收之外,还有其它的模式
    • 多发一收:例如上传大文件
    • 一发多收:例如看直播时,搜索一个词条可以得到多个视频源
    • 多发多收:例如串流(steam link、moonlight等等)

URI和URL

URL

  • 平时我们俗称的“网址”,其实就是URL(Uniform Resource Locator),翻译为统一资源定位符
  • 互连网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它

URI

  • 统一资源标识符

URI和URL

  • 用字符串标识某一互联网资源,而URL表示资源的地点,可见URL是URI的子集
  • 在充分理解的基础上,可以用URL替换URI

报文

  1. 请求报文是由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成的
  2. 响应报文基本上有协议版本,状态码,用以解释状态码的原因短语,可选的响应首部字段以及实体主体构成

image.png

HTTP请求方法

image.png

GET和POST的区别

  1. GET习惯上会把客户端的数据通过query string 来传输(body部分是空的) ;
  2. POST习惯上会把客户端的数据通过body来传(query string 部分是空的)(querystring是URL的一部分,其中包含着需要传给web application的数据.)
  3. 一般情况,程序员会把GET请求的处理,实现成“幂等”的;对于POST 请求的处理,不要求实现成“幂等”。(幂等:一个 HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说,幂等的方法不应该具有副作用。幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同)
  4. GET请求可以被缓存,可以被浏览器保存到收藏夹中;POST请求不能被缓存

关于GET请求的URL长度问题的误解(URL的最大字符长度限制)

  1. 网上有一种错误的解释:GET请求的长度是存在上限的,并且GET请求存在上限的原因是URL的长度存在上限。(RFC 2616标准正确的解释,没有对URL的长度有任何限制。)
  2. URL的长度取决因素︰实际上URL的长度取决于浏览器的实现和HTTP服务器端的实现。在浏览器端,不同的浏览器最大的长度是不同的,但是现在浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的

关于POST比 GET更安全的误解

  1. 网上有一种错误的解释:如果实现登录页面,如果使用GET实现登录,GET习惯上把数据放到query string中,此时就能看到浏览器的URL中显示当前的用户名和密码了,所以就并不安全;而 POST 习惯上会把数据放到body 中,因此登录时就不能直接看到用户名和密码,就安全
  2. 正确的理解:安全问题取决于是否加密以及加密算法的强度。这和将数据信息放到 query string 或body中无关,因为通过抓包,我们就可以得到这两部分的数据

关于GET只能传输文本数据的误解

  1. 网上有一种错误的解释:GET只能传输文本数据;POST可以传输文本数据,也可以传输二进制数据
  2. 正确的理解︰GET也可以传输二进制数据,虽然不能直接在query string中传输二进制数据,但是可以针对二进制数据进行urlencode,转码后就可以放到url 中 ;GET还可以直接将二进制数据放到body 中

状态码

  1. http状态码负责表示客户端HTTP请求的返回结果,标记服务器端的处理是否正常,通知出现的错误等工作

状态码的类别

1XX(信息性状态码)表示接收的请求正在处理
2XX(成功状态码)表示请求正常处理完毕
3XX(重定向状态码)需要进行附加操作以完成请求(为了完成请求,必须采取进一步措施)
4XX(客户端错误状态码)表示服务器无法处理请求
5XX(服务器错误状态码)表示服务器处理请求出错

常见的状态码

  • 200:客户端发来的请求在服务器端被正常处理,服务器成功返回网页
  • 204:服务器接收的请求已成功处理,但返回的响应报文中不含实体的主体部分,即 无资源可返回。(一般在只需从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。)
  • 301:永久重定向,请求的资源已被分配新的URL,以后应使用资源现在所指的URL
  • 302∶临时重定向,请求的资源已被分配新的URL,希望用户本次使用新的URL
  • 304:未修改,客户端发送附带条件的请求时,服务器端允许请求访问资源,但请求未满足条(304其实与重定向没有关系。)
  • 400:请求报文中存在语法错误,当错误发生时,需要修改请求的内容后再次发送请求,另外,浏览器会向对待200 OK一样对待该状态码
  • 401:发送的请求需有通过HTTP认证的认证信息
  • 403:对请求资源的访问被服务器拒绝了
  • 404:请求的网页不存在,服务器上无法找到请求的资源x.500:服务器内部错误,服务器在执行请求时发生错误
  • 503∶服务器暂时不可用,服务器暂处于超负载或正在进行停机维护,现在无法处理请求

状态码和状况都不一致

  • 不少返回的状态码响应都是错误的,但是用户可能察觉不到这点,比如web应用程序内部发生错误,状态码依然返回200 OK这种情况也经常遇到

HTTP首部

  1. Http首部内容为客户端和服务器分别处理请求和响应,提供所需要的信息,它能起到传 递额外重要信息的作用
  2. 若http首部字段重复了,有的浏览器会优先处理,第一次出现的首部字段,而有些则会 优先处理,最后出现的首部字段

四种类型

  1. 通用首部字段
  2. 请求首部字段
  3. 响应首部字段
  4. 实体首部字段

Cookie

  • Cookie是浏览器提供的一种让程序员在本地存储数据的能力

image.png

  • 为什么需要Cookie ?

当你不小心打开某个不安全的网站,该网站就可以在你的硬盘上写一个病毒程序,那么你的电脑就挂了,因此浏览器为了保证安全性,就禁止网页中的代码访问主机的硬盘(无法在JS中读写文件),因此也就失去了持久化存储的能力,故Cookie就很重要!

HTTPS介绍

  1. Http的缺点

    • HTTP协议中没有加密机制,使用明文不加密内容可能会被窃听

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

    • 无法证明报文的完整性,所以有可能以遭篡改

  2.  Http加上加密处理和认证以及完整性保护后即是Https

  3. Https采用混合加密机制:在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。

  4.  https并不 是一种新的协议, 只是http通信接口部分用SSL和tls协议代替而已

  5. 为什么不一直使 用https?

    • 与纯文本通信相比,加密通信会消耗更多的CPU及内存资源

    • 当使用SSL的时候,处理速度会变慢

 HTTP协议

  1.  HTTP是无状态协议(p37)

    • Http是一种不保存状态,即无状态协议,协议对于发送过的请求或响应都不做持久化处理,为了实现期待的保持状态功能,引入cookie技术
  2. 持久连接: (节省通信量)

    • 在http中,所有的连接默认都是持久连接,只要任意一端, 没有明确提出断开连接,则保持TCP连接状态
  3. 管线化:

    • 持久连接,使得多数请求以管线化方式发送成为可能,这样就能够做到同时并行发送多个请求,而不需要一个接一个的等待响应
  4.  Http可 以在传输数据的过程中,通过编码提升传输效率

    • 内容编码:压缩传输的内容编码指明应用在实体内容的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接收并负责解码

    • 分块传输编码:分割发送的分块传输编码,在传输大量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面,使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体

  5.  HTTP协议中采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体f.范围请求:指定范围发送的请求,获取部分内容

  6. 内容协商返回最合适的内容(语言,字符集,编码方式)

web服务器

  1. 用单台虚拟主机实现多个入域名,使用虚拟主机的功能,可以假想有多台服务器,在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的web网站,因此在发送HTTP请求时,必须在host首 部内网,反正指定主机名或域名的URI。

  2.  通信数据转发的程序:代理,网关和隧道。

    • 代理是一种有转发功能的应用程序,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端代理,有很多种方法。(代理 服务器会向原服务器确认资源的有效性。)

      1. 缓存代理会预先将资源的副本缓存保存在代理服务器上,当代理在直接收到相同的资源请求时,直接将之前缓存的资源作为响应返回
      2. 透明代理,不对豹纹做任何加工的代理类型
    • 网关能使通信线路上的服务器提供非HTTP协议服务,能提高通信的安全性,在客户端和网关之间的通信线路,上加密,以确保连接的安全。(利用 网关可以由HTTP请求转化为其他协议通信)

    • 隧道的目的是确保客户端能与服务器进行安全的通信

    • 代理服务器会向原服务器确认资源的有效性

 TCP/IP

分层管理

协议层功能详细说明
应用层向用户提供应用服务时通信的活动比如FTP、DNS、Telnet等服务
传输层对上层应用层提供处于网络连接中的两台计算机之间的数据传输该层包括TCP、 UDP两个性质不同的协议
网络层处理网络数据包,规定通过怎样的路径到达对方计算 与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起机,并把数据包传输给对方与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条
链路层用来处理连接网络的硬件部分包括操作系统中的设备驱动程序和计算机中对应的网卡

通信传输流

image.png

确保可靠性

TCP建立连接:三次握手

image.png

TCP关闭连接:四次挥手

image.png

image.png

DSN服务

  • 负责域名解析,提供通过域名查找IP地址,或逆向从IP地址反查域名服务

各协议与HTTP协议的关系

image.png