zoukankan      html  css  js  c++  java
  • 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 层。效率高。

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

    设置默认网关,其实就是在路由表中添加了一个目标网段为 0.0.0.0/0 的路由规则,如果其它的路有规则都匹配不成功,就会使用这条规则。

    端口

    端口是第四层 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 地址计算路由路径,因此必须使用路由器!

    另外路由器还负责处理链路层协议的转换,比如 WiFi 和以太网协议的互转。

    交换机

    交换机目前分为两类:

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

    网桥

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

    软件上的网桥

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

    一机多 ip

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

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

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

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

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

    跟踪数据报的路由链路

    tracepath(linux) (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 地址和子网掩码自动生成一条网段内寻址的路由规则,该路由规则实际上只会在链路层进行寻址,不会上升到第三层。
    如果有设置默认网关,还会生成一条目标网段为 0.0.0.0/0 的路由规则,将其他流量转发给默认网关(路由器)进行处理,路由器会使用 OSPF 等路由协议计算出的路由表,将数据路由到下一跳(next-hop)。

    公用服务器需要配置静态 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 :與路由有關的相關設定;
    

    WAN 口

    路由器的 WAN 口,就相当于普通主机的默认网关,它会自动在路由器自己的路由表中添加一条规则(优先级最低),让无法寻址的所有流量都转发到 WAN 的网关去。

    有些路由器可以设置多个 WAN,这时就需要手动设置静态路由,或者策略路由规则,来对流量进行分流。否则流量永远只会走其中优先级较高的 WAN 口,另一个 WAN 会一直闲置。

    参考

  • 相关阅读:
    Web API 强势入门指南
    毫秒必争,前端网页性能最佳实践
    Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
    Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
    Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
    WCF : 修复 Security settings for this service require Windows Authentication but it is not enabled for the IIS application that hosts this service 问题
    透过WinDBG的视角看String
    Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”
    企业IT管理员IE11升级指南【17】—— F12 开发者工具
    WCF : 如何将NetTcpBinding寄宿在IIS7上
  • 原文地址:https://www.cnblogs.com/kirito-c/p/12116371.html
Copyright © 2011-2022 走看看