0. HTTP协议的组成

HTTP 协议主要由三大部分组成:

  • 起始行(start line):描述请求或响应的基本信息;
  • 头部字段(header):使用 key-value 形式更详细地说明报文;
  • 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
    http相关 - 图2
  • http相关 - 图3
  • http相关 - 图4

http: https://blog.csdn.net/qq_36894974/article/details/103930478?utm_source=app&app_version=4.16.0
参考文章:https://blog.csdn.net/pashanhu6402/article/details/96428887 (socket)

1、GET请求和POST请求的区别?

GET 和 POST请求本质上就是 TCP链接,并无差别。但是由于 HTTP 和浏览器/服务器的限制,导致他们在应用过程中出现了一些不同。

  • 1、请求次数不同
    • GET请求会产生一个 TCP 的数据包
    • POST请求会产生两个TCP的数据包
    • 因为对于GET请求来说,浏览器会将 header 和 data一起发送出去,服务器响应200(返回数据);但是对于 POST 请求来说,浏览器会先发送 header,其次服务器返回 100 countinue,然后再将 data 发送出去,最后服务器返回200
    • 另外的话,不是所有的浏览器都会在POST请求中发送两次包,火狐只会发送一次
  • 2、参数的编码方式不同
    • GET只支持URL编码(ASCII 16进制)
    • POST请求支持多种编码方式
  • 3、请求参数的位置不同
    • GET 请求的参数是拼接在 URL的后面
    • POST请求的参数是放在了请求体里面
    • 从这个角度来说,POST请求可能会比GET请求更安全,因为POST请求没有把参数放到url里(有了ssl、http就变成了https,解决了这个问题)
  • 4、缓存
    • 对应GET请求来说,它会被浏览器进行缓存
    • 但是POST请求不会
  • 5、应用场景不同
    • GET 请求一般用于对服务器资源不会产生影响的场景,比如说,请求一个网页
    • POST请求一般用于会对服务器资源产生影响的场景,比如说,注册用户等类似的操作

注意:http 协议并没,没有对get和post请求的长度进行限制,所谓的浏览器长度限制是由浏览器和 服务器决定和设置的。

2、HTTP 的请求方法(9种)

HTTP 1.0:HEAD、GET和POST
HTTP 1.1:其余6种

  • GET
    • 向特定的资源发送请求,返回相应的数据
  • HEAD
    • 和get 请求类似,只不过对应 head 而言,服务器不会返回响应体。
    • 最常见的好像就是在下载一个大文件前,先获取它的大小,然后再决定是否下载
  • POST
    • 向指定的资源提交数据进行处理请求(上传文件或表单请求)
  • OPTION
    • 预检请求,获取服务器所支持的通信选项(请求方式)
  • PUT
    • 请求替换目标的资源
  • DELETE
    • 删除指定的资源
  • PATCH
    • 对指定的资源进行部分修改
  • CONNECT
    • 开启一个客户端到所请求资源之间的一个通道
  • TRACE
    • 请求的服务器返回其受到的请求信息,主要用来做 http 的测试和诊断

3、http的请求头,响应头

请求头:

  • Accpet
    • 告诉服务端,客户端接收什么类型的响应
  • Referer
    • 表示这是请求是从哪个URL进来的,比如想在网上购物,但是不知道选择哪家电商平台,你就去问度娘,说哪家电商的东西便宜啊,然后一堆东西弹出在你面前,第一给就是某宝,当你从这里进入某宝的时候,这个请求报文的Referer就是www.baidu.com
  • Cache-Control
    • 对缓存进行控制,如一个请求希望响应的内容在客户端缓存一年,或不被缓可以通过这个报文头设置
  • Accept-Encoding
    • 这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式)
      • 例如:Accept-Encoding:gzip, deflate(这两种都是压缩格式)
  • Host
    • 指定要请求的资源所在的主机和端口
  • User-Agent 作用:告诉服务器,客户端使用的操作系统、浏览器版本和名称

