概述

协议:约束规则
网络协议:数据在网络上传输规则
Http协议:Hyper text transform protocal 如何在互联网传输文本。它是一种应用层协议(OSI七层模型的最顶层),它基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件,查询结果等)。
Http协议格式:请求响应模型:

  • 请求部分
  • 响应部分

    发展历史

    | 版本 | 产生时间 | 内容 | 发展现状 | | :—- | :—- | :—- | :—- | | HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 | 没有作为正式的标准 | | HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 | 正式作为标准 | | HTTP/1.1 | 1997年 | 长连接、节约带宽、HOST域、管道机制、分块传输编码 | 2015年前使用最广泛 | | HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |

在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
假设这样的一个应用场景:使用浏览器请求一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML里面包含的其他资源。因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
为了解决上述TCP连接的问题,HTTP想出了持久连接(HTTP keep-alive)的方法。持久连接的特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
管线化持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需要等待并收到响应后,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求,这样就能够同时并行发送多个请求,而不需要一个接一个地等待响应了。

HTTP特点

1、HTTP是无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
2、HTTP是媒体独立的
只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型
3、HTTP是无状态
无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
4、简单快速、灵活
5、通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

HTTP请求

HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。
HTTP请求由状态行、请求头、请求正文三部分组成:

  • 状态行:包括请求方式Method、资源路径URL、协议版本Version;
  • 请求头:包括一些访问的域名、用户代理、Cookie等信息;
  • 请求正文:就是HTTP请求的数据。

分布式通信-HTTP协议 - 图1

请求行

  • 请求方法
    • GET。请求指定的页面信息,并返回实体主体
    • POST。向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改
    • HEAD。类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    • PUT。从客户端向服务器传送的数据取代指定的文档的内容
    • DELETE。请求服务器删除指定的页面
    • OPTIONS。允许客户端查看服务器的性能
    • TRACE。回显服务器收到的请求,主要用于测试或诊断
    • CONNECT。HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
  • 请求URL
  • http协议及版本
    • 1.1
    • 2

      请求头

      首部的信息主要以键值对key-value的方式存在。
  1. content-typetext/html 表示返回的文本类型
  2. Connetcionkeep-alive 保持连接
  3. Accept-CharSetutf-8 客户端接收的文本编码为utf-8
  4. Cache-Controller:控制缓存
  5. Accept:告诉服务端客户端接受什么类型的响应
  6. Cookiecookie
  7. Referer:表示这个请求是从哪个URL过来的

请求数据

约定用户的表单数据向服务端传递格式。

HTTP响应

HTTP的响应报文也由三部分组成:响应行+响应头+响应体
分布式通信-HTTP协议 - 图2

响应行

  • 1.http协议及版本
    • 1.1
    • 2
  • 2.状态码及状态描述

    • 1:信息性状态码
      告诉客户端,请求收到,正在处理
    • 2:成功状态码
      200:OK 请求正常处理
      204:No Content请求处理成功,但没有资源可返回
      206:Partial Content对资源的某一部分的请求
    • 3:重定向状态码
      301:Moved Permanently 永久重定向
      302:Found 临时性重定向
      304:Not Modified 缓存中读取**
    • 4:客户端错误状态码
      400:Bad Request 请求报文中存在语法错误
      401:Unauthorized需要有通过Http认证的认证信息
      403:Forbidden访问被拒绝
      404:Not Found无法找到请求资源
    • 5:服务器错误状态码
      500:Internal Server Error 服务器端在执行时发生错误
      503:Service Unavailable 服务器处于超负载或者正在进行停机维护

      响应头

  • 服务器告诉浏览器服务器信息

  • 对本次响应的表述
  • 常见响应头

    • Date
    • content-Type
    • content-Encoding
    • content-Lenght

      响应体

      请求的响应数据。

      HTTP请求流程

      1、域名解析:什么是DNS?DNS查询过程?
  • 在浏览器DNS中搜索

  • 在操作系统DNS中搜索
  • 读取系统hosts文件,查找其中是否有对应的ip
  • 向本地配置的首选DNS服务器发起域名解析请求

2、建立TCP连接
3、发起http请求
4、响应http请求
5、浏览器解析html
按顺序解析html文件,构建DOM树

  • 若是下载css文件,则解析器会在下载的同时继续解析后面的html来构建DOM树
  • 若是下载js文件,则在下载js文件和执行它时,解析器会停止对html的解析
  • 解析到外部的css和js文件时,向服务器发起请求下载资源
  • 构建渲染树

6、断开TCP连接
分布式通信-HTTP协议 - 图3
客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。HTTP属于TCP/IP模型中的运用层协议,所以通信的过程其实是对应数据的入栈和出栈。
分布式通信-HTTP协议 - 图4
报文从运用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。
分布式通信-HTTP协议 - 图5
为什么需要三次握手呢?为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
比如:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段,但是server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求,于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了,由于client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据,但server却以为新的运输连接已经建立,并一直等待client发来数据。所以没有采用“三次握手”,这种情况下server的很多资源就白白浪费掉了。
分布式通信-HTTP协议 - 图6
为什么需要四次挥手呢?TCP是全双工模式,当client发出FIN报文段时,只是表示client已经没有数据要发送了,client告诉server,它的数据已经全部发送完毕了;但是,这个时候client还是可以接受来server的数据;当server返回ACK报文段时,表示它已经知道client没有数据发送了,但是server还是可以发送数据到client的;当server也发送了FIN报文段时,这个时候就表示server也没有数据要发送了,就会告诉client,我也没有数据要发送了,如果收到client确认报文段,之后彼此就会愉快的中断这次TCP连接。