应用层
网络互连模型
请求过程
网络分层
传输层补充
保活:每隔一段时间发送数据包(比如:每隔 5s 发送一个包)发送的包称为心跳包
- 如果建立连接后不需要进行数据交互就会关闭,那么就是短连接
- 如果建立连接后需要进行数据交互以后再关闭,那就是长连接
TCP 释放连接补充
有时候在使用抓包工具的时候,有可能会看到 "3次" 挥手,其实是将第 2、3 次挥手合并了
当 server 接收到 client 的 FIN 时,如果 server 后面也没有数据要发给 client 了
这时,server 就可以将第 2、3 次挥手合并,同时告诉 client 两件事
- 已经知道 client 没有数据要发
- server 已经没有数据要发了
TCP 每个报文最长存活 1msl 时间(2 分钟)
长连接、短连接
- 短连接通常是指拿完数据是否关掉(交互方式),关掉就是短连接
- 需要实时交互用长连接
单播:向单个目标地址传送数据的方式
广播:向本地网络中所有设备发送数据的方式
组播:向一个组中发送数据包的方式
任播:将一个数据包发送到一个指定的设备集合(通常是距离发送端最近的设备),而不指定任何目的地地址
应用层
Domain Name
由于 IP 地址不方便记忆,并且不能表达组织的名称和性质,人们设计出了域名(比如:baidu.com)
- 但实际上,为了能够访问到具体的主机,最终还是得知道目标主机的 IP 地址
那干脆全称直接用域名,不用 IP 地址?
- IP 地址固定 4 个字节,域名随随便便都至少 10 几个字节,这无疑会增加路由器的负担,浪费流量
根据级别不同,域名可以分为:
- 顶级域名(Top-Level Domain)
- 二级域名
- 三级域名
通用顶级域名(General Top-Level Domain,简称 gTLD)
- .com(公司)、.net(网络机构)、.org(组织机构)、.edu(教育)、.gov(政府部门)、.int(国际组织)等
国家及地区顶级域名(Country Code Top-Level Domain,简称 ccTLD)
- .cn(中国)、.jp(日本)、.uk(英国)
新通用顶级域名(New Generic Top-Level Domain,简称 New gTLD)
- .vip、.xyz、.top、.club、.shop 等
二级域名是指顶级域名
- 在通用顶级域名下,它一般指域名注册人的名称,例如:google、baidu、microsoft 等
- 在国家及地区顶级域名下,它一般指注册类别的,例如:com、edu、gov、net 等
DNS
DNS 的全称:Domain Name System,译为:域名系统
- 利用 DNS 协议,可以将域名(比如 baidu.com)解析成对应的 IP 地址
- DNS 可以基于 UDP 协议,也可以基于 TCP 协议,服务器占用 53 端口
域名解析过程
先看自己浏览器缓冲有没有对应的 IP 记录,同时还要查询一下主机本地文件里面有没有对应记录,如果有记录就没有必要进行后面的步骤了
浏览器为了进行域名解析,是需要调用解析器。本地 DNS 服务器得到地址后会返给我们的解析器并缓存,解析器接着把地址给浏览器
- 解析器与本地 DNS 服务器之间用的是递归的方式传输
- 本地 DNS 服务器和三层服务器之间用的是迭代的方式传输
- 本地 DNS 服务器由 ISP 互联网服务提供商管理(电信、网通)
$ nslookup
$ set type=ns # name server
$ .
服务器: public1.114dns.com
Address: 114.114.114.114
非权威应答:
(root) nameserver = d.root-servers.net
(root) nameserver = e.root-servers.net
(root) nameserver = f.root-servers.net
(root) nameserver = g.root-servers.net
(root) nameserver = h.root-servers.net
(root) nameserver = i.root-servers.net
(root) nameserver = j.root-servers.net
(root) nameserver = k.root-servers.net
(root) nameserver = l.root-servers.net
(root) nameserver = m.root-servers.net
(root) nameserver = a.root-servers.net
(root) nameserver = b.root-servers.net
(root) nameserver = c.root-servers.net
$ set type=a # ipv4
$ b.root-servers.net.
服务器: public1.114dns.com
Address: 114.114.114.114
非权威应答:
名称: b.root-servers.net
Address: 199.9.14.201
$ server 199.9.14.201
默认服务器: b.root-servers.net
Address: 199.9.14.201
$ set type=ns
$ com.
服务器: b.root-servers.net
Address: 199.9.14.201
com nameserver = a.gtld-servers.net
com nameserver = b.gtld-servers.net
com nameserver = c.gtld-servers.net
com nameserver = d.gtld-servers.net
com nameserver = e.gtld-servers.net
com nameserver = f.gtld-servers.net
com nameserver = g.gtld-servers.net
com nameserver = h.gtld-servers.net
com nameserver = i.gtld-servers.net
com nameserver = j.gtld-servers.net
com nameserver = k.gtld-servers.net
com nameserver = l.gtld-servers.net
com nameserver = m.gtld-servers.net
a.gtld-servers.net internet address = 192.5.6.30
a.gtld-servers.net AAAA IPv6 address = 2001:503:a83e::2:30
b.gtld-servers.net internet address = 192.33.14.30
b.gtld-servers.net AAAA IPv6 address = 2001:503:231d::2:30
c.gtld-servers.net internet address = 192.26.92.30
c.gtld-servers.net AAAA IPv6 address = 2001:503:83eb::30
d.gtld-servers.net internet address = 192.31.80.30
d.gtld-servers.net AAAA IPv6 address = 2001:500:856e::30
e.gtld-servers.net internet address = 192.12.94.30
e.gtld-servers.net AAAA IPv6 address = 2001:502:1ca1::30
f.gtld-servers.net internet address = 192.35.51.30
f.gtld-servers.net AAAA IPv6 address = 2001:503:d414::30
$ server 192.33.14.30
默认服务器: [192.33.14.30]
Address: 192.33.14.30
$ set type=ns
$ bilibili.com
服务器: [192.33.14.30]
Address: 192.33.14.30
bilibili.com nameserver = ns3.dnsv5.com
bilibili.com nameserver = ns4.dnsv5.com
ns3.dnsv5.com internet address = 1.12.0.17
ns3.dnsv5.com internet address = 1.12.0.18
ns3.dnsv5.com internet address = 1.12.0.20
ns3.dnsv5.com internet address = 108.136.87.44
ns3.dnsv5.com internet address = 157.148.62.79
ns3.dnsv5.com internet address = 183.47.126.169
ns3.dnsv5.com AAAA IPv6 address = 2402:4e00:1430:1102:0:9136:2b2b:ba61
ns3.dnsv5.com internet address = 35.165.107.227
ns3.dnsv5.com internet address = 36.155.149.211
ns3.dnsv5.com internet address = 49.234.175.103
ns4.dnsv5.com internet address = 1.12.0.16
ns4.dnsv5.com internet address = 1.12.0.19
ns4.dnsv5.com internet address = 106.55.82.76
ns4.dnsv5.com internet address = 112.80.181.106
ns4.dnsv5.com internet address = 117.89.178.200
ns4.dnsv5.com internet address = 120.241.130.93
ns4.dnsv5.com internet address = 13.37.58.163
ns4.dnsv5.com internet address = 150.109.248.236
ns4.dnsv5.com internet address = 183.47.126.155
ns4.dnsv5.com AAAA IPv6 address = 2402:4e00:1020:1264:0:9136:29b6:fc32
$ server 1.12.0.17
默认服务器: [1.12.0.17]
Address: 1.12.0.17
$ set type=ns
$ www.bilibili.com.
服务器: [1.12.0.17]
Address: 1.12.0.17
www.bilibili.com canonical name = a.w.bilicdn1.com
bilibili.com nameserver = ns4.dnsv5.com
bilibili.com nameserver = ns3.dnsv5.com
$ set type=a
$ cm.w.bilicdn1.com
服务器: [1.12.0.17]
Address: 1.12.0.17
名称: cm.w.bilicdn1.com
Addresses: 221.178.63.10
221.178.63.11
221.178.63.12
223.111.250.53
223.111.250.54
223.111.250.55
223.111.250.56
223.111.250.57
111.6.167.134
111.6.167.135
111.31.33.18
111.31.33.19
111.31.33.20
111.31.33.21
111.48.57.44
111.48.57.45
111.48.57.46
112.13.92.195
112.13.92.196
112.13.92.199
DNS 服务器
- 客户端首先会访问最近的一台 DNS 服务器(也就是客户端自己配置的 DNS 服务器)
- 所有的 DNS 服务器都记录了 DNS 根域名服务器的 IP 地址
- 上级 DNS 服务器记录了下一级 DNS 服务器的 IP 地址
- 全球一共 13 台 IPv4 的 DNS 根域名服务器、25 台 IPv6 的 DNS 根域名服务器
- 注意:是 13 个域名不是 13 个机器
DNS 常用命令
- ipconfig /displaydns:查看 DNS 缓存记录
- ipconfig /flushdns:清空 DNS 缓存记录
- ping 域名
- nslookup 域名
IP 地址分配
$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet # 设置网卡类型,“Ethernet”表示以太网
DEVICE=ens33 # 设置网卡的名称
ONBOOT=yes # 设置网卡是否在 Linux 操作系统启动时激活
BOOTPROTO=static # 设置网卡的配置方式,“static”表示使用静态IP地址,“dhcp”时表示动态获取地址
IPADDR=192.168.80.3 # 设置网卡的 IP 地址
NETMASK=255.255.255.0 # 设置网卡的子网掩码
GATEWAY=192.168.80.2 # 设置网卡的默认网关地址
DNS1=192.168.80.2 # 设置DNS服务器的 IP 地址
IP 地址按照分配方式,可以分为:静态 IP 地址、动态 IP 地址
- 静态 IP 地址
- 手动设置
- 适用场景:不怎么挪动的台式机(比如学校机房中的台式机)、服务器等
- 动态 IP 地址
- 从 DHCP 服务器自动获取 IP 地址
- 适用场景:移动设备、无线设备等
DHCP
DHCP(Dynamic Host Configuration Protocol),译为:动态主机配置协议
- DHCP 协议基于 UDP 协议,客户端是 68 端口,服务器是 67 端口
- DHCP 服务器会从 IP 地址池中,挑选一个 IP 地址 "出租" 给客户端一段时间,时间到期就回收它们
分配 IP 地址的 4 个阶段:
- DISCOVER:发现服务器
- 发现与寻找 DHCP 服务器,这个为应用层报文
- 传输层使用 UDP 进行传输
- 针对新设备网络层一开始不知道源 IP 和目标 IP(源 IP 可以填写
0.0.0.0
,目标 IP 可以填写255.255.255.255
)。之后进行广播,路由器收到广播数据包后不进行转发,路由器独享 - 数据链路层也需要知道源 MAC 和目标 MAC 地址(源 MAC 地址自己知道,目标 MAC 地址填
ff:ff:ff:ff:ff:ff
)
- OFFER:提供租约
- 服务器返回可以租用的 IP 地址,以及租用期限、子网掩码、网关、DNS 等信息
- 注意:这里可能会有多个服务器提供租约
- REQUEST:选择 IP 地址
- 客户端选择一个 OFFER,发送广播包进行回应(网络中可能有其他 DHCP 服务器)
- ACKNOWLEDGE:确认
- 被选中的服务器发送 ACK 数据包给客户端
- 至此,IP 地址分配完毕,新设备就可以开始上网了
DHCP 服务器可以跨网段分配 IP 地址么?
- 可以借助 DHCP 中继代理(DHCP Relay Agent)实现跨网段分配 IP 地址
自动续约
- 客户端会在租期不足的时候,自动向 DHCP 服务器发送 REQUEST 信息申请续约
常用命令
- ipconfig /all:可以看到 DHCP 相关的详细信息,比如租约过期时间、DHCP 服务器地址等
- ipconfig /release:释放租约
- ipconfig /renew:重新申请 IP 地址、申请续约(延长租期)
HTTP
HTTP(Hyper Text Transfer Protocol):超文本传输协议
- 是互联网中应用最广泛的应用层协议之一
- 设计 HTTP 最初的目的是:提供一种发布和接收 HTML 页面的方法,由 URI 来标识具体的资源
- 后面用 HTTP 来传递的数据格式不仅仅是 HTML,应用非常广泛
HTML(Hyper Text Markup Language):超文本标记语言
- 用以编写网页
版本
1991 年,HTTP/0.9
- 只支持 GET 请求方法获取文本数据(比如 HTML 文档),且不支持请求头、响应头,无法向服务器传递太多信息
1996 年,HTTP/1.0
- 支持 POST、HEAD 等请求方法,支持请求头、响应头等,支持更多种数据类型(不再限制于文本数据)
- 浏览器的每次请求都需要与服务器建立一个 TCP 连接,请求处理完成之后立即断开 TCP 连接
1997 年,HTTP/1.1(最经典、使用最广泛的版本)
- 支持 PUT、DELETE 等请求方法
- 采用持久化(Connection: keep-alive),多个请求可以共用同一个 TCP 连接
2015 年,HTTP/2.0
2018 年,HTTP/3.0
标准
HTTP 的标准
- 由万维网协会(W3C)、互联网工程任务组(IETF)协调制定,最终发布了一系列的 RFC
RFC(Request For Comments,可以译为:请求意见稿)
中国的 RFC
- 1996 年 3 月,清华大学提交的适应不同国家和地区中文编码的汉字统一传输标准被 IETF 通过为 RFC 1922
- 成为中国大陆第一个被认可为 RFC 文件的提交协议
状态行 -> 请求行,首部行 -> 请求头,实体主体 -> 请求体
ABNF
ABNF(Augmented BNF)
- 在 BNF(Backus-Naur Form,译为:巴科斯-瑙尔范式)的修改、增强版
- 在 RFC 5234 中表明:ABNF 用作 internet 中通信协议的定义语言
- ABNF 是最严谨的 HTTP 报文格式描述形式,脱离 ABNF 谈论 HTTP 报文格式,往往都是片面、不严谨的
关于HTTP报文格式的定义
报文格式
HTTP-message = start-line *( header-field CRLF ) CRLF [ message-body ]
start-line = request-line / status-line
正则 | 释义 |
---|---|
/ | 任选一个 |
* | 0个或多个。2* 表示至少2个。3*6 表示3到6个 |
() | 组成一个整体 |
[] | 可选(可有可无) |
request-line = method SP request-target SP HTTP-version CRLF
HTTP-name = %x48.54.54.50 ; HTTP
HTTP-version = HTTP-name "/" DIGIT "." DIGIT
# GET /hello/ HTTP/1.1
status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
reason-phrase = *( HTAB / SP / VCHAR / obs-text )
# HTTP/1.1 200
# HTTP/1.1 200 OK
header-field = field-name ":" OWS field-value OWS
field-name = token
field-value = *( field-content / obs-fold )
OWS = *( SP / HTAB )
message-body = *OCTET
URL编码
- URL 中一旦出现了一些特殊字符(比如中文、空格),需要进行编码
encodeURI
- 在浏览器地址栏输入URL时,是采用 UTF-8 进行编码
比如
- 编码前:
https://www.baidu.com/s?wd=百度
- 编码后:
https://www.baidu.com/s?wd=%E5%8D%8E%E4%B8%BA
请求方法
RFC 7231, section 4: Request methods:描述了 8 种请求方法
- GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE
RFC 5789, section 2: Patch method:描述了 PATCH 方法
请求方法:
GET:常用于读取的操作,请求参数直接拼接在 URL 的后面(浏览器对 URL 是有长度限制的)
POST:常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
HEAD:请求得到与 GET 请求相同的响应,但没有响应体
使用场景:在下载一个大文件前,先获取其大小(HEAD),再决定是否要下载(GET)。以此可以节约带宽资源
OPTIONS:用于获取目的资源所支持的通信选项,比如:服务器支持的请求方法
- OPTIONS * HTTP/1.1
- 通过向 Tomcat 发送 OPTIONS请求,可以知道它支持以下请求方法
PUT:用于对已存在的资源进行整体覆盖
PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)
DELETE:用于删除指定的资源
TRACE:请求服务器回显其收到的请求信息,主要用于 HTTP 请求的测试或诊断
CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)
- 可以用来访问采用了 SSL (HTTPS) 协议的站点
头部字段
请求头字段可以分为 4 中类型
请求头字段(Request Header Fields)
有关要获取的资源或客户端本身信息的消息头
响应头字段(Response Header Fields)
有关响应的补充信息,比如服务器本身(名称和版本等)的消息头
实体头字段(Entity Header Fields)
有关实体主体的更多信息,比如主体长度(Content-Length)或其 MIME 类型
通用头字段(General Header Fields)
同时适用于请求和响应消息,但与消息主体无关的消息头
请求头字段
- Referer 可用于防盗链
zh-CN,zh;q=0.9,en;q=0.8
q 值越大,表示优先级越高,如果不指定 q 值,默认是 1.0(1.0 是最大值)- Range 可用于多线程下载、断点下载
响应头
状态码
在 RFC 2616 10.Status Code Definitions 规范中定义
- 状态码指示HTTP请求是否已成功完成
状态码可以分为5类
- 信息响应:100~199
- 成功响应:200~299
- 重定向:300~399
- 客户端错误:400~499
- 服务器错误 :500~599
常见状态码
100 Continue
- 请求的初始部分已经被服务器收到,并且没有被服务器拒绝。客户端应该继续发送剩余的请求,如果请求已经完成,就忽略这个响应
- 允许客户端发送带请求体的请求前,判断服务器是否愿意接收请求(服务器通过请求头判断)
- 在某些情况下,如果服务器在不看请求体就拒绝请求时,客户端就发送请求体是不恰当的或低效的
200 OK:请求成功
302 Found:请求的资源被暂时的移动到了由 Location 头部指定的 URL 上
304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容
400 Bad Request:由于语法无效,服务器无法理解该请求
请求报文格式不对,服务器返回 400;格式没有问题,参数有问题,也可以主动发 400
401 Unauthorized:由于缺乏目标资源要求的身份验证凭证
403 Forbidden:服务器端有能力处理该请求,但是拒绝授权访问
404 Not Found:服务器端无法找到所请求的资源
405 Method Not Allowed:服务器禁止了使用当前 HTTP 方法的请求
406 Not Acceptable:服务器端无法提供与 Accept-Charset 以及 Accept-Language 指定的值相匹配的响应
408 Request Timeout:服务器想要将没有在使用的连接关闭
- 一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下
500 Internal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
501 Not Implemented:请求的方法不被服务器支持,因此无法被处理
- 服务器必须支持的方法(即不会返回这个状态码的方法)只有 GET 和 HEAD
502 Bad Gateway:作为网关或代理角色的服务器,从上游服务器(如 tomcat)中接收到的响应是无效的
503 Service Unavailable:服务器尚未处于可以接受请求的状态
- 通常造成这种情况的原因是由于服务器停机维护或者已超载
form表单
- action:请求的 URI
- method:请求方法(GET、POST)
- enctype:POST 请求时,请求体的编码方式
application/x-www-form-urlencoded
(默认值)- 用 & 分割参数,用 = 分割键和值,字符用 URL 编码方式进行编码
multipart/form-data
- 文件上传必须使用这种编码方式
multipart/form-data
参考 RFC 1521
请求头:
Content-Type: multipart/form-data; boundary=xxx
# Form Data
------WebKitFormBoundaryqHQEzTSOWUS41Xn8
Content-Disposition: form-data; name="files"; filename="xx.pdf"
Content-Type: application/pdf
------WebKitFormBoundaryqHQEzTSOWUS41Xn8--
Content-Disposition: form-data; name="payload";
this is payload
------WebKitFormBoundaryqHQEzTSOWUS41Xn8--
# 请求头
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqHQEzTSOWUS41Xn8
数据格式
multipart-body := preamble 1*encapsulation close-delimiter epilogue
encapsulation := delimiter body-part CRLF
delimiter := "--" boundary CRLF ; taken from Content-Type field. ; There must be no space ; between "--" and boundary.
close-delimiter := "--" boundary "--" CRLF ; Again, no space
by "--"
preamble := discard-text ; to be ignored upon receipt
epilogue := discard-text ; to be ignored upon receipt
跨域
浏览器有个 同源策略 (Same-Origin Policy)
- 它规定了:默认情况下,AJAX 请求只能发给同源的 URL
- 同源是指 3 个相同:协议、域名(IP)、端口
- img、script、link、iframe、video、audio 等标签不受同源策略的约束
解决 AJAX跨域请求的常用方法
- CORS (Cross-Origin Resource Sharing),跨域资源共享
CORS 的实现需要客户端和服务器同时支持
客户端
基本所有的浏览器都支持(IE 至少是 IE10 版本)
服务器
需要返回相应的响应头(比如 Access-Control-Allow-Origin),告知浏览器这是一个允许跨域的请求
Access-Control-Allow-Origin 用于允许跨域
Cookie、Session
cookie 和 session 的区别:
- cookie 数据存放在客户的 浏览器 上,session 数据存放在 服务器 上
- cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。用户验证这种场合一般会用 session
- session 保存在服务器,客户端不知道其中的信息;反之,cookie 保存在客户端,服务器能够知道其中的信息
- session 会在一定时间内保存在服务器上,当访问增多,会比较占用服务器的性能,考虑减轻服务器性能方面,应当使用 cookie
- session 中保存的是对象,cookie 保存的是字符串
- session 不能区分路径,同一个用户在访问一个网站期间,所有的 session 在任何一个地方都可以访问到,而 cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 cookie 互相是访问不到的
localStorage、sessionStorage、cookie 的区别
共同点:都是保存在浏览器端,且同源的
数据存储方面
- cookie 数据始终在同源的 http 请求中携带,即 cookie 在浏览器和服务器之间来回传递,cookie 数据还有路径概念,可以限制 cookie 只属于某个路径下
- sessionStorage 和 localStorage 不会自动把数据发送给服务器,仅在本地保存
存储数据大小
- cookie 数据不能超过 4k,同时因为每次 http 请求都会携带 cookie,所以 cookie 只适合保存很小的数据,如会话标识
- sessionStorage 和 localStorage 虽然也有存储大小的限制,但是比 cookie 大的多,可以达到 5M 或更大
数据存储有效期
sessionStorage 仅在当前浏览器窗口关闭之前有效
在该标签或窗口打开一个新页面会赋值顶级浏览器会话的上下文作为新会话的上下文
window.open("同源页面")
这种方式新开的页面会复制之前的 sessionStoragea标签
新开的页面同样也会,需要加rel="opener"
localStorage 始终有效,窗口或浏览器关闭也一直保存,本地存储,因此用作持久数据
cookie 只在设置的 cookie 过期时间之前有效,即使窗口关闭或者浏览器关闭
作用域不同
- sessionStorage 不在不同的浏览器窗口中共享,即使是同一个页面
- localStorage 在所有同源窗口中都是共享的,也就是只要浏览器不关闭,数据仍然存在
- cookie 也是在所有同源窗口中都是共享的,也就是说只要浏览器不关闭,数据仍然存在
代理服务器
特点:
- 本身不产生内容
- 处于中间位置转发上下游的请求和响应
- 面向下游的客户端:它是服务器
- 面向上游的服务器:它是客户端
正向代理:代理的对象是客户端
反向代理:代理的对象是服务器
正向代理作用:
- 隐藏客户端身份
- 绕过防火墙(突破访问限制)
- Internet 访问控制
- 数据过滤
免费的正向代理:https://www.kuaidaili.com/free/inha/1/
反向代理作用:
- 隐藏服务器身份
- 安全防护
- 负载均衡
抓包工具原理
Fiddler、Charles等抓包工具的原理:在客户端启动了正向代理服务
需要注意的是:
- Wireshark 的原理:通过底层驱动,拦截网卡上流过的数据
相关头部字段
- Via:追加经过的每一台代理服务器的主机名(或域名)
- X-Forwarded-For:追加请求方的 IP 地址
- X-Real-IP:客户端的真实 IP 地址
CDN
CDN(Content Delivery Network 或 Content Distribution Network),内容分发网络
- 利用最靠近每位用户的服务器
- 更快更可靠地将音乐、图片、视频等资源文件(一般是静态资源)传递给用户
CDN 运营商在全国、乃至全球的各个大枢纽城市都建立了机房
- 部署了大量拥有高存储高带宽的节点,构建了一个跨运营商、跨地域的专用网络
内容所有者向 CDN 运营商支付费用,CDN 将其内容交付给最终用户
安全性和可靠性
- 布局多台 CDN 服务器在各个地方,监听这些 CDN 服务器的负载情况。如果某台服务器超载,就会把用户那边的请求转移到没有超载的 CDN 服务器那边,负载均衡
- 如果让开发者在代码上给资源指定多个地址是很麻烦的事情,可以使用任播,用了任播服务器对外都拥有同样的一个 IP 地址,IP 地址收到请求,就由距离用户最近的服务器来响应
- CDN 加速器还会帮你把文件最小化或压缩文档
使用 CDN 之前
使用 CDN 之后