本篇是网络部分的第二篇,介绍WEB开发常用的通讯工具HTTP,帮助你在阅读完后,能对HTTP有一个更高层次的认知,遇到相关的面试题,也不用紧张得手心冒汗。下面正式开始本篇的内容介绍:
它的全英文名是HyperText Transfer Protocol,HTTP是缩写,中文解释是:超文本传输协议。“超文本”是指HTML、CSS、JavaScript、图片、视频和文件等等;“传输协议”这个大家不要望文生义,HTTP是OSI七层模型中的应用层协议,基于TCP传输层协议,所以它的连接是可靠的。OSI七层模型不清楚的,可以看博主的这篇文章,里面有详细讲解。
万维网联盟编制了一套标准,规定使用URL(uniform resource locator)描述一台特定服务器上某资源的特定位置。URL通常被写成如下形式:<方案>:<方案描述部分>,常见的“方案”有HTTP、FTP、RTSP等等。HTTP协议的URL是由三部分组成:HTTP协议、服务器地址、主机资源的具体地址。
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) 含义:能接收哪些媒体类型,*/*表示所有类型
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协议是无状态协议,在一些场景中,我们需要跟踪用户的状态,通用的三种方式是:
HTTP基于传输层的TCP协议,TCP连接需要客户端和服务器端三次握手,HTTP的长连接和短连接本质上是TCP长连接和短连接:
HTTP/1.0中默认使用短连接,适用早期HTML中Web资源(如 JavaScript 文件、图像文件、CSS 文件等)少的场景。
随着互联网的发展,一个HTML中Web资源越来越多,每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话,给服务器带来了沉重的负担,于是从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入:
Connection:keep-alive
HTTP协议使用明文(不加密)传输数据,会存在报文被截取、篡改和身份无法验证的问题。为了解决上面的安全问题,产生了HTTPS协议(HTTP+SSL/TLS),在HTTP的基础上,通过 TLS 对服务端和客户端之间传输的信息进行加密。
那么SSL又是什么?SSL(Secure Socket Layer,安全套接字层)协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持,是TLS(Transport Layer Security,传输层安全)的前身。
相比较HTTP协议,HTTPS协议使用了SSL/TLS协议进行了加密处理,导致页面的加载时间会延长,涉及到的安全算法会消耗 CPU 资源。最后补充一点,HTTP和HTTPS默认端口是不一样的,HTTP是80,HTTPS是443。
今天是中秋节放假的第一天,早上6点起床送老婆去考试后,就在家写这篇文章,好在午饭前终于写完了,精神食粮快掏完,要去补充点物理食粮。
各位读者如果觉得对您有帮助的话,请帮忙点个赞,您的赞赏是支持博主继续创作的动力。