响应头:

  • Cache-Control
    • 响应输出到客户端后,服务端通过该属性告诉客户端该怎么控制响应内容的缓存
  • ETag
    • 表示你请求资源的版本,如果该资源发生啦变化,那么这个属性也会跟着变
  • Location
    • 在重定向中或者创建新资源时使用
  • Set-Cookie

    • 服务端可以设置客户端的cookie

      http相关 - 图5

      通用报头

      既可以出现在请求报头,也可以出现在响应报头中
  • Date:表示消息产生的日期和时间

  • Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接
  • Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)

    请求报头

    请求报头通知服务器关于客户端求求的信息,典型的请求头有:

  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机

  • User-Agent:发送请求的浏览器类型、操作系统等信息
  • Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
  • Accept-Encoding:客户端可识别的数据编码
  • Accept-Language:表示浏览器所支持的语言类型
  • Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表示保持连接。
  • Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

    响应报头

    用于服务器传递自身信息的响应,常见的响应报头:

  • Location:用于重定向接受者到一个新的位置,常用在更换域名的时候

  • Server:包含可服务器用来处理请求的系统信息,与User-Agent请求报头是相对应的

    实体报头

    实体报头用来定于被传送资源的信息,既可以用于请求也可用于响应。请求和响应消息都可以传送一个实体,常见的实体报头为:

  • Content-Type:发送给接收者的实体正文的媒体类型

  • Content-Lenght:实体正文的长度
  • Content-Language:描述资源所用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读
  • Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
  • Last-Modified:实体报头用于指示资源的最后修改日期和时间
  • Expires:实体报头给出响应过期的日期和时间

    3、HTTP常见的状态码

    状态码是由三个十进制的数字组成的,第一个数字代表的是类型。状态码分为五类

  • 1xx,信息的响应,服务器收到请求,需要客户端继续执行操作

  • 2xx,成功的响应,服务器已经接收到了请求,并进行了处理
  • 3xx,重定向,需要进一步操作以完成请求
  • 4xx,客户端错误,请求包含语法错误或无法完成请求
  • 5xx,服务端错误,服务器在处理请求的过程中发生了错误

常见的有

  • 100 Continue,请求服务器已经收到,应该继续发送请求
  • 200 OK,表示请求成功
  • 201 Created,成功请求并创建了新的资源
  • 202 Accepted,已接收到了请求,但是请求还没有处理完成
  • 301 Moved Permanently,永久重定向,表示请求的资源已经分配到了新的 url ,应该请求新的 URL
  • 302 Found,临时重定向,也表示的是请求的资源被定为到了新的 url 上,应该请求新的 url
    • 301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL)
  • 303 See Other:表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源;
  • 304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容
  • 400 Bad Request:表示请求报文中存在语法错误;
  • 401 Unauthorized:未经许可,需要通过HTTP认证;
  • 403 Forbidden:服务器拒绝该次访问(访问权限出现问题)
  • 404 Not Found:表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用;
  • 405 Method Not Allowed:服务器禁止了使用当前HTTP方法的请求
  • 500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时;
  • 501 Not Implemented:请求的方法不被服务器支持,因此无法被处理
  • 502 Bad Gateway:作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
  • 503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求;

    4、HTTP1.0、HTTP1.1和HTTP2.0的区别

    1.0和1.1的区别

  • (1)首先是连接方面的区别

    • 1.0的话,默认支持的是短连接,也就是一次http请求需要建立一次 tcp连接,请求完之后,连接就会断开
      • 非标准字段:Connection:keep-alive
    • 1.1默认采用的是长连接,多个 http 请求可以服用一次 tcp的连接,这样做的话可以避免每次发送请求都需要建立连接的时延,对于同一个域名,做多允许同时建立6个持久连接
  • (2)请求方式的区别
    • 1.0,只支持 head、get、post
    • 1.1,新增了几种。put、delete等
  • (3)带宽优化及网络连接的使用
    • HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,
    • HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接

2.0

  • 连接共享也就是多路复用,减低开销,具体说就是一次tcp连接可以处理多次请求,和1.1的区别是
  • 使用二进制进行传输(1.x使用的是普通文本)
  • 支持服务端推送,可以在未经客户端允许的情况下,向客户端推送内容
  • 头部压缩。http2.0使用encoder来减少需要传输的header大小。高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