一篇文章,帮你搞懂HTTP

前言

本篇是网络部分的第二篇,介绍WEB开发常用的通讯工具HTTP,帮助你在阅读完后,能对HTTP有一个更高层次的认知,遇到相关的面试题,也不用紧张得手心冒汗。下面正式开始本篇的内容介绍:

1、什么是HTTP

它的全英文名是HyperText Transfer Protocol,HTTP是缩写,中文解释是:超文本传输协议。“超文本”是指HTML、CSS、JavaScript、图片、视频和文件等等;“传输协议”这个大家不要望文生义,HTTP是OSI七层模型中的应用层协议,基于TCP传输层协议,所以它的连接是可靠的。OSI七层模型不清楚的,可以看博主的这篇文章,里面有详细讲解。

2、资源

万维网联盟编制了一套标准,规定使用URL(uniform resource locator)描述一台特定服务器上某资源的特定位置。URL通常被写成如下形式:<方案>:<方案描述部分>,常见的“方案”有HTTP、FTP、RTSP等等。HTTP协议的URL是由三部分组成:HTTP协议、服务器地址、主机资源的具体地址。

3、HTTP协议

3.1、历史版本

HTTP协议是客户端和服务器端之间数据传输的规则,历史上有四个版本:

  1. 第一版HTTP 0.9是最早的版本,已过时。只允许客户端发送GET这一种请求,且不支持HTTP头,只能传输文本;
  2. 第二版HTTP 1.0,增加了POST方法、HTTP头和内容,传输的内容不仅仅局限文本,还有图片、视频等等,值得一提的是,这个版本默认采用短连接
  3. 第三版HTTP 1.1,也是目前使用最广泛的,默认采用长连接,这是HTTP1.0和HTTP1.1最大的区别(这个放在本篇后面介绍)。
  4. 第四版HTTP 2.0,致力于性能方面,改进传输性能,实现低延迟和高吞吐量,有逐渐替代第三版的趋势。

3.2、HTTP请求和响应

HTTP请求由三部分组成,起始行、首部(header)、内容(body),下面看一段客户端请求服务器的报文:

