计算机网络
概念
- DNS
- IPV6 / IPV4
- IOS网络模型
- TCP协议(三次握手四次挥手)
- 以太网
- WLAN、WAN、LAN
- 网关
- 子网掩码
- 适配器
- DHCP
- Nat
- CDN
- Comet(服务器推)
- RESTful
OSI 网络模型
开放系统互连(Open System Interconnect)
物理层
光、电、电磁波传输比特数据(0 / 1)
数据链路层
MAC 地址
物理地址,全球唯一,绑定网卡。MAC 地址由 6 个字节构成,通常使用 12 个十六进制表示,如 00:1A:2B:3C:4D:5E
。
交换机
连接多台网络设备,记录设备 Mac 地址与交换机端口的映射表,实现为两台设备传输数据。
假设源设备 A 发送到帧数据到交换机,交换机解析帧数据后得到目标设备B 的 Mac 地址,根据映射表找到设备 B 对应的端口,将数据从该端口发到设备 B。
因为处于数据链路层在网络模型中是第二层,又称二层交换机。
网络层
子网
将 IP 与子网掩码相与,得到子网的网段。比如 IP 192.168.1.10
与子网掩码 255.255.255.0
相与得到 192.168.1.0
。当不同的 IP 属于同一个网段时,即为同一个子网中。
由于子网掩码都是使用连续的 1 开头,后面是连续的 0,我们使用 1 的数量表示子网掩码,比如 255.255.255.0
表示为 24。通过 IP/子网掩码 表示一个网络,如 192.168.1.10/24
。
通过子网掩码可以了解当前子网中有多少个 IP。比如 255.255.255.0
表示子网中有 255 个 IP。子网掩码越大 IP 数量越少。
网关
子网中设备连接其他子网的出口。
网关与其他网络设备一样连接到交换机。网关中维护当前子网中所有设备的 IP 与 其 MAC 地址映射表,并且每个网络设备也记录当前网关的 MAC 地址。
在一个子网中,A 设备发送数据到 B 设备的过程:TODO
- 设备 A 数据【目标MAC = 网关 MAC,目标 IP = B 设备 IP】发给到交换机
- 交换机将数据转发到网关上
- 网关根据 B 设备 IP 找到其 MAC,将数据改成 【目标MAC = B 设备 MAC,目标 IP = B 设备 IP】发给交换机
- 交换机将数据转发到 B 设备上
DHCP 协议
设备连接到子网中后,会向网关发送 DHCP 请求,网关会为其分配一个不会重复的 IP 地址,并通过 DHCP 回复报文发送回去。设备接收到后,将分配的 IP 配置到网卡上。
也选择可以关闭 DHCP,手动配置 IP 地址。
ARP 协议
在一个子网中,设备 A 在发送数据到设备 B 之前,需要先知道设备 B 的 MAC 地址,才能通过交换机发送数据。
设备 A 获取设备 B(192.168.1.10)的 MAC 地址的过程:
- 设备 A 通过交换机向子网内的所有设备发送 ARP 广播,询问 192.168.1.10 的 MAC 地址是多少;
- 子网内所有设备都能接收到,只有 192.168.1.10 的设备会答复自己的 MAC 地址;
- 设备 A 接收并缓存设备 B 的 IP 与 MAC 映射;
家庭路由器 = 网关 + 交换机
家庭中的路由器包含 1 个 WAN 口和多个 LAN 口。WAN 用于连接广域网,LAN 口用于连接局域网中的设备。通过 wifi 连接也相当于连接到 LAN 口。
层级 | 协议 | 数据 | 地址 | 功能 |
---|---|---|---|---|
应用层 (应用层、表示层、会话层) | HTTP、SMTP、FTP、DNS | 报文 | ||
传输层 | TCP、UDP | 段 | 端口号 | 服务进程到服务进程的传输 |
网络层 | IP | 包 | IP 逻辑地址 | 根据 IP 地址在路由中转发,实现端对端 |
数据链路层 | 帧 | MAC 物理地址 (全球唯一,绑定网卡) | 交换机通过 Mac 地址和交换机端口的映射表,实现为两台设备转发帧数据 | |
物理层 | 比特 | 光、电、电磁波传输比特数据(0 / 1) |
DNS
域名系统(Domain Name System)
域名
域名用来代替 IP 地址方便人们熟记。以 www.example.com
为例,example.com
表示主域名,com
表示顶级域名,www
表示主机名或子域名。不同主机名表示提供不同服务,比如:
www.example.com
:主站点main.example.com
:邮箱业务m.example.com
:移动端业务ab.cd.example.com
:多级域名
DNS 服务器
域名服务器,负责将域名解析为 IP 地址,包含:
- 根域名服务器(Root)
- 顶级域名服务器(Top-Level Domain、TLD)
- 权威域名服务器(Authoritative)
- 本地域名服务器(Local)
根域名服务器
根域名服务器负责查询目标的顶级域名(如 .com
)对应的顶级域名服务器的 IP 地址。
IPv4 的根域名服务器一共有 13 个域名(a~m),分为 1 台主根域名服务器和 12 台辅根域名服务器。其中 1 台主根和 9 辅根在美国,剩下 3 台辅根分别在英国、瑞典、日本。
虽说是 13 台,但是其实是上千个节点分布在各地,相当于 1 个 IP 对应多个节点,或者说多个节点使用同一 IP。采用任播的技术,自动选择最近的节点响应。
IPv6 根域名服务器目前全球共架设了 25 台,其中中国部署了 4 台,分别是 1 台主根位于北京,3 台辅根分别位于广州、上海,成都。
顶级域名服务器
根域名服务器负责查询目标域名(如 example.com
)对应的权威域名服务器的 IP 地址。
常见的顶级域名有:
.com
:商业相关.cn
:中国相关.net
:网络和技术相关.org
:非营利组织相关.edu
:教育相关.gov
:政府相关.mil
:军事相关.info
:信息和资源相关.club
:俱乐部相关.aero
:航空运输相关.online
:在线相关
权威域名服务器
权威域名服务器负责查询目标域名(如 example.com
)对应的 IP 地址。
本地域名服务器
本地域名服务器负责向根域名、顶级域名、权威域名咨询,最终获得目标域名的 IP 地址,返回给用户主机的 DNS 客户端。
打开【控制面板】-【网络和 Internet】-【网络和共享中心】-【WLAN】,点击【属性】打开【WLAN 属性弹窗】 ,选择 IPv4 或 IPv6,点击【属性】,设置对应的 DNS 服务器地址。
选择自动获得,DNS 服务器地址将由路由器返回。此时取决于路由器的网络设置,自动或手动。如果也是选择自动获得,那路由器将直接返回自身地址作为 DNS 服务器地址。此时路由器实际上充当了 DNS 转发器(DNS 代理、DNS 中继)的功能,转发到运营商分配的 DNS 服务器。
也可以选择手动设置,常见的公共 DNS 服务器如下:
服务商 | IPv4 DNS | IPv6 DNS |
---|---|---|
阿里云 | 223.5.5.5 / 223.6.6.6 | 2400:3200::1 / 2400:3200:baba::1 |
腾讯 | 119.29.29.29 / 182.254.116.116 | |
百度 | 180.76.76.76 | |
114 | 114.114.114.114 / 114.114.115.115 | |
谷歌 | 8.8.8.8x / 8.8.4.4 | 2001:4860:4860::8888 / 2001:4860:4860::8844 |
OpenDNS | 208.67.222.222 / 208.67.220.220 | 2620:0:ccc::2 / 2620:0:ccd::2 |
FreeDNS | 37.235.1.174 / 37.235.1.177 | |
Cloudfare | 1.1.1.1 / 1.0.0.1 | 2606:4700:4700::1111 / 2606:4700:4700::1001 |
说明
推荐使用国内的 DNS 服务器(如 阿里云、腾讯、百度、114),延迟基本在 10ms 内,国外的延迟基本在 150ms 以上。可以使用 ping <ip地址>
测试其可用性和延迟。
DNS 解析流程
以 目标域名 www.bilibili.com
为例:
浏览器查询自身 DNS 缓存,命中则返回,无则向 DNS 客户端查询;
DNS 客户端查询本地 DNS 配置
C:\Windows\System32\drivers\etc\hosts
,命中则返回,无则向本地域名服务器查询,并将结果返回给浏览器;本地域名服务器查询自身缓存,命中则返回给 DNS 客户端,无则向根域名服务器查询;
# ** 模拟本地域名服务器的操作 ** nslookup # -- output --(默认自动连接上设置的本地 DNS 服务器,并且优先使用 IPv6) # 默认服务器: public1.alidns.com # Address: 2400:3200::1 # 查询目标域名的 IP www.bilibili.com # -- output --(非权威应答表示来自缓存) # 非权威应答: # 名称: a.w.bilicdn1.com # Addresses: 240e:97d:2000:c0e::32 # 240e:97d:2000:c0e::33 # 14.17.92.71 # 59.36.228.21 # ... # Aliases: www.bilibili.com # 假设没有缓存 # 将查询类型改为 nameserver,即查看域名所在的域名服务器 set type=ns # 查询根域名 . # -- output --(省略了c~m) # 非权威应答: # (root) nameserver = a.root-servers.net # (root) nameserver = b.root-servers.net # ... # 将查询类型改为 a+aaaa,即查询域名的 IP 地址 # a 表示 IPv4,aaaa 表示 IPv6,a+aaaa 是 type 的默认值,也可以单独设成 a 或 aaaa set type=a+aaaa # 选择一个根域名查看其 IP b.root-servers.net # -- output -- # 非权威应答: # 名称: b.root-servers.net # Addresses: 2801:1b8:10::b # 170.247.170.2
向根域名服务器查询
com
顶级域名服务器 IP;# ** 模拟根域名服务器的操作 ** nslookup # 连接根域名器 server 170.247.170.2 # -- output -- # 默认服务器: b.root-servers.net # Address: 170.247.170.2 set type=ns # 查询 com 的顶级域名服务器 com. # -- output --(省略了c~m) # com nameserver = a.gtld-servers.net # com nameserver = b.gtld-servers.net # a.gtld-servers.net internet address = 192.5.6.30 # b.gtld-servers.net internet address = 192.33.14.30 # ...
向
com
顶级域名服务器查询bilibili.com
所在的权威域名服务器 IP;# ** 模拟顶级域名服务器的操作 ** nslookup # 连接顶级域名服务器 server 192.5.6.30 # -- output -- # 默认服务器: a.gtld-servers.net # Address: 192.5.6.30 set type=ns # 查询 bilibili.com 所在的权威域名服务器 bilibili.com. # -- output -- # 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 # ns4.dnsv5.com internet address = 1.12.0.16 # ns4.dnsv5.com internet address = 1.12.0.19 # ...
向
ns3.dnsv5.com
权威域名服务器查询www.bilibili.com
的 IP;# ** 模拟权威域名服务器的操作 ** nslookup # 连接顶级域名服务器 server 1.12.0.17 # -- output -- # 默认服务器: [1.12.0.17] # Address: 1.12.0.17 # 查询 www.bilibili.com 的 IP,没查到 www.bilibili.com # 查询类型改为 name server 再查 set type=ns www.bilibili.com # -- output --(可以看到指向了另外一个域名) # www.bilibili.com canonical name = a.w.bilicdn1.com # bilibili.com nameserver = ns3.dnsv5.com # bilibili.com nameserver = ns4.dnsv5.com # 查询 a.w.bilicdn1.com 的 IP set type=a+aaaa a.w.bilicdn1.com # -- output -- # 名称: a.w.bilicdn1.com # Addresses: 240e:97d:2000:c0e::32 # 240e:97d:2000:c0e::33 # 14.17.92.71 # 59.36.228.21
本地域名服务器接收权威域名服务器的结果,并返回给 DNS 客户端,最终返回给浏览器;
DNS 记录类型
DNS 记录类型 | 说明 |
---|---|
A | 将域名指向一个IPV4地址 |
CNAME | 将域名指向另外一个域名 |
AAAA | 将域名指向一个IPV6地址 |
MX | 将域名指向邮件服务器地址 |
SRV | 记录提供特定的服务的服务器 |
TXT | 文本长度限制512,通常做SPF记录(反垃圾邮件) |
CAA | CA证书颁发机构授权校验 |
显性URL | 将域名重定向到另外一个地址 |
隐性URL | 与显性URL类似,但是会隐藏真实目标地址 |
IPv4 / IPv6
IP地址是什么东西?IPV6和IPV4有什么区别?公网IP和私有IP又是什么?
IPv4
互联网协议第4 版,采用 32 位记录 IP 地址,即提供 232 个 IP 地址。拆成 4 组,每组 8 位,以 .
分隔,表示成:28 . 28. 28 . 28。
再将 28 以十进制记录,其范围包含:0.0.0.0 ~ 255.255.255.255。
IPv6
互联网协议第6 版,采用 128 位记录 IP 地址,即提供 2128 个 IP 地址。拆分为 8 组,每组由 4 个 4 位组成,以 :
分隔,即:
24242424 : 24242424 : 24242424 : 24242424 : 24242424 : 24242424 : 24242424 : 24242424
将 24 以十六进制记录,其范围包含:0:0:0:0:0:0:0:0 ~ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff。
砍
0800:0000:
缩写为800:0:
,4位数中开头的 0 可以省略;1:0:0:2:0:0:3
缩写为1::2:0:0:3
,连续的多段 0 可以省略为双冒号::
,有多处时只能省略第一处,即不能省略成1::2::3
;
IPv6 是下一代的互联网协议,用于彻底解决 IPv4 中 IP 地址不足的问题,并且拥有更好的性能和安全性。虽然目前 IPv6 普及率依然不高,但是是未来的大趋势。
目前大部分设备都支持 IPv6,能否使用 IPv6 取决于网络运营商。如果是家用宽度,可以在光猫和路由器的设置页面上看是否有开启 IPv6 的配置。可以通过 IPv6 测试 (test-ipv6.com) 测试当前网络是否支持 IPv6。
阿里云服务器开启 IPv6:
- 配置ECS实例的IPv6地址实现通信;
- 打开 域名列表,点击域名解析,添加一条 AAAA 类型的记录,指向 IPv6 地址;
双协议栈
IPv4 与 IPv6 不互通,即使用 IPv4 的设备与使用 IPv6 的设备无法相互通信。我们目前正处于 IPv4 向 IPv6 的过渡阶段,解决的方案有以下三种:
- 双协议栈:一台设备同时启用 IPv4 与 IPv6 两种协议,源节点根据目的节点选择不同的协议;
- 隧道技术:使用 IPv4 传输 IPv6 报文,实现通过 IPv4 网络连接 2 台 IPv6 设备;
- NAT64:IPv4 和 IPv6 相互转换的技术,实现 IPv4 与 IPv6 的设备互相通信;
我们主要试验双协议栈,另外两种不去深入。
打开【控制面板】-【网络和 Internet】-【网络和共享中心】,点击【WLAN】打开【WLAN 状态弹窗】 查看当前 IPv4 与 IPv6 的连接状态。
点击【属性】打开【WLAN 属性弹窗】 ,可以选择是否开启(勾选) IPv4 / IPv6 ,并设置其属性。
在当前网络支持 IPv6 的情况下试验:
- 当只勾选 IPv4:所有网站的 IP 地址都是 IPv4 的格式;
- 当只勾选 IPv6:支持 IPv6 的网站和应用能正常访问(如 百度、阿里云、微信),只支持 IPv4 的则无法访问(如 懂车帝、CSDN、钉钉);
- 当 IPv4 和 IPv6 都勾选:支持 IPv6 的网站依然是以 IPv6 访问;
试验
当只开启 IPv6 时,遇到所有网站和应用都不能访问(包括支持 IPv6 的),可能是 DNS 的问题。
在 IPv6 的属性设置中,默认是自动获得 DNS 服务器地址,但是网关并没有返回 IPv6 的 DNS 服务器地址。手动设为阿里云的 IPv6 DSN 服务器地址即可。
试验
按 RFC 规定,双栈主机访问 DNS 的时候,优先使用 IPv6 访问 IPv6 的 DNS 服务器,且 IPv6 的 DNS 服务器响应中必须包括 AAAA 地址(即域名和 IPv6 地址的对应关系)。如果没有 AAAA 地址,则再使用 IPv4 请求 IPv4 的 DNS 服务器。
对于双栈主机,IPv4 的 DNS 请求会发送两个 DNS 查询报文,一个是 AAAA 查询请求,一个是 A 查询请求。如果ipv4 的 DNS 服务器返回了 AAAA 查询响应,则优先使用 IPv6 地址访问服务器,如果没有 AAAA 查询响应,有 A 查询响应,则选择使用 IPv4 地址访问服务器。
简而言之:双栈主机对同时绑定了 IPv4 和 IPv6 的域名,优先访问 IPv6 地址。
网络协议
TCP
传输控制协议(Transmission Control Protocol)
特点:
- 重量级
- 面向连接的
- 提供可靠的服务
- 支持重传机制
- 数据包按序到达接收器
- 不支持广播
- 以字节流传输数据
建立连接:三次握手
断开连接:四次挥手
UDP
用户数据报协议(User Datagram Protocol)
特点:
- 轻量级
- 无连接的
- 不提供可靠的服务
- 不支持重传机制
- 数据包无序到达接收器
- 支持广播
- 以为用户数据报传输数据
HTTP
超文本传输协议(Hyper Text Transfer Protocol)
说明 | |
---|---|
作用 | 传输文字,图片,音频,视频等超文本数据 |
上层协议 | TCP |
默认端口 | 80(http),443(https) |
SSL
SSH
FTP
文件传输协议(File Transfer Protocol)
说明 | |
---|---|
作用 | 传输文件 |
上层协议 | TCP |
默认端口 | 20,21 |
WebSocket
单个TCP连接上进行全双工通信的协议
说明 | |
---|---|
作用 | 客户端和服务器双向通信 |
上层协议 | TCP |
默认端口 | 80(http),443(https) |
应用场景 |
WebRTC
网页实时通信(Web Real-Time Communication)
说明 | |
---|---|
作用 | 点对点(P2P)的流媒体传输 |
上层协议 | |
优点 | 低延迟(300ms 内) |
缺点 | |
应用场景 | 语音通话,视频会议 |
RTMP
RTSP
实时流协议(Real Time Streaming Protocol)
说明 | |
---|---|
作用 | 流媒体传输 |
上层协议 | TCP 和 UDP |
优点 | 低延迟(2s 内) |
缺点 | H5 不支持 |
应用场景 | 监控,IP摄像机,物联网 |