网络:HTTP详解

HTTP超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议

通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如”HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息、或者其它信息。

一、工作原理

客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

具体步骤如下:

  1. 客户端发送请求

    客户端根据域名、请求方法、URL、请求数据构建请求报文

  2. 客户端和服务端建立HTTP连接

    HTTP是基于TCP传输层协议,建立连接采用三次握手

  3. 服务器返回结果

    服务器返回状态码、提示语、响应数据构成的响应报文

  4. 客户端和服务器断开连接

    四次挥手断开连接

二、特点

  1. 基于 请求-响应 的模式

    HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应

  2. 无状态保存

     HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。

  3. 无连接

    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。

    但是现在的HTTP/1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒

三、请求报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文;响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。

  1. 请求报文

    img

  2. 响应报文

    img

    下面逐个介绍报文中的各个部分~

    协议版本参考:github

四、请求方法

  • GET:get方法一般用于获取服务器资源。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作

  • POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有

  • PUT:向指定资源位置上传其最新内容

  • DELETE:请求服务器删除Request-URI所标识的资源

  • HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)

  • OPTIONS:options方法用于询问请求URI资源支持的方法

  • TRACE:回显服务器收到的请求,主要用于测试或诊断

  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)

经典面试题:GET和POST的区别

  1. GET方法的请求没吃得到的结果都是幂等的,也就是每次都是一样的,而POST是不一定的
  2. GET请求会被浏览器主动cache,而POST不会,除非手动设置
  3. GET请求只能进行URL编码,而POST支持多种编码方式
  4. GET请求在URL中传送的参数是有长度限制(浏览器的限制)的,而POST没有
  5. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息

五、状态码

状态代码的第一个数字代表当前响应的类型

img

常见的状态码:

  • 100:请求成功,还有后续操作
  • 101:协议切换,比如HTTP升级为WS
  • 200:请求成功
  • 204:请求成功,但是没有实体内容
  • 206:分块请求成功
  • 301:永久重定向
  • 302:临时重定向
  • 304:资源未更改,缓存有效
  • 400:请求失败,请求参数或语义有误
  • 401:认证失败
  • 404:资源不存在
  • 405:请求方法错误
  • 500:服务器遇到了不知道如何处理的情况。

详细状态码请查看:MDN HTTP状态码

六、头部字段

头部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容。

头部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。

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

  • 通用头部字段: 请求报文和响应报文两方都会使用的首部
  • 请求头部字段:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
  • 响应头部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
  • 实体头部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息。

常见头部字段:

  1. 通用头部字段
    • Cache-Control:操作缓存的工作机制
    • Connection:管理持久连接
    • Date:表明创建 HTTP 报文的日期和时间
    • Upgrade:用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信
  2. 请求头部字段
    • Accept:用户代理可处理的媒体类型
    • Accept-Charset:优先的字符集
    • Accept-Encoding:优先的字符编码
    • Accept-Language: 优先的语言
    • Authorization:Web认证信息
    • If-Modified-Since:比较资源的更新时间
    • If-None-Match:比较实体标记
    • Referer:对请求中 URI 的原始获取方
    • User-Agent:HTTP 客户端程序的信息
  3. 响应头部字段
    • ETag:资源的匹配信息
    • Location:令客户端重定向至指定 URI
  4. 实体头部字段
    • Allow:资源可支持的 HTTP 方法
    • Content-Encoding:实体主体适用的编码方式
    • Content-Language:实体主体的自然语言
    • Content-Length:实体主体的大小(单位:字节)
    • Content-Type:实体主体的媒体类型
    • Expires:实体主体过期的日期时间
    • Last-Modified:资源的最后修改日期时间

详细头部字段请查看MDN HTTP头部字段

参考文章:

HTTP协议超级详解

一篇文章带你详解 HTTP 协议