# 简介

# 网络协议

  • 网络协议泛指计算机之间进行通信时需要遵守的规则。
  • 网络协议有很多种,用途也不同。例如:网络层的 ARP 协议常用于主机寻址,应用层的 HTTP 协议常用于 Web 服务。

# 服务器

:指网络中的某些主机,可以为其它主机提供某种服务。

  • 服务器通常要保持运行,以持续提供服务。
  • 不同用途的服务器通常采用不同的通信协议,比如采用 FTP 协议时,称为 FTP 服务器。

服务器常见的几种工作模式:

  • 客户端/服务器模式(Client/Server ,C/S)

    • 运行一个或多个主机作为服务器,再运行一个或多个主机作为客户端。
    • 客户端连接到服务器之后,便可以享受其提供的服务、功能。
  • 浏览器/服务器模式(Browser/Server ,B/S)

    • 属于 C/S 模式。使用特制的浏览器软件作为客户端,例如 Web 浏览器。
  • 点对点(Peer to Peer ,P2P)

    • 两个主机之间通信时身份对等,有相同的能力,而不区分服务器、客户端。
    • 大量 P2P 主机可组成 P2P 网络。与 C/S 网络相比,没有主机专门担任服务器,去中心化。
    • 线上到线下(Online to Offline ,O2O)的名字与 P2P 相似,但概念不同。

# ARP

:地址解析协议(Address Resolution Protocol),用于根据主机的 IP 地址查询到主机的 MAC 地址,常用于局域网的主机寻址。

  • 属于网络层协议。

  • 假设主机 A 的 IP 为 10.0.0.1 ,想发送以太网帧给 IP 为 10.0.0.2 的主机 B ,则需要查询主机 B 的 Mac 地址,流程如下:

    1. 主机 A 在子网内广播一个 ARP request 包,询问 10.0.0.2 对应的 Mac 地址是什么。
    • 该 ARP 包中记录了主机 A 这个发送方的 IP 地址、Mac 地址。
    • 该 ARP 包封装在以太网帧里,帧头中的目标 Mac 地址填的是 0xffffffff ,表示广播给子网内的所有主机。
    1. 主机 B 收到 ARP request 包,发现询问的 IP 10.0.0.2 是自己网卡绑定的 IP ,于是回复一个 ARP response 包,说明 10.0.0.2 对应的 Mac 地址是什么。
    • 该 ARP 包封装在以太网帧里,帧头中的目标 Mac 地址填的是主机 A 的 Mac 地址。
    • 如果主机 A 一直未收到 ARP response 包,可能是因为当前子网的其它主机未使用该 IP 。
    1. 然后,主机 A 与主机 B 知道了双方的 Mac 地址,便可相互发送以太网帧进行通信。
  • 每个主机启动时,会建立一个 ARP 缓存表,记录当前子网内一些 IP 地址及其对应的 Mac 地址。

    • 发送以太网帧给一个 IP 地址时,如果该 IP 已有 ARP 缓存,则使用缓存的 Mac 地址,不必广播 ARP request 包。
    • Linux 系统默认将每条 ARP 记录缓存几十秒就删除。
    • 用户可添加静态 ARP 记录,将某个 IP 固定解析到某个 Mac 地址。主机重启时,所有 ARP 缓存都会删除。
  • 相关协议:

    • Reverse ARP
      • :反向地址解析协议。局域网的一些主机可能尚未分配 IP ,可发送 RARP 请求到 RARP 服务器,根据当前主机的 MAC 地址,申请分配一个 IP 地址。
      • 该协议已被 DHCP 协议取代。
    • Proxy ARP
      • :允许一个主机代替其它主机回复 ARP response 包。常用于路由器、NAT 网关。
      • 假设主机 A 发出 ARP request 包,询问主机 B 的 Mac 地址。主机 C 收到 ARP request 包时,回复 ARP response 包,填入主机 C 的 Mac 地址,使得主机 A 将以太网帧发送到主机 C ,然后主机 C 再转发给主机 B 。
    • Gratuitous ARP
      • :允许一个主机在局域网内广播,说明自己的 IP 地址、Mac 地址是什么。
      • 假设主机 B 的 IP 地址或 Mac 地址变化了,
        • 只使用 ARP 协议时,其它主机不会立即知道,要等 ARP 缓存过期,才会重新查询主机 B 的 Mac 地址。
        • 使用 GARP 协议,主机 B 可以主动广播自己的变化,立即影响其它主机。
  • 如果局域网一台主机被入侵,则可能对其它主机进行 ARP 攻击:

    • ARP DOS 攻击:攻击者发送大量 ARP 包,对目标主机造成严重负载,比如使得 ARP 缓存表过大、网络通信过多。
    • ARP 欺骗攻击:攻击者回复 ARP response 包,将一些 IP 解析到攻击者的 Mac 地址,从而接收发向这些 IP 的数据包,进行窃听、篡改。

