HTTP
Hyper Text Transfer Protocol - 超文本传输协议
应用层协议, 构建在 TCP/IP 协议之上.
- 请求方: User Agent, 如浏览器、爬虫等
- 应答方: 服务器, 如 Apache、Nginx 等
CDN
Content Delivery Network - 内容分发网络
应用了 HTTP 协议中的缓存和代理技术, 通过缓存快速响应客户端的请求.
处于请求方(浏览器)和应答方(服务器)之间.
TCP/IP
IP
Internate Protocol, 网络层, 主要目的是解决寻址和路由问题.
通过 IP 地址定位网络节点.
IP 协议:
- v4: 4 组 8 位地址, 总共
2**32(约42亿)个可分配地址 - v6: 8 组 16 位地址, 共
2**128个可分配地址
TCP
Transmission Control Protocol, 传输控制协议, 传输层.
位于 IP 协议之上, 基于 IP 协议提供可靠的、字节流形式的通信.
传统的互联网: HTTP over TCP/IP
DNS
Domain Name System, 域名系统, 将域名转换成真实 IP.
在 DNS 中, Domain Name/域名 = Host/主机名
核心 DNS, 三层的树状分布式服务:
-
根域名服务器(Root DNS Server), 管理顶级域名服务器, 返回
comnet等顶级域名服务器的 IP 地址;- 全世界共 13 组, 它必须是众所周知的.
- 顶级域名服务器(Top-level DNS Server), 管理各自顶级域名下的权威域名服务器, 如
com顶级域名服务器可以返回[xx.com](http://xx.com)域名服务器的 IP 地址; - 权威域名服务器(Authoritative DNS Server), 管理自己域名下主机的 IP 地址, 如权威域名服务器
[xxx.com](http://xxx.com)可以返回[www.xxx.com](http://www.xxx.com)的 IP 地址.
核心 DNS 系统之外的两个缓存系统:
- 非权威域名服务器: 大公司、网络运营商的 DNS 服务器, 代理用户访问核心 DNS 并缓存, 如 Google 的“8.8.8.8”
-
操作系统缓存
- DNS 缓存
- hosts 文件
URI/URL
IP 地址可以定位到主机, URI/URL 定位主机里的特定资源.
- URI: Uniform Resource Identifier, 统一资源标识符
- URL: Uniform Resource Locator, 统一资源定位符, 俗称的网址
URL 是 URI 的子集, 但二者差异不大, 不用严格区分.
一般的 URI 构成: {协议名}://{主机名}{路径}
HTTPS
HTTP over SSL/TLS , 即运行在 SSL/TLS 之上的 HTTP.
SSL/TLS 是负责加密通信的安全协议, 处于 TCP/IP 之上、HTTP 之下, 也是可靠的传输协议.
HTTPS = HTTP + SSL/TLS + TCP/IP
SSL
Secure Socket Layer, SSL3.0 时改名为 TLS 即 Transport Layer Security, 历史原因习惯称为 SSL/TLS 或 SSL.
SSL 使用了许多密码学成果, 综合了对称加密、非对称加密、摘要研发、数字签名、数字证书等技术, 在不安全的环境中为通信双方创建出一个秘密、安全的传输通道.
Proxy
即代理, 处于 HTTP 的请求方和应答方之间, 可以转发客户端的请求, 也可以转发服务器的应答.
分类:
- 匿名代理: 完全隐匿被代理的及其
- 透明代理: 透明开放
- 正向代理: 靠近客户端, 代表客户端向服务器发送请求
- 反向代理: 靠近服务端, 代表服务器响应客户端
CDN 就是一种代理, 属于透明代理和反向代理.
代理处于中间层的可以做什么?
- 负载均衡(集群化)
- 健康检查(心跳监控服务器)
- 内容缓存
- 安全防护(隐匿 IP、限制 IP 或流量)
- 加密卸载(对外网使用 SSL/TLS 加密, 内网消除加密)
- 数据过滤(修改请求或响应)
网络分层模型
TCP/IP 四层模型
- 应用层: HTTP
- 传输层: TCP/UDP
- 网络层: IP
- 链路层: MAC
OSI 七层模型
- L7: 应用层
- L6: 表示层
- L5: 会话层
- L4: 传输层
- L3: 网络层
- L2: 数据链路层
- L1: 物理层
两种分层模型对比
TCP/IP 是纯软件的栈, 没有最根基的电缆、网卡等物理设备; OSI 在理论层面上描述网络更加详细、完整.
输入网址、按下回车
通过 Wireshark 抓包可验证, 当输入 [localhost](http://localhost) 后:
- 浏览器从地址栏(或 DNS 多级缓存)取得服务器的 IP 地址和端口号
- 浏览器用 TCP 的三次握手与服务器建立连接
- 浏览器向服务器发送 HTTP 请求报文
- 服务器向浏览器发送确认(ACK); 处理完后向浏览器返回 HTTP 响应报文
- 浏览器接收到之后向服务器发送确认(ACK), 并根据 HTTP 响应渲染页面
- 浏览器通过 TCP 四次挥手与服务器断开连接
真实的更复杂的网络:
- 根据上网方式或网络配置的不同, IP 可能是动态或静态的
- DNS 除了层层解析给出服务器 IP 之外, 对于静态资源还可能直接给出 CDN 服务器的 IP
-
目标网站的服务器为了扛住高并发, 内部也极其复杂, 如
- 入口是负载均衡设备, 如四层 LVS、七层 Nginx
- 之后是服务器集群: Memory 级缓存(Redis) → Disk 级缓存(Varnish) → 应用服务器(Tomcat、Nodejs、Django) → 数据库