计算机网络

yuhuo2023-02-23开发知识
参考链接

概念

  • 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

  1. 设备 A 数据【目标MAC = 网关 MAC,目标 IP = B 设备 IP】发给到交换机
  2. 交换机将数据转发到网关上
  3. 网关根据 B 设备 IP 找到其 MAC,将数据改成 【目标MAC = B 设备 MAC,目标 IP = B 设备 IP】发给交换机
  4. 交换机将数据转发到 B 设备上

DHCP 协议

设备连接到子网中后,会向网关发送 DHCP 请求,网关会为其分配一个不会重复的 IP 地址,并通过 DHCP 回复报文发送回去。设备接收到后,将分配的 IP 配置到网卡上。

也选择可以关闭 DHCP,手动配置 IP 地址。

ARP 协议

在一个子网中,设备 A 在发送数据到设备 B 之前,需要先知道设备 B 的 MAC 地址,才能通过交换机发送数据。

设备 A 获取设备 B(192.168.1.10)的 MAC 地址的过程:

  1. 设备 A 通过交换机向子网内的所有设备发送 ARP 广播,询问 192.168.1.10 的 MAC 地址是多少;
  2. 子网内所有设备都能接收到,只有 192.168.1.10 的设备会答复自己的 MAC 地址;
  3. 设备 A 接收并缓存设备 B 的 IP 与 MAC 映射;

家庭路由器 = 网关 + 交换机

家庭中的路由器包含 1 个 WAN 口和多个 LAN 口。WAN 用于连接广域网,LAN 口用于连接局域网中的设备。通过 wifi 连接也相当于连接到 LAN 口。

层级协议数据地址功能
应用层
(应用层、表示层、会话层)
HTTP、SMTP、FTP、DNS报文
传输层TCP、UDP端口号服务进程到服务进程的传输
网络层IPIP 逻辑地址根据 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。采用任播的技术,自动选择最近的节点响应。

Root Servers (iana.org)open in new window

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 DNSIPv6 DNS
阿里云223.5.5.5 / 223.6.6.62400:3200::1 / 2400:3200:baba::1
腾讯119.29.29.29 / 182.254.116.116
百度180.76.76.76
114114.114.114.114 / 114.114.115.115
谷歌8.8.8.8x / 8.8.4.42001:4860:4860::8888 / 2001:4860:4860::8844
OpenDNS208.67.222.222 / 208.67.220.2202620:0:ccc::2 / 2620:0:ccd::2
FreeDNS37.235.1.174 / 37.235.1.177
Cloudfare1.1.1.1 / 1.0.0.12606:4700:4700::1111 / 2606:4700:4700::1001

说明

推荐使用国内的 DNS 服务器(如 阿里云、腾讯、百度、114),延迟基本在 10ms 内,国外的延迟基本在 150ms 以上。可以使用 ping <ip地址> 测试其可用性和延迟。

DNS 解析流程

以 目标域名 www.bilibili.com 为例:

  1. 浏览器查询自身 DNS 缓存,命中则返回,无则向 DNS 客户端查询;

  2. DNS 客户端查询本地 DNS 配置 C:\Windows\System32\drivers\etc\hosts,命中则返回,无则向本地域名服务器查询,并将结果返回给浏览器;

  3. 本地域名服务器查询自身缓存,命中则返回给 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
    
  4. 向根域名服务器查询 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
    # ...
    
  5. 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
    # ...
    
    
  6. 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
    
  7. 本地域名服务器接收权威域名服务器的结果,并返回给 DNS 客户端,最终返回给浏览器;

DNS 记录类型

DNS 记录类型说明
A将域名指向一个IPV4地址
CNAME将域名指向另外一个域名
AAAA将域名指向一个IPV6地址
MX将域名指向邮件服务器地址
SRV记录提供特定的服务的服务器
TXT文本长度限制512,通常做SPF记录(反垃圾邮件)
CAACA证书颁发机构授权校验
显性URL将域名重定向到另外一个地址
隐性URL与显性URL类似,但是会隐藏真实目标地址

IPv4 / IPv6

IP地址是什么东西?IPV6和IPV4有什么区别?公网IP和私有IP又是什么?open in new window

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)open in new window 测试当前网络是否支持 IPv6。

阿里云服务器开启 IPv6:

  1. 配置ECS实例的IPv6地址实现通信open in new window
  2. 打开 域名列表open in new window,点击域名解析,添加一条 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 的情况下试验:

  1. 当只勾选 IPv4:所有网站的 IP 地址都是 IPv4 的格式;
  2. 当只勾选 IPv6:支持 IPv6 的网站和应用能正常访问(如 百度open in new window阿里云open in new window、微信),只支持 IPv4 的则无法访问(如 懂车帝open in new windowCSDNopen in new window、钉钉);
  3. 当 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

直播协议 RTMP

RTSP

实时流协议(Real Time Streaming Protocol)

说明
作用流媒体传输
上层协议TCP 和 UDP
优点低延迟(2s 内)
缺点H5 不支持
应用场景监控,IP摄像机,物联网
Last Updated 2024/5/24 16:41:16