# ICMP

:因特网控制报文协议(Internet Control Messages Protocol),用于测试网络是否连通、网络延迟。

  • 属于网络层协议,是 IP 协议的一部分,基于 IP 协议寻址。
  • 原理:
    • 向目标主机发送一个 ICMP 报文,根据收到回复的时间间隔就可以知道通信延迟。
      • ICMP 报文的头部中,用 1 个字节记录该报文剩下的生存时间(Time To Live ,TTL)。
      • ICMP 报文每经过一跳路由器,TTL 的值就会被减一,当 TTL 为零时路由器就会丢弃该报文。
    • 如果没收到回复,则原因可能是:
      • 网络不连通
      • 目标主机不允许 ICMP 通信

# DHCP

:动态主机配置协议,用于给一些主机动态分配 IP 地址,广泛应用于企业单位的局域网中。

  • 属于应用层协议,基于 UDP 通信。

  • IP 地址的分配方法分为静态和动态两种。手动配置主机的 IP 就属于静态分配。

  • 客户端使用 DHCP 服务的过程分为以下四步:(此时客户端与服务器通过 UDP 协议通信,一般使用受限广播报文)

    1. Request :客户端广播 discover 报文。
    2. Reply :服务器收到 discover 报文后会广播 offer 报文,包括准备分配的 IP 地址、默认网关等信息。
    3. Request :客户端收到 offer 报文后就广播 request 报文,表示请求使用这个 IP 地址。
    4. Reply :服务器收到 request 报文后就广播 ack 报文即确认报文,将 IP 地址分配给客户端。
  • DHCP 服务器的主要配置内容:

    • 作用域:指 DHCP 服务器所管理的 IP 地址的范围,通常为一个连续网段。
    • 排除范围:指作用域内一些不被 DHCP 服务器分配的 IP 地址。
    • 地址池:作用域内排除掉不分配的 IP 地址,剩下的就是地址池。
    • 租约:客户端只能租用 IP 地址一段时间。
  • 如果主机请求 DHCP 服务超时,则可以为自己分配 169.254.0.0/16 子网下的一个随机 IP 。

    • 这称为链接本地地址(Link-Local Address),是一种 B 类私有地址,只能在内网使用。
    • 主机给自己分配 IP 时,需要通过 ARP 协议检查该 IP 在当前内网是否已被使用。
    • 如果一个内网没有 DHCP 服务器,则可以让每个主机使用 Link-Local Address 地址相互通信。

# NAT

:网络地址转换(Network Address Translation)。用于在两个网络之间通信时,将来自前一个网络的 IP 转换成后一个网络的有效 IP 。

  • 常见用途:
    • DNAT(Destination NAT):当 NAT 网关收到公网发来的 IP 包时,将 IP 包中的目的 IP 从公网 IP 转换成私网 IP ,然后转发给对应的私网主机。
    • SNAT(Source NAT):当 NAT 网关收到私网主机向公网发送的 IP 包时,将 IP 包中的源 IP 地址从私网 IP 转换成公网 IP ,然后转发到公网。
  • NAT 网关一般是一台服务器,工作在网络层(与 proxy 不同)。
    • NAT 网关内至少有两张网卡,分别连接私网和公网。
    • NAT 网关一般给私网内的主机分配 10.0.0.0、172.16.0.0、192.168.0.0 三种范围的私有网络地址,并保存一些可用的公网 IP 地址。
    • NAT 网关上维护了一张 NAT 表,记录了每个私网 IP 与公网 IP 的转换关系。如果经过 NAT 网关的 IP 包中的 IP 地址不在 NAT 表中,就丢弃该报文。
  • NAT 网关的分类:
    • 静态 NAT(Static NAT):NAT 表事先写好,不再变化。这样可以直接实现 DNAT 。
    • 动态地址 NAT(Pooled NAT):NAT 表可以动态变化。这样不能实现 DNAT 。
    • 端口多路复用(Port Address Translation ,PAT):所有私网主机共用一个外网 IP ,只是连接到 NAT 网关的不同端口上。NAT 网关与公网通信时,使用的不同端口号代表了不同的私网主机,转换 IP 包中的 IP 地址和端口号。