1. HTTP和TCP/IP、DNS的关系
当浏览器访问Web站点时,首先会通过DNS服务查询到域名的IP地址。然后浏览器生成HTTP请求,并通过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,并通过TCP/IP协议返回给浏览器。
2. DNS服务
DNS相当于一个数据库,记录着很多URL和对应的ip地址
当我们在浏览器地址栏上输入要访问的URL后,浏览器会分析出URL上面的域名,然后通过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通信。
3. TCP/IP协议
2.1 应用层
应用层直接面向用户应用程序,它提供了应用程序之间的通信功能,使得用户可以通过网络进行各种操作,如浏览网页、发送邮件、文件传输等。
应用层协议定义了应用程序之间的通信规则,使得不同应用程序可以通过网络交换数据。
常见的应用层协议有HTTP协议(用于 Web 浏览器和服务器之间的通信)、DNS协议(用于域名解析,将域名转换为 IP 地址)
2.2 传输层
负责端到端的通信,即在源主机和目标主机之间建立和管理连接,确保数据的可靠传输
传输层协议有TCP协议(提供可靠的、面向连接的传输服务,在传输数据之前必须先建立连接,即三次握手)、UDP协议(提供无连接的、不可靠的传输服务)
2.3 网际层(IP)
略
2.4 网络接口层
略
4. HTTP协议
HTTP协议,超文本传输协议,是应用层协议,是客户端和服务器之间通信的规则。
4.1 HTTP协议规定了请求报文和响应报文的格式
4.1.1 请求报文格式
- 请求行:请求方法、请求地址、HTTP协议版本
- 请求头(请求首部):关于浏览器的信息,由键值对组成,一行一对
- 空行
- 请求数据
请求方法
常见的有 GET、POST、PUT.....
请求首部
通过请求头告诉服务器客户端的情况
-
Host:想访问的服务器的IP地址或域名
-
User-Agent:告诉服务器,客户端的软件环境,如浏览器版本、操作系统
-
Accept:告诉服务器,客户端可以接受的信息的类型,如image、jpg、text、html
-
Accept-Charset:告诉服务器,客户端支持的字符集
-
Accept-Encoding:告诉服务器,客户端能够处理的压缩编码
-
Accept-Language:告诉服务器,客户端能够接受的语言
-
Cookie
-
Referer:表示从哪个站点跳转过来
-
Connection:客户端告诉服务器,在完成本次请求后,是否继续保持联系,如keep-alive
4.1.2 响应报文格式
- 状态行:HTTP协议版本、状态码、原因短语
- 响应头(响应首部):由键值对组成,一行一对
- 空行
- 响应数据
HTTP状态码
- 2xx 成功
- 3xx 重定向 让浏览器执行某些特殊的处理eg.304表示可以使用缓存的内容
- 4xx 客户端错误 eg.404表示被客户端拒绝或找不到请求的资源
- 5xx 服务器错误 eg.500表示服务器内部发生错误或故障
响应首部首部
- Location:服务器告诉客户端,你要请求的资源已被转移到的新的位置
- Server:服务器告诉客户端,服务器的信息,如版本号
- Content-Type:服务器告诉客户端,返回的数据类型,如text、html
- Date:服务器响应发送的时间
4.2 HTTP 1.0 和 HTTP 1.1 区别
4.2.1 连接管理
1. 短连接
短连接是指每个 HTTP 请求/响应对都使用一个新的 TCP 连接。也就是说,每次请求完成后,连接就会关闭,下次请求需要重新建立连接
每次请求都需要经历 TCP 的三次握手和四次挥手过程,增加了网络开销
2. 长连接
长连接是指在同一个 TCP 连接上可以发送多个 HTTP 请求/响应对。也就是说,一个连接可以用于多个请求,直到连接显式关闭
避免了频繁的 TCP 三次握手和四次挥手过程,减少了建立和关闭连接的开销
3. HTTP 1.0 默认短连接,要想连接得到保持,必须手动配置发送Connection: keep-alive字段。若想断开keep-alive连接,需发送Connection:close字段
HTTP 1.1 默认长连接,如果需要关闭,需要客户端发送Connection:close首部字段
4. HTTP 1.0 规定下一个请求必须在前一个请求响应到达之后才能发送。若前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就都阻塞,故HTTP 1.0 存在请求的队头阻塞
HTTP 1.1 可以使用管道传输,支持多个请求同时发送,不必等待响应,但服务器依旧按照顺序先回应前面的请求,再回应后面的请求,如果前面的请求特别慢,后面的请求仍会阻塞
4.2.2 带宽优化
HTTP 1.0 不支持断点续传,每次都会传送全部的页面和数据,在只需要部分数据的情况下就会浪费多于带宽
HTTP 1.1 支持断点续传,在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content)
4.2.3 缓存机制
强缓存的触发:
HTTP 1.0 :Expires
HTTP 1.1 :Cache-Control
协商缓存触发:
HTTP 1.0 :请求头:if-modified-since 响应头:last-modified
HTTP 1.1 :请求头:if-none-match 响应头:Etag
5. 浏览器缓存
对于浏览器的缓存,主要针对的是前端的静态资源,最好的效果就是,在发起请求之后,拉取相应的静态资源,并保存在本地。如果服务器的静态资源没有更新,那么在下次请求的时候,就直接从本地读取即可,如果服务器的静态资源已经更新,那么我们再次请求的时候,就到服务器拉取新的资源,并保存在本地。
通过缓存,浏览器可以减少对服务器的请求次数,加快页面加载速度,减轻服务器负担,并提高用户体验。
浏览器缓存是一个广义概念,包括内存缓存、硬盘缓存、HTTP缓存
HTTP缓存是基于HTTP协议的缓存机制,实质上是通过不同的HTTP头部字段做出不同的缓存动作
5.1 强缓存和协商缓存
强缓存是指浏览器直接使用缓存中的资源,而无需向服务器发送请求。
强缓存验证:如果资源未过期(max-age 或 Expires 未到),浏览器直接使用缓存,不向服务器发送请求。
协商缓存是指浏览器向服务器发送请求,验证缓存的有效性。如果资源未变化,服务器返回 304 状态码,浏览器使用缓存。
协商缓存验证:如果资源已过期或需要验证,浏览器会向服务器发送请求,携带 If-None-Match 或 If-Modified-Since 头部字段
-
如果资源未变化,服务器返回 304 状态码,浏览器使用缓存。
-
如果资源已变化,服务器返回新的资源和 200 状态码。
5.2 头部字段
1. Expires: 指定资源的过期时间
Expires: Thu, 01 Dec 2023 16:00:00 GMT
缺点:Expires时间是服务端返回的,比对的却是客户端时间,可能服务端与客户端时间不一致
2. Cache-Control
① max-age=
指定资源的最大有效时间(以秒为单位)
Cache-Control: max-age=3600
② no-cache
表示浏览器必须在使用缓存之前验证资源的有效性
③ no-store
表示浏览器不应存储任何关于请求或响应的信息
④ public
表示响应可以被任何缓存存储,适用于公共资源
⑤ private
表示响应只能被单个用户缓存,不能被共享缓存存储,适用于用户特定的数据
3. Last-Modified: 资源的最后修改时间 / If-Modified-Since
浏览器向服务器发送请求,服务器在响应中返回 Last-Modified,浏览器在后续请求中都带上 If-Modified-Since ,值就是Last-Modified的值,即返回的最后修改时间,服务器拿到这个值与服务器当前资源的最后修改时间做比对,若结果是无变化,服务器返回304状态码,浏览器可以使用缓存;若结果有变化,说明资源已经更新,服务器返回200状态码,给浏览器正常返回资源
缺点:Last-Modified以秒级别记录,若资源在1s内发生变化,Last-Modified认为无变化
4. ETag / If-None-Match
浏览器向服务器发送请求,服务器根据文件内容生成唯一标识,这个表示通过响应头ETag字段值传送给浏览器,浏览器在后续每次请求时都带上If-None-Match,值就是ETag的值,服务器拿到这个值和服务器当前的ETag做比对,若结果是无变化,服务器返回304状态码,浏览器可以使用缓存;若结果有变化,说明资源已更新,服务器返回200状态码,给浏览器正常返回资源