四、HTTP
4.1 什么是HTTP协议
HTTP (Hypertext Transfer Protocol) 协议是对 客户端和服务器端 之间数据之间实现可靠性的传输 文字、图片、音频、视频等超文本数据的规范,格式简称为“超文本传输协议“。HTTP 协议属于应用层,及用户访问的第一层就是HTTP。简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
HTTP(Hypertext Transfer Protocol,超文本传输协议):主要用于普通浏览。
- HTTP 默认工作在 TCP 协议
80
端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。 - HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
4.2 Socket和HTTP的区别和应用场景
- Socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉; Socket适用场景:网络游戏,银行持续交互,直播,在线视屏等。
- HTTP连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断开,并等待下次连接。 HTTP适用场景:公司OA服务,互联网服务,电商,办公,网站等。
4.3 HTTP的请求与响应
4.3.1 HTTP请求
HTTP请求报文主要由 请求行、请求头部、请求正文(请求体)3部分组成:
- 请求行:
由3部分组成,分别为:请求方法、URL以及协议版本,之间由空格分隔。
- 请求方法包括:GET、PUT、POST、DELETE、OPTIONS、HEAD、TRACE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,处于安全性的考虑也是不可用的。
- 协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
- 请求头部: 请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。 常见请求头如下: 请求头说明Host接受请求的服务器地址,可以是IP:端口号,也可以是域名User-Agent发送请求的应用程序名称Connection指定与连接相关的属性,例如:Connection:Keep-AliveAccept-Charset通知服务端可以发送的编码格式Accept-Encoding通知服务端可以发送的数据压缩格式Accept-Language通知服务端可以发送的语言请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少。
- 请求正文:
可选部分,比如GET请求就没有请求正文。
- GET请求示例:
4.3.2 HTTP响应
1. 响应
HTTP响应报文主要由状态行、响应头部、响应正文3部分组成:
- 状态行:
由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔。
- 状态码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)。 这里列举几个常见的: 状态码说明200响应成功301永久移动,请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。302暂时重定向,服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。304缓存文件并未过期,还可继续使用,无需再次从服务端获取400客户端请求有语法错误,不能被服务器识别401请求需要认证403权限不足,无法对该资源进行访问404请求资源不存在500服务器内部错误503(服务器内部错误) 服务器遇到错误,无法完成请求。502网关错误504网关超时
- 响应头: 与请求头部类似,为响应报文添加了一些附加信息。 常见响应头部如下: 响应头说明Server服务器应用程序软件的名称和版本Content-Type响应正文的类型(是图片还是二进制字符串)Content-Length响应正文长度Content-Charset响应正文使用的编码Content-Encoding响应正文使用的数据压缩格式Content-Language响应正文使用的语言
2. 302和301区别
共同点:301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)。
不同点:301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO中302好于301。
4.4 HTTPS
HTTPS(HTTP over SSL,安全超文本传输协议):HTTP协议的安全版本。
- HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
- HTTPS 默认工作在 TCP 协议
443
端口,它的工作流程一般如以下方式:- TCP 三次同步握手
- 客户端验证服务器数字证书
- DH 算法协商对称加密算法的密钥、hash 算法的密钥
- SSL 安全加密隧道协商完成
- 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。
4.4.1 工作原理
我们都知道 HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。
- 客户端发起 HTTPS 请求: 这个没什么好说的,就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。
- 服务端的配置: 采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。 这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
- 传送证书: 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
- 客户端解析证书: 这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。 如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
- 传送加密信息: 这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
- 服务端解密信息: 服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
- 传输加密后的信息: 这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
- 客户端解密信息: 客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。
4.5 HTTP和HTTPS的区别
- 传输: HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL HTTP) 数据传输过程是加密的,安全性较好。
- 证书: 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。 证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
- 页面响应速度: HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
- 端口 HTTP和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
- 耗费资源 HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。
4.6 一次完整的HTTP请求
一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
- 建立TCP连接: 怎么建立连接的,看上面的三次握手。
- Web浏览器 向 Web服务器 发送请求行:
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:
GET /sample/hello.jsp HTTP/1.1
。 - Web浏览器发送请求头: 浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息。 之后浏览器发送 了一空白行来通知服务器,它已经结束了该头信息的发送。
- Web服务器响应状态行:
客户机向服务器发出请求后,服务器会客户机回送响应,
HTTP/1.1 200 OK
,应答的第一部分是协议 的版本号和应答状态码。 - Web服务器发送响应头: 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档。
- Web服务器向浏览器发送数据(响应体): Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
- Web服务器关闭TCP连接
4.6 ❤从输入址到获得页面的过程
4.6.1 简介版本
- 浏览器根据请求的
URL
里的域名进行 DNS域名解析,找到真实IP
,向服务器发起请求; - 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- 浏览器解析并渲染视图,若遇到对
js
文件、css
文件及 图片 等静态资源的引用,则重复上述步骤并向服务器请求这些资源; - 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
4.6.2 详细版本
- 在浏览器地址栏输⼊
URL
。 - 浏览器查看缓存,如果请求资源在缓存中并且新鲜(未过期),跳转到转码步骤。
- 如果资源未缓存,发起新请求
- 如果已缓存,检验是否⾜够新鲜,⾜够新鲜直接提供给客户端,否则与服务器进⾏验证。
- 检验新鲜通常有两个
HTTP
头进⾏控制Expires
和Cache-Control
:- HTTP1.0提供
Expires
,值为⼀个绝对时间表示缓存新鲜⽇期。 - HTTP1.1增加了
Cache-Control: max-age=time
,值为以秒为单位的最⼤新鲜时间。
- HTTP1.0提供
- 检验新鲜通常有两个
- 浏览器解析URL获取协议,主机,端⼝,
path
- 浏览器组装⼀个HTTP(GET)请求报⽂
- 浏览器获取主机
ip
地址,过程(获取域名对应的IP地址)如下:- 浏览器缓存: 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
- 系统缓存:
如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。
这样便可获得系统缓存中的记录。
这里也可以是hosts缓存:
hosts
⽂件 - 路由器缓存: 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
- ISP 的 DNS 缓存(本地DNS服务器,相当于一个大的 hosts 文件): 接下来要检查的就是 ISP缓存DNS 的服务器。在这一般都能找到相应的缓存记录。
- 根域名服务器:
ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归查询
(例如:
www.baidu.com
,DNS 服务器先问根域名服务器.com
域名服务器的 IP 地址,然后再问.baidu
域名服务器,依次类推)
- 打开⼀个
socket
与 ⽬标IP
地址、端口建立TCP连接,三次握手:- 客户端向服务端发送SYN。 A:喂,听得到吗?
- 服务端返回SYN和ACK。 B:听得到,你可以听到我说话吗?
- 客户端返回ACK。 A:听到了,我们可以开始正常交流了
TCP
链接建⽴后发送HTTP
请求- 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- 浏览器解析并渲染视图,若遇到对 js 文件、css文件及图片等静态资源的引用,则重复上述步骤并 向服务器请求这些资源;
- 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面,然后根据情况选择关闭TCP连接或者保留重⽤,四次挥手:
- 客户端与服务器交谈结束之后,客户端要结束此次会话,就会对服务器说:我要关闭连接了(第一次挥手)。
- 服务器收到客户端的消息后说:好的,知道你要关闭连接了。(第二次挥手)
- 然后服务器确定了没有话要和客户端说了,服务器就会对客户说,我要关闭连接了。(第三次挥手)
- 客户端收到服务器要结束连接的消息后说:已收到你要关闭连接的消息。(第四次挥手),才关闭。
4.7 GET 与 POST区别
- 目的: GET重点在从服务器上获取资源, POST 重点在向服务器发送数据。
- 传输数据量: GET传输的数据量小,因为受URL长度限制,但效率较高; POST 可以传输大量数据,所以上传文件时只能用Post方式;
- 安全性: GET 是不安全的,因为 GET 请求发送数据是在URL上,是可见的,可能会泄露私密信息, 如密码等; POST 是放在请求头部的,是安全的。
4.8 说下 HTTP/1.0,1.1,2.0 的区别
思路:这道题主要考察的知识点是 HTTP 几个版本的区别,我们记住HTTP/1.0默认是短连接,可以强制开启,HTTP/1.1 默认长连接,HTTP/2.0 采用多路复用就差不多啦。
- HTTP/1.0:
- 早先1.0的HTTP版本,是一种无状态、无连接的应用层协议。
- 默认使用短连接,每次请求都需要建立 TCP 连接。服务完成立即断开(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态),开销大。
- 不支持断点续传。它可以设置
Connection: keep-alive
这个字段,强制开启长连接。
- HTTP/1.1:
- 长连接: 默认长连接,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求(可以被多个请求复用)。
- 管线化: 同一个 TCP 连接里面,客户端可以同时发出多个HTTP请求,而不用一个个等待响应。
- 断点续传(分块传输): 指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。 即服务端每产生一块数据,就发送一块,用” 流模式” 取代” 缓存模式”。
- HTTP/2.0:
- 二进制分帧: 1.1 版本的头信息是文本(ASCII 编码),数据体可以是文本或者二进制。 2.0 中,头信息和数据体都是二进制,实现方便,健壮性更好。
- 首部压缩: HTTP 协议不带有状态,每次请求都必须附上所有信息。 Http/2.0 引入了头信息压缩机制,使用 gzip 或 compress 压缩后再发送,同时通信的双方各自缓存一份header fields表,避免了header的重复传输。
- 多路复用: 在一个连接里,客户端和浏览器都可以同时发送多个请求或响应,而且不用按照顺序一一对应。
- 服务器推送: 允许服务器未经请求,主动向客户端发送资源。
4.9 对称加密与非对称加密
- 对称加密: 对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方(现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人)
- 非对称加密: 非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性。但是和对称加密比起来,非常的慢。 例如: A:私钥A,公钥A B:私钥B,公钥B 公钥只能用来加密,A,B交换公钥,就可以达到A通过自己的私钥A解密B使用公钥A加密的内容,B同理。
4.10 Cookie和Session
HTTP协议本身是无法判断用户身份。所以需要Cookie或者Session。
- Cookie: Cookie是由Web服务器保存在 用户浏览器 上的文件(key-value格式),可以包含用户相关的信息。客户端向服务器发起请求,就提取浏览器中的用户信息由http发送给服务器。
- Session:
Session是浏览器和服务器会话过程中,后端服务器会分配的一块储存空间给Session。
服务器默认为客户浏览器的
cookie
中设置sessionid
,这个sessionid
就和cookie
对应,浏览器在向服务器请求过程中传输的cookie
包含sessionid
,服务器根据传输cookie
中的sessionid
获取会话中存储的信息,然后确定会话的身份信息。
4.10.1 二者区别:
- 存放范围不同:
Cookie
数据存放在客户端上,安全性较差,Session
数据放在服务器上,安全性相对更高。 - 存储大小不同:
单个
cookie
保存的数据不能超过4K,session
无此限制。 - 支持存储类型不同: 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保存一些常用变量信息,比如说 UserId 等。
- 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
4.11 URL、URI、URN
4.11.1 URL
URL全名为Uniform Resource Locator(统一资源定位),通过描述资源的位置来标识资源。也许这个扩展名称听起来很奇怪,但你可以简单地称之为地址。
同样,你可以把URL定义为一个字符串,表示互联网上某一资源的位置:一个网页、一张图片、一个邮箱等等。
例如:
代码语言:javascript复制 https://jwt.io
https://auth0.com/docs/get-started#learn-the-basics
https://identicons.dev/static/icons/mono/png/icon-access-token.png
mailto:yourfriend@somewhere.com
ftp://ftpserver.com/myfolder
URL的剖析:
一个URL由以下部分组成:
- 方案:在一个URL中,这是访问资源应该使用的协议。除了众所周知的HTTP和HTTPS,你还可以使用许多其他方案(FTP、SMTP等,详细见:更多方案)
- 域名:这部分表示托管资源的服务器。它可以是一个域名或一个IP地址。
- 端口:它是用来发送访问资源的请求的协议端口。通常情况下,它被省略,意味着应使用默认的协议端口(例如HTTP默认的80端口)。
- 路径:这是在托管服务器上的资源的路径。
- 参数:这些是提供给托管服务器的可选额外信息。
- 锚:这部分代表资源内部的一个特定部分。它也被称为片段。
由域名和端口组成的组,如果存在的话,也被称为authority
。
方案和 authority 由字符串分隔://
如果一个URL没有authority
,方案和URL的其余部分只用冒号 :
隔开。一个没有授权部分的URL的典型例子是代表一个电子邮件地址的URL,如 mailto:yourfriend@somewhere.com
。
4.11.2 URI
URI全名为Uniform Resource Indentifier(统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成。
4.11.3 URN
URN全名为Uniform Resource Name(统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!