重识 HTTP

HTTP 是网络应用层协议,它处在5层网络结构中的第一层(如下图),是万维网一切数据通信的基础。但最初,它只是用来提供一种服务器端发布和浏览器端接收 HTML 页面的方法。

重识 HTTP_第1张图片
image.png

HTTP 请求报文结构

一个 http 请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求正文(request-body)4个部分组成。

重识 HTTP_第2张图片
http请求报文结构

请求行:由 请求方法URLhttp协议版本 3个字段组成。

请求头:请求头部由键值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:User-Agent(请求的浏览器类型)、Accept(客户端可识别的内容类型列表)、Host(请求的主机名,允许多个域名同处一个IP地址,即虚拟主机)。

空行:最后一个请求头之后是一个空行,发送回车符换行符,通知服务器以下不再有请求头。

请求正文:请求参数,它不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

HTTP 响应报文结构

HTTP响应也由3个部分组成,分别是:状态行(status line)、消息报头(headers)、响应正文(response body)。

http 响应报文请求报文 的对比:

重识 HTTP_第3张图片
image.png

状态行:服务器HTTP协议的版本 + 响应状态码 + 状态码的文本描述,如HTTP/1.1 200 OK

消息报头:用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。如:服务器支持哪些请求方法、文档编码方法(Content-Encoding)、内容长度(Content-Length)、内容文档类型(Content- Type)、当前时间、缓存信息等。

响应正文:可能是一个html页面或片段,也可能只是一段纯数据或js代码。

8种http请求方法

  1. GET:向指定的资源发出“显示”请求,应只用在读取数据,而不应当被用于产生“副作用”的操作中。
  2. HEAD:同GET方法,都是向服务器发出指定资源的请求。它可以在不必传输全部内容的情况下,获取其中“关于该资源的信息”。
  3. POST:向指定资源提交数据,请求服务器进行处理(例:提交表单、上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
  4. PUT:向指定资源位置上传其最新内容。
  5. DELETE:请求服务器删除Request-URI所标识的资源。
  6. TRACE:回显服务器收到的请求,主要用于测试或诊断。
  7. OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
  8. CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

方法名称是区分大小写的。

当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405,当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501。

HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。

响应报文状态码

状态码 含义 例子
1xx 指示信息–表示请求已接收,继续处理
2xx 成功–表示请求已被成功接收、理解、接受 HTTP/1.1 200 OK
3xx 重定向–要完成请求必须进行更进一步的操作
4xx 客户端错误–请求有语法错误或请求无法实现,如请求链接为不存在 HTTP/1.1 404 Not Found
5xx 服务器端错误–处理某个正确请求时发生错误

常见状态代码含义如下:

  • 200 OK:客户端请求成功。
  • 204 No Content:服务器成功处理了请求,但没有返回任何内容。
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
  • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
  • 500 Internal Server Error:服务器发生不可预期的错误。
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

http/2 与 http/1.1 的区别

  • 对HTTP头字段进行数据压缩(即HPACK算法);
  • HTTP/2 支持 服务端推送 (Server Push);
  • 请求 管线化
  • 修复HTTP/1.0版本以来未修复的 队头阻塞 问题;
  • 对数据传输采用多路复用,让多个请求合并在同一 TCP 连接内。

HTTP/2 高度兼容 HTTP/1.1 的用法。它的请求方法、状态码乃至url和绝大多数http头部字段一致,并支持新特性来让你获得更快的速度。

GET 和 POST 的区别

  1. GET请求的数据附在URL之后,POST提交的数据是放置在HTTP包着的<request-body>中。
  2. 传输数据的大小不同。GET长度最大是2048个字符,POST无限制。
  3. 安全性不同。GET提交的参数将明文出现在URL上,存在安全隐患。
  4. GET能缓存,POST不能缓存。
  5. 后退页面的动作不同。GET无害,POST会再次重新提交页面请求。

使用http好久了,但是之前却没有好好花时间系统整理下这块的知识点。虽然说的可能都是别人说过的,但是他山之石可攻玉。就当是作为自己学习http协议的一个总结和回顾吧!

推荐参考和学习的资料:

  1. HTTP请求报文和HTTP响应报文
  2. HTTP MDN文档

你可能感兴趣的:(重识 HTTP)