Linux 网络笔记(一):基础知识集锦

Linux 网络基础

这里是一些基础的网络知识的总结,不会多么全面,只会覆盖一些比较容易产生疑问的知识点。

需要前置知识点:因特网协议分层与虚拟网络

广播地址

在 TCP/IP 协议中,对任一网段而言,

Interface 网络接口

网络接口有三类:

  1. 物理接口:就是机器上的硬件接口了。
  2. 虚拟接口:在容器大行其道的今天,每台机器上都可能会有大量虚拟接口。因为每个容器都需要一个独立的网络接口来标识自己。
  3. Linux Bridge: Linux 网桥,也被看作是一种网络接口,有自己的 IP。(后面会详细说明)

每个网络接口,都具有一个唯一的 Mac 地址。

此外,一台机器上还可以通过软件实现的网桥(在后面详细说明这个概念),直接桥接物理接口,达到一个物理接口当多个用的效果。
这就相当于扩线器,将一个物理网络接口,通过软件扩成了多个虚拟的“物理接口”。
这种技术多用于虚拟机,VMware 和 VirtualBox 的虚拟机网络接口,都可以设置成“桥接物理网络”。

lo 回环接口

loopback 的缩写,是一个虚拟接口,ip 固定为 127.0.0.1,对应的域名为 localhost,用于在本机内路由数据。

比如我们在本地测试自己的 Web 应用时,就经常通过 http://localhost:8000 来查看效果,或者访问本机的 mysql/redis/elasticsearch 等等。

总之只要是访问本机的应用,就用 localhost 回环地址。这个地址会通过 lo 接口,返回到本机。

网关

主机本身并没有路由寻址的能力,因此对于不在同一网段内的 IP 包,主机会将它发送到一个“默认网关”,由这个网关将数据包路由到正确的主机上。默认网关用于实现跨网段通信。

网段是通过子网掩码来区分的,掩码用于确定网段中哪些 bit 位是固定的部分,或者说确定了子网的可用 IP 段。

每个 IP 数据包被发送出去前,会先将目标 IP 和自己的 IP 分别与掩码进行“与运算”后,判断结果是否相同:

  1. 如果不相同,说明目标主机不在当前网段内。数据包将被转发给默认网关。
  2. 如果结果一致,说明目标主机就在当前网段内,可以直接通过 MAC 地址和目标主机进行通信。
    • 也就是说,同网段内,直接通过数据链路层路由数据,不需要上升到第三层 IP 层。效率高。

另外,即使是在网段内通信,其实也是可以走默认网关的。(修改主机设置中的掩码就能实现,使主机以为自己在一个更小的网段内)
只是这样数据的路由会上升到第三层,而且所有主机都通过默认网关进行数据路由的话,默认网关压力会很大。

端口

端口是第四层 TCP/UDP 的属性,主要用于区分同一主机上的不同程序,将数据包路由给正确的程序。

约定俗成的端口号举例:

  1. ssh: 22
  2. DNS: 53
  3. http/websocket: 80
  4. https/tls/ssl: 443

注:传统的 ping 使用 ICMP 协议,该协议属于第三层,未使用到第四层的 TCP/UDP 协议,因此 ping 不存在端口这个概念。(但是现在也有新的基于 TCP 的 ping 命令了)

路由器

路由器使用第三层的路由表进行数据转发。它会修改第二层的帧信息,将源 MAC 地址改成自己的 MAC 地址。

它本身会有一个及以上的 IP 地址,这个 IP 需要被设为各局域网内主机的默认网关(网关的功能前面讲了)。

要跨不同的网络(局域网的不同网段、局域网和广域网)进行通信,就必须使用第三层网络层的 IP 地址计算路由路径,因此必须使用路由器!

另外路由器还负责处理不同的类型的网络数据之间的转换。

交换机

交换机目前分为两类:

  1. 二层交换机:即数据链路层的交换机,它只使用第二层的 MAC 地址进行数据转发。
  2. 三层交换机:主要仍然是工作在第二层。但是利用了第三层的信息来加速不同网络(比如局域网的不同网段)之间的数据交换。
    • 对大多数的数据,它都在第二层直接处理
    • 只有对第一次处理的跨网段的数据,会上升到第三层。

网桥

硬件上的“网桥”是一个过时的概念,已经被交换机所替代。

软件上的网桥

  1. 虚拟机网桥:和硬件中的“网桥”是一样的,本身只充当“扩线器”的功能(比扩线器多个 MAC 地址过滤),在第二层数据链路层进行数据转发。
  2. Linux 网桥:其实它就相当于一个软件交换机。不过有点特殊的是——它有自身的 IP 地址!

一机多 ip

是的,一台物理机是可以有多个 IP 的,甚至一根网线也能支持多个 IP。IP 和网线不是一对一的关系!

典型的例子就是虚拟机软件,一台机器上可以装多个虚拟机,将虚拟机的网络模式设为 桥接模式:直连物理网络,就可以给它分配当前物理局域网的真实 IP。
这是因为桥接,相当于在把物理接口虚拟成了一个交换机,每台虚拟机连接了这个交换机上的一个物理端口。

Ping 程序使用什么协议?工作在第几层?

