引言¶
- HTTP/1.1
Port:80
- HTTPS
Port:443
安全:使用 TLS
- HTTP2/SPDY
Port:沿用 HTTP/HTTPS
安全:强制使用TLSv1.2
效率:多路复用,头部使用了HPACK压缩算法
- HTTP3/QUIC
Port:没有指定默认端口号
安全:强制使用TLSv1.3
效率:传输基于QUIC(Quick UDP Internet Connections)
其它
- 文件传输 FTP
- 电子邮件 E-mail
- 远程登录 Telnet
- 万维网 WWW
网络架构模式¶
主机A的某个进程和主机B上的另一个进程进行通信
- P2P(Peer-to-Peer)不区分客户端和服务端,两台主机是对等关系
- C/S(Client/Server)区分为客户端和服务端,客户端是主机上的程序
- B/S(Browser/Server)区分为客户端端和服务端,客户端是浏览器
URI¶
Uniform Resource Identifier 统一资源标识符,是一种抽象的定义,只要能唯一标识资源的都可以叫URI
- URL(Uniform Resource Locator) 统一资源定位符,通过地址定位标识资源,最常用的就是网址
- URN(Uniform Resource Name) 统一资源名称,通过名称定位标识资源,比如书籍的isbn号
Resources 资源,就是网络上的一个实体,可以有不同的表现形式,称之为表现层
它可以是 TXT、XML、JSON、HTML 等文本、PNG、JPG 等图片、音频、视频、服务等等
可以在请求头中使用 Accept
和 Content-Type
字段指定表现形式以及版本号等
URL组成:scheme:[subscheme]://[username:password@]host:port/path?query#fragment
- scheme 协议,比如:http, https
- subscheme 子协议,用于区分数据库,比如:
- host 域名 或 IP
DNS¶
Domain Name System 域名系统,是域名与IP地址相互映射的一个分布式数据库,因为IP地址不方便记忆,使用域名来映射它
域名地址有不同的记录类型,比如:A、CNAME、MX等,每种类型可以包含多条记录。
浏览器通过URL解析出域名后
- 首先会查询本地DNS缓存(
/etc/hosts
)是否有该域名的地址记录本地DNS缓存超过生命周期后才会主动更新
- 如果没有就会去查询本地域名服务器(或者叫DNS服务器)
本地域名服务器的IP地址通常由DHCP自动分配,或者在拨号时从PPP服务器中自动获取,也可以用户手动指定
本地域名服务器部署在ISP的某个数据中心,到达这里也会先查询本地缓存
- 本地域名服务器如果也没有,则会进行递归查询:根域名服务器、顶级域名服务器、权威域名服务器
权威域名服务器根据访问者所处的不同地区(如华北、华南、东北等)、不同服务商(如电信、移动、联通等)等因素智能选择出某种记录类型对应的最合适的记录,返回给客户端
如果域名服务器挂了,或域名服务器的 IP 填错了,或请求被 GFW 拦截了,最终都会没有响应然后报错
基于 UDP 的 DNS 分级查询意味着每一级都有可能受到中间人攻击的威胁,比如域名劫持、域名污染/欺骗
可以使用安全的DNS协议来解决,比如 DoH(DNS over HTTPS)
CDN¶
Content Distribution Network 内容分发网络
内容分发,指的就是获取源站资源的过程,主要有两种方式:
- 主动分发
将内容从源站或者其他资源库推送到用户边缘的各个CDN缓存节点上,特别常用的资源甚至会直接缓存到手机APP的存储空间或者浏览器的localStorage中。
- 被动回源
由用户访问所触发全自动、双向透明的资源缓存过程,如果不是自建CDN,而是购买阿里云、腾讯云的CDN服务的站点,多数采用的就是这种方式。
CDN最初是为了快速分发静态资源而设计的,而如今CDN所能做的事情已经远远不止于此,比如:安全防御、协议升级、状态缓存、修改资源、访问控制等等
仅从网络传输的角度看,一个互联网系统的传输速度取决于以下四点因素:
- 用户客户端接入网络运营商的链路所能提供的入口带宽
- 网站服务器接入网络运营商的链路所能提供的出口带宽
- 从网站到用户之间经过的不同运营商之间互联节点的带宽(一般来说两个运营商之间只有固定的若干个点是互通的,所有跨运营商之间的交互都要经过这些点)
- 从网站到用户之间的物理链路传输时延(爱打游戏的同学应该都清楚,延迟(Ping 值)比带宽更重要)
以上四个网络问题,除了第一个只能通过换一个更好的宽带才能解决之外,其余三个都能通过内容分发网络来显著改善。