浏览器和服务器间通信

106 阅读1分钟

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-ageExpires 未到),浏览器直接使用缓存,不向服务器发送请求。

协商缓存是指浏览器向服务器发送请求,验证缓存的有效性。如果资源未变化,服务器返回 304 状态码,浏览器使用缓存。

协商缓存验证:如果资源已过期或需要验证,浏览器会向服务器发送请求,携带 If-None-MatchIf-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状态码,给浏览器正常返回资源