Ping 程序使用 ICMP 协议(因特网控制消息协议)。ICMP 数据包会被封装在 IP 协议包中进行传输,用于交换网络层一些错误报文或者控制信息。
虽然它运行在 IP 协议之上,但是因为它的用途是交换网络层自己的一些信息,它被划分在第三层网络层。

第三层网络层主要的协议有三类:IP 协议、因特网路由选择协议(RIP/OSPF/BGP)和 ICMP 协议。

跟踪数据报的路由链路

traceroute (Windows 用 tracert)也是使用 ICMP 数据报进行路由诊断的。
它利用了 IP 协议中的错误报告机制,来得到路径上各主机/路由器的信息。因为是使用了 IP 协议中的超时报错机制,这个命令会运行得比较慢。

通常使用该命令检查局域网的路由规则,示例如下:

  1. 示例中我是使用 PPTP 连接的一台群晖服务器的 VPN,VPN 的网段是 10.0.0.0/16,因此数据包首先被发送到这台群晖服务器。
  2. 然后因为是跨网段通信,数据包被转发到默认网关(路由器)192.168.1.1
  3. 网关再将数据发送到目的地 192.168.1.153

当然也可以用来检测公网的路由路径,不再赘述。

还可以使用 pathping <address> 来诊断多段路由中,各路由段的延迟时间,截图如下

DHCP 协议有什么用?它工作在第几层?

DHCP,即 Dynamic Host COnfguration Protocol,动态主机配置协议。可以为自动为主机分配一个可用的 IP 地址,同时告知主机子网掩码、默认网关IP、默认DNS服务器。

公用服务器需要配置静态 IP,使大家都能通过固定的 IP 访问它。而其他的个人主机(手机电脑游戏机可穿戴设备等等)基本都会使用 DHCP 协议自动获取 IP 和其他必要信息。

局域网的 DHCP 功能通常由路由器提供,因为路由器知道各网段的可用 IP 段、子网掩码、默认网关、默认 DNS 服务器。(很多路由器会自己提供自己的 DNS 递归解析器,当然也可以修改。)

DHCP 协议工作在网络层,流程如下:

  1. discover: 新入网的主机,通过 UDP 协议发送一个 DHCP 发现报文,目标端口为 67。外层 IP 报文使用 src: 0.0.0.0,dest: 255.255.255.255(广播地址,表示将报文发送给所有主机)
  2. offer: DHCP 服务器,收到请求后,同样通过广播地址 255.255.255.255 回复一个响应报文。该报文带有一个可用的 IP 地址,还会附上一个租期。(告诉主机这个 IP 可以用,你要不要用?)
  3. request: 主机可能会收到多个 DHCP 服务器的应答,它会从中选择一个,带上该 IP 地址和 DHCP 服务器的 ID,再次广播一个 DHCP 请求。
  4. ack: 目标 DHCP 服务器返回 ACK 响应。主机收到后,就知道自己可以使用这个 IP 进行通信了。
  5. 租期结束后,主机会重复第三、第四步刷新租期。

设置租期,是为了回收 IP。公共场所的设备流动很快,如果 IP 分配出去就不回收,很快 IP 就不够用了。

DHCP 的租约设置为多长比较合适?

参见 What is a good DHCP lease timeout configuration?
算是众说纷纭,不过比较明确的观点是租期不适合设得过短,因为有些设备/程序在工作状态刷新租期,可能会导致问题。(比如突然断一下网?)

EdgeRoute-X 的默认租期是 86400s,也就是 24h.

我们希望设短租期的原因,是为了在修改 DHCP 信息如 DNS 服务器、默认网关之类的信息时,能更及时地通知到所有服务器。(因为没有能强制更新所有主机租约的方法)

DHCP 一般会在 1/2 租期的时候尝试更新租约,我想了下,可能设 1h 应该是比较合适的值。如果出现问题就改成默认的 86400(一天)。

修改了 DHCP 服务器的设置后,如何强制所有主机更新租约?

目前的 DHCP 服务器没有任何手段可以干这个事!参见 How to force ALL of the DHCP Clients to renew?

只能够通过在客户端执行更新租约的命令以实现强制更新。。(或者重启网络服务、网卡驱动)

# windows
ipconfig /renew

# linux,先释放旧租约,再建立新租约
sudo dhclient -r eth0 && sudo dhclient eth0
# 查看租期
cat /var/lib/dhcp/dhcpd.leases

ip 指令的使用

ip 是 Linux 的网络综合参数查询与修改指令,是一个“大一统”的指令。

指令说明如下:

[root@www ~]# ip [option] [動作] [指令]
選項與參數:
option :設定的參數,主要有:
    -s :顯示出該裝置的統計數據(statistics),例如總接受封包數等;
動作:亦即是可以針對哪些網路參數進行動作,包括有:
    link  :關於裝置 (device) 的相關設定,包括 MTU, MAC 位址等等;对应第二层数据链路层
    addr/address :關於額外的 IP 協定,例如多 IP 的達成等等;对应第三层网络层
    route :與路由有關的相關設定;

参考

posted @ 2020-02-06 12:47  於清樂  阅读(...)  评论(...编辑  收藏