***@*** ~ % curl -v http://www.baidu.com/index.html
*   Trying 14.215.177.38...
* TCP_NODELAY set
* Connected to www.baidu.com (14.215.177.38) port 80 (#0)
> GET /index.html HTTP/1.1         #起始行
> Host: www.baidu.com			   #请求首部(header) 含义:指定请求的服务器的ip和端口
> User-Agent: curl/7.64.1		   #请求首部(header) 含义:告诉服务器,客户端使用的操作系统、浏览器版本和名称
> Accept: */*					   #请求首部(header) 含义:能接收哪些媒体类型,*/*表示所有类型
  • 起始行写法是固定的,由三部分组成,第一部分是请求方法,第二部分是请求网址URI,第三部分是HTTP版本。
  • 首部(header)在HTTP请求中可以分为通用首部(请求和响应都可以使用)、请求首部(请求特有)、实体首部(针对实体说明)。
  • 内容(body)只在POST的方法中有,因为GET请求并不包含任何实体。

3.3、HTTP响应

HTTP响应类似HTTP请求,也是由三部分组成,起始行、首部(header)、响应内容(body),下面是上面客户端请求服务器响应的报文:

< HTTP/1.1 200 OK									#起始行									
< Accept-Ranges: bytes								#响应首部(header)  含义:对此资源来说服务器可接受的范围单位,这里是byte
< Cache-Control: private, no-cache,no-store		#通用首部(header)  含义:是否缓存
< Connection: keep-alive							#通用首部(header)  含义:控制网络连接是否保持打开状态,keep-alive表示持久连接
< Content-Length: 2381								#实体首部(header)  含义:实体主体的大小
< Content-Type: text/html							#实体首部(header)  含义:实体主体的类型
< Date: Sat, 18 Sep 2021 00:39:51 GMT				#通用首部(header)  含义:报文创建时间
< Etag: "588604dd-94d"								#实体首部(header)  含义:实体标记
< Last-Modified: Mon, 23 Jan 2017 13:27:57 GMT		#实体首部(header)  含义:实体最后一次被修改的时间
< Pragma: no-cache									#通用首部(header)  含义:传送指示,但不专用于缓存
< Server: bfe/1.0.8.18								#响应首部(header)  含义:服务器应用程序的名称和版本
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/	   #响应首部(header)	含义:在客户端设置一个令牌
<!DOCTYPE html>										#响应内容(body)
<!--STATUS OK--><html>
中间省略响应内容……
</html>
  • 响应的起始行是由HTTP版本、响应状态码、状态码的描述组成。
  • 首部(header)在HTTP响应中可以分为通用首部(请求和响应都可以使用)、响应首部(响应特有)、实体首部(针对实体说明)。
  • 响应内容可以通过Content-Type这个实体首部指定是text/html(HTML)、image/jpeg(图片)、video/quicktime(视频)等等。

4、HTTP相关补充

4.1、状态保持

HTTP协议是无状态协议,在一些场景中,我们需要跟踪用户的状态,通用的三种方式是:

  1. 服务器端通过Set-Cookie响应首部设置Cookie信息,客户端保存Cookie信息,下次请求的时候通过Cookie请求首部,将Cookie信息带给服务端,完成会话跟踪。
  2. 客户端和服务器端共同维护一个表单隐藏变量(标识用户),每次会话都带上。
  3. 客户端将标识用户的信息通过参数的形式,传递给服务器端,完成会话跟踪。

4.2、长连接、短连接

HTTP基于传输层的TCP协议,TCP连接需要客户端和服务器端三次握手,HTTP的长连接和短连接本质上是TCP长连接和短连接:

  • 短连接,每个TCP连接只能发送一个请求,发送数据完毕后,连接就关闭了,如果还要请求就必须要新建一个请求连接
  • 长连接,TCP连接默认不关闭,可以被多个请求复用,只有在一段时间内,没有请求,才会自动关闭。

HTTP/1.0中默认使用短连接,适用早期HTML中Web资源(如 JavaScript 文件、图像文件、CSS 文件等)少的场景。

随着互联网的发展,一个HTML中Web资源越来越多,每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话,给服务器带来了沉重的负担,于是从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入:

Connection:keep-alive

4.3、HTTPS协议

HTTP协议使用明文(不加密)传输数据,会存在报文被截取、篡改和身份无法验证的问题。为了解决上面的安全问题,产生了HTTPS协议(HTTP+SSL/TLS),在HTTP的基础上,通过 TLS 对服务端和客户端之间传输的信息进行加密。

那么SSL又是什么?SSL(Secure Socket Layer,安全套接字层)协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持,是TLS(Transport Layer Security,传输层安全)的前身。

客户端(浏览器) 服务端 1、请求HTTPS连接 返回证书(公钥) 2、产生随机对称密钥 3、使用公钥对步骤2中的密钥加密 4、发送3步骤加密后的对称密钥 5、通过对称密钥加密的密文通信 客户端(浏览器) 服务端 HTTPS传输数据的流程

相比较HTTP协议,HTTPS协议使用了SSL/TLS协议进行了加密处理,导致页面的加载时间会延长,涉及到的安全算法会消耗 CPU 资源。最后补充一点,HTTP和HTTPS默认端口是不一样的,HTTP是80,HTTPS是443。

结束语

今天是中秋节放假的第一天,早上6点起床送老婆去考试后,就在家写这篇文章,好在午饭前终于写完了,精神食粮快掏完,要去补充点物理食粮。

各位读者如果觉得对您有帮助的话,请帮忙点个赞,您的赞赏是支持博主继续创作的动力。

你可能感兴趣的:(网络,http,https,网络协议,网络安全)