服务器架设篇 - RockyLinux 9

第四章、网络基础学习

网络基础真的很重要!但是,数据太多,好杂啊!慢慢看底下的数据,真的是挺重要的!

最近更新时间: 2023/08/09

网络基础原本就是很难理解的东西!而且数据还异常的多!包括 OSI 七层协定、TCP/IP、IPv4 表头数据、IPv6 地址理解、 路由概念、TCP 与 UDP 的端口口意义等!光是解释这些东西,脑袋就炸裂了...不过不要紧,这一小节你随时都可以回来慢慢参考, 最重要的是 4.5 小节,将网卡卡号、IP地址、端口口号码、端口口启动等,链接到地理位置、门牌号码、服务窗口、服务人员等概念, 并且懂得上网需要 IP/Netmask, Gateway, DNS 等参数,这样就很棒了!

4.1、网络相关术语简介

现在的人们都离不开网络,尤其是智能型手机热门应用之后,年轻的世代更是一出生就跟着网络活动了! 但是,我们不要只是『会用』而已啊,信息人员还是得要了解这些网络底层的物理连接方式,以及网络软件相关概念, 这样未来如果网络出问题,或者是想要从事网络信息行业,才不会因为一些小细节没注意到,就导致网络连接的崩溃啊! 所以,底下我们先来介绍一下在局域网路里面常见的链接方式与相关硬件,然后介绍一下网络架构 (OSI 七层堆栈的概念), 以及目前应用的 TCP/IP 协定!了解一下就很棒了!不用深入研究更内部的理论啦!

4.1.1、网络组成组件

一般来说,在企业内部或者是学校计中单位的电脑教室内,我们通过一个交换器 (switch) 为中心, 以实体网络线将所有设备接在一起。有时候还会额外提供一台无线访问点 (Access Point, AP), 提供智能型手机或笔记本电脑连接。然后这个交换器会链接到具有两个网络界面以上的路由器或 Linux 防火墙, 再通过电信业者 (Internet Service Provider, ISP) 的协助,连接到互联网上。相关的连接图标有点像底下这样:

网络连接示意图
图 4.1.1-1、局域网路内电脑与网络设备连接示意图

上述的连接网络,目前主流都是使用以太网路 (Ehternet) 技术。以太网路最初是由全录公司 (Xerox PARC) 所建构出来的,而后通过 DEC, Intel 与 Xerox 合作将以太网路标准化。再经由 IEEE (Institute of Electrical and Electronic Engineers) 这个国际著名的专业组织利用一个 802 的项目制定出标准,之后有 19 家公司宣布支持 IEEE 所发布的 802.3 标准,并且到了 1989 年国际标准组织 ISO (International Organization for Standard) 将以太网路编入 IS88023 标准。 后来大家都可以通过这个标准界面来开发自己的硬件啰!

老实说,现在很多非信息背景的家庭,都不用笔电了,当然也没有桌机~靠手机的 4G/5G 以及未来的 6G 网络, 就完成一切的作业活动。所以,上述的环境,未来渐渐的只会出现在企业办公环境或学校教学环境中。另外, 要不是从 2020 年以来受新冠肺炎的影响,某几个学期远距教学成为常态,这才造成笔电再次流行。 否则,上面的连接,大家很难在一般家庭看到了。
对于信息人员来说,只会用屏幕触摸输入法,其实很危险!毕竟在生产工作 (写 code、系统维护等) 大多还是使用服务器、工作站等, 还是需要键盘输入!因此,如果要走信息这一块,建议还是赶紧熟悉键盘打字方式!

上图 4.1.1-1 是一种所谓的『星形连接』拓朴 (topology),因为交换器就像是星星一样,通过网络线如同光线发散到各个节点上, 所以称为星形连接。目前网络都是一堆大大小小的星形连接所组合起来的啦!至于星形连接里面,链接的组件大概是:

  • 节点 (node):节点主要是具有网络地址 (IP address) 的设备之称, 因此上面图标中的一般 PC、网络服务器、 路由器/防火墙、网络打印机等,个别都可以称为一个 node。中间那个交换器 (swich/hub) 是不是节点呢? 基本上,基础交换器是不具备 IP 的,所以不算节点。
  • 网络服务器 (server):就网络连接的方向来说,提供数据以『回应』给用户的主机,都可以被称为是一部服务器。 举例来说,google 是个 WWW 服务器,鸟站也是个网页服务器。当然啦,服务器上面当然就得要有『服务』以及相关的『数据』提供才行!
  • 工作站 (workstation) 或用户端 (client):任何可以在电脑网络输入的设备都可以是工作站,若以连接发起的方向来说, 主动发起连接去『要求』数据的,就可以称为是用户端 (client)。举例来说,一般 PC 打开浏览器对 google 要求新闻数据,那一般 PC 就是用户端。
  • 路由器 (router) 或通信闸 (gateway):具有两个以上的网络接口,可以连接两个以上不同的网段的设备, 例如 IP 分享器就是一个常见的路由器设备。鸟哥更喜欢使用省电的 Linux 服务器来作为防火墙或路由器! (你会发现到,上图的节点设备中,仅有『路由器/通信闸』以及『无线AP』才具有两条以上网络线连接,其他都只有一条线而已。 这就代表这两个节点具有两个以上的网络界面喔)
  • 无线 AP (Access point):无线 AP 也是有两个界面,其实就跟上面的路由器相同功能,可以沟通两个不同的界面进行传输。 其中一个界面是用有线网络连接到上层路由器,另一个界面则是通过无线基地台功能,提供用户端 (智能型手机、笔记本电脑) 以无线网卡连接进来。
  • 网络卡 (Network Interface Card, NIC):内置或者是外插在主机上面的一个设备,主要提供网络连接的卡片, 目前大都使用具有 RJ-45 接头的以太网路卡 (稍后解释),在超过 25Gbps 以上的网络媒体,则大部分使用光纤接头的以太网路。一般 node 上都具有一个以上的网络卡,以达成网络连接的功能。另外,临时需要无线网络时,也可以通过 USB 界面的无线网卡来进行设置!
  • LAN 与 WAN

在你接触的无线 AP 当中,你应该经常会看到两种端口口的名称 (IP 分享器后面的接孔),一个是 LAN 一个是 WAN,这两个东西是啥鬼? 基本上,原本的定义是这样的:

  • 局域网路 (Local Area Network, LAN):

    节点之间的传输距离较近,例如一栋大楼内,或一个学校的校区内。可以使用较为昂贵的连接材料, 例如光纤或是高品质网络线 (CAT 6) 等。网络速度较快,连接品质较佳且可靠,因此可应用于科学运算的集群式系统、 分布式系统、云端负荷分担系统等。

  • 广域网络 (Wide Area Network, WAN):

    传输距离较远,例如城市与城市之间的距离,因此使用的连接媒体需要较为便宜的设备,例如经常使用的电话线就是一例。 由于线材品质较差,因此网络速度较慢且可靠性较低一些,网络应用方面大多为类似 email, FTP, WWW 浏览等功能。

虽说是如此,但是,目前 (2023) 家庭网络拨接速度已经可以来到 1Gpbs/600Mbps (下载/上传速度), 所以,定义上面虽然说 WAN 使用的连接媒体较为便宜,不过以目前的现有环境来看,事实上速度与媒体都有一定程度的提升了! 所以,老实说,现在的定义喔,可以说,内部环境就说是 LAN,连到 internet 的那个连接口就简称为 WAN 就好了! 不用太钻牛角尖啦!

4.1.2、网络线水晶头 (RJ-45/8P8C)、信息座与以太网路

前一小节谈到,所有的节点与拓朴中央的交换器,都是通过网络线连接的。网络线总有插头与插孔, 网络线插头我们通常称为水晶头,因为通常这个插头是透明塑料材质,亮晶晶啊~所以称为水晶头。 比较专业的说法,则是 RJ-45 (Registered Jack) 接头或 8P8C 线材 (8 position 8 contact)。 相关的图标有点像底下这样:

RJ-45水晶头
图 4.1.2-1、RJ-45水晶头示意图,画面中 8 芯号码为从左到右是 1 至 8 号

在线材里面的 8 芯是有颜色分别的,每个编号都有对应的颜色,根据颜色的定义,主要有两种线路配置,分别是 568A, 568B。 目前的主流大致上都以 568B 为主,所以,未来你只要知道 568B 就好了!568A 自动略过吧!

RJ-45 水晶头 8 芯颜色的排列顺序
接头名称\蕊线顺序123 45678
568A白绿绿白橙白蓝白棕
568B白橙白绿白蓝绿白棕

早期的 cat5 网络线,虽然是 8P8C 了,但是因为速度只到 100Mbps,事实上仅有 4P4C,亦即仅有两对共四条芯在进行接收与传输而已。 不过,从 1000Mbps 的速度之后,所有 8 芯都用上了!因此,每一个线路都很重要!如果自己压制好了水晶头,一定要用测线器分析过! 避免信号不良,导致网络降速或者是不稳定喔!

如果距离比较远,一般建议施做信息座会比较好!信息座除了比较好压制之外,它也比较不容易损坏,而且还能够搭配桌上盒或墙壁上的插孔, 作为一个固定的插座。一般桌机或笔电,则直接拿市面上压制好的网络线来连接即可。信息座相关的图标以及与网络线的压制状况, 有点像底下这样:

RJ-45信息座 RJ-45信息座
图 4.1.2-2、RJ-45信息座示意图(图片来源:https://www.commscope.com/globalassets/digizuite/55287-eng-cd-1375055-n-pdf.pdf)
如果是某一个点到某一个点的网络线路,建议使用信息座来布线,同样也是依据 568B 的接头样式压制信息座即可。 自制水晶头大多用在应急的环境中而已!不过,虽然没有很建议自己压制水晶头,但是,这个技术还是得要学会才好!
  • 以太网路的速度与标准

以太网路的流行主要是它成为国际公认的标准所致。早先 IEEE 所制订的以太网路标准为 802.3 的 IEEE 10BASE5,这个标准主要的定义是:『10 代表传输速度为 10Mbps,BASE 表示采用基频信号来进行传输,至于 5 则是指每个网络节点之间最长可达 500 公尺。』目前的主流则是 1000BASE-T,高端一点则会使用 10GBASE-T, 使用的就是 8P8C 的线材,速度在 1Gbit/s 以及 10Gbit/s 。不同的线材可到达的标准不同喔!

网络线的等级与网络速度的对照
名称速度搭配的网络线等级
Ethernet10Mbps -
Fast Ethernet100MbpsCat 5
1G Ethernet1GbpsCat 5e / Cat 6
10G Ethernet10GbpsCat 6 / Cat 6A / Cat 7

一般市面上我们会经常看到 Cat 5e, Cat 6, Cat 6e 不同等级的网络线材,至于 Cat 6A 与 Cat 7 可能较少见,其中 Cat 6A 大概是最少见的!Cat 7 说不定还比较常见。就 wiki 的说明,其实 Cat 6e 是厂商自己乱定义出来的一种非标准的线材,所以 wiki 建议大家,还是购买 cat 6 或者是 cat 7 的线路较佳。其实 Cat 5e 就挺好用的,只要拉线不是太长,速度稳定上都很好了! 但如果信息座之间的距离较长,建议还是购买 cat6 以上等级的线材喔!

在 2023 年的现在, 10G 的以太网路其实还挺常见的,但是,10G 的 switch 还是稍贵了,而所有的网络连接,又以最慢的那个媒体为限制, 并不是平均值~但是,谁知道哪一天 10G 网络媒体会突然变便宜呢!所以,为了向未来环境靠拢,建议新的布线,还是使用好一点的线材啦! 未来只要换上新的网络媒体,你的网络速度就可能会提升 10 倍了耶。
  • 以太网路向下兼容的状态与相关机制

再次重申喔,两个节点之间的网络传输速度,是以通过的所有组件中,最慢的那个网络媒体所限制的! 因此,你买的新的主机,里面的网卡速度高达 10Gbps 好了,但是家用的 switch port 都是 Gbps 时,那么所有的速度就会是 Gbps 啰! 除了这个之外,事实上,以太网路媒体通常还会有这些机制喔:

  • 网络速度自动协商机制 (auto-gegotiation)

    那么你的网络媒体怎么知道最低限制的速度是网络线材?还是网络卡呢?因为目前几乎所有的以太网路媒体都具有一个很特别的机制, 称为自动协商机制 (auto negotiation),这个机制会在两个 node 之间传输时,自动协商最佳可接受的速度来进行传输!如果 1Gbps 不能动,那就自动降一级,直到可以接受的那一级速度为止。

  • 全双工与半双工 (full-duplext & half-duplex)

    另外,网络线 8 芯里面,如果发送与接收可以同时进行,那就称为全双工 (full-duplex), 如果同一时间只能进行传输或只能进行接收,无法同时进行,那就称为半双工 (half-duplex)。如果网络带宽为 1Gbps 而有全双工的情境下, 那总带宽 (上传+下载) 就可以达到 2Gbps 了!但是,单一方向最大就是 1Gbps 喔!这个要注意! 此外,中心连接的媒体要是 switch 才能达到全双工,共享媒体的 hub 是无法达到全双工的!

  • 自动分辨网络线跳线或平行线 (Auto MDI/MDIX)

    以前的网络媒体当中, switch 与 PC 之间的接法并不相同,因此需要网络线两头分别使用 568A 及 568B 进行跳接, 这种接法的网络线被称为『跳线』。这样很麻烦啊~因此在 1Gbps 之后的以太网路媒体,已经加上了 auto MDI 或 MDIX 机制, 这种机制会自动判断线路形式而进行跳接,所以,目前网络线仅须两端均为 568B 的平行线即可!

  • 在 Linux 下,使用 ethtool 观察实体网卡支持的机制

我们可以通过 Linux 提供的 ethtool 这个指令来观察/设置实体网卡喔!基本上,虚拟机内的网卡实际限制大概都是跟着实体网卡跑, 而且不太容易修改相关的机制。因此,底下主要是连接到 KVM host 上面去找出实体网卡,然后观察一下, 到底有没有出现上面提到的相关协定机制呢?

# 1. 在 KVM host 实体主机上面,先找到实体网卡的名称
[root@cloud ~]# ip link show
....
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether fc:34:97:3b:eb:86 brd ff:ff:ff:ff:ff:ff
    altname enp0s31f6
....
# 我这部主机的实体网络卡名称为 eno1 喔!通过 ip link show 去找出来的网卡名称
# 由于网卡名称与总线地址有关,所以每部主机的网卡名称都不会相同喔!请自己找出来!

# 2. 使用 ethtool 观察目前的连接状态与机制
[root@cloud ~]# ethtool eno1
Settings for eno1:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Auto-negotiation: on
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        MDI-X: off (auto)
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

如上所示,我们可以看到支持 (Supported) 的连接模式可以到 1000baseT/Full,所以这张网卡支持到 1Gbps 的速度。 然后往下看,目前速度来到 1000Mb/s,而且是全双工 (Duplex: Full),也具有自动协商 (Autonegotiation: on), 使用的网络线为双绞线 (Twisted Pair),这个就是 8P8C 的线材!最后一个 Link detected: yes 就代表目前这个网卡是有连接的。 一项一项来看,其实挺清楚的!

现在,让我们来看一下,那么虚拟机里面的网卡参数,又会长怎样呢?

# 1. 确认一下我们启动的是 test1 虚拟机,用来作为测试。demo1 非必要,不要再激活啰!
[root@cloud ~]# virsh create /kvm/xml/test1.xml
[root@cloud ~]# virsh list
 Id   Name    State
-----------------------
 1    test1   running

[root@cloud ~]# ssh vbird@192.168.10.52
# 请依据您的环境来连接到虚拟机里面去!后续也是这样做即可!

# 2. 同样的,在虚拟机里面,先找出网卡名称
[root@localhost ~]# ip link show
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff

# 2. 就来测试一下,到底虚拟网卡的机制长怎样?
[root@localhost ~]# ethtool enp1s0
Settings for enp1s0:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Unknown! (255)
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Link detected: yes

除了 Link detected 显示为正常之外,其他的...全部都是怪怪的。如果你想要修改速度与全双工的型态, 其实也是可以的!有时候,某些第三方软件在运行时,也是需要网络速度在 1Gbps 以上才会放行!所以啦! 这个时候就得要动手修改才行!用 root 在虚拟机修改修改!

# 基本语法
[root@localhost ~]# ethtool -s dev [speed NN] [duplex full|half] [mdix auto|on|off] [autoneg on|off]

# 注意,是在虚拟机改喔!将速度改为 1000 且为全双工
[root@localhost ~]# ethtool -s enp1s0 speed 1000 duplex full
[root@localhost ~]# ethtool enp1s0
Settings for enp1s0:
        ....
        Speed: 1000Mb/s
        Duplex: Full
        ....

这样就可以骗过检查啰!性能会不会比较好?这就不清楚了!只是,至少你可以清楚的查找到速度以及相关的机制就是了! 更多 ethtool 的参数,请自行 man ethtool 啰!

目前,大部分的 Linux distribution 的网络卡设置,大多会针对 1Gbps 的网络卡进行优化,所以,除非有特殊需求, 否则,不太需要进行额外的参数修改。但,如果是 10Gbps 以上的网络,可能会有一些优化动作需要进行! 所以, ethtool 倒是很重要的喔!此外,上述的设置在下次开机并不会生效!除非写入 /etc/rc.d/rc.local 或自订的 systemctl 服务中。

4.1.3、OSI 七层协定

就如同语言一样,如果没有一致的标准,那么大家各讲各的,谁也听不懂谁的语言~那就无法沟通了!网络世界也一样, 除了上述的硬件标准 (以太网路) 之外, 还有所谓的网络 OSI 七层协定 (Open System Interconnection, OSI) 的数据, 目的在指导操作系统想要加入网络时,所需要撰写的网络连接程序模型。这个 OSI 七层协定只是在提出一个加入网络所需要的模型与概念, 只要能够参考 OSI 七层协定的规范所设计出来的操作系统,理论上就可以加入以 OSI 七层协定为共同标准的网络世界之意。 (有点像目前的强势语言还是英文,所以出国在外,大家都用英文沟通是一样的意思。)

  • 分七层的堆栈?目的是什么?

网络不就是网络,为什么要分为 7 层呢?除了每一层的定义清晰,设计比较方便之外,分不同层级来设计时, debug 也比较方便的。 如果你曾经设计过程序,应该就会知道,如果将全部的数据写在主程序,那未来这个主程序越来越大的时候,将很难维护! 同时,如果有同事想要协助你程序的维护与开发,那将会造成非常大的困扰...每个人写 code 的习惯不同啊~

所以,将主程序拆开成数个函数,当要使用的时候才去调用!每个函数都有特定的输入/输出参数, 如此一来,要使用的时候,填入固定的参数,而你也可以预期该函数会输出什么数据!这样就很容易维护! 同事如果想要帮忙某个写的比较不这么好的函数,那他只要去读该函数内容即可,不用完整的看完所有主程序!真是相当愉快! 这就是分层堆栈的好处之一!

OSI七层堆栈示意
图 4.1.3-1、OSI 网络七层堆栈示意图

如上图所示,就是 OSI 七层堆栈的示意图。依据定义来说,越接近硬件的阶层为底层 (layer 1),越接近应用程序的则是高层 (layer 7)。不论是接收端还是发送端,每个一阶层只认识对方的同一阶层数据。而整个发送的过程就好像人们在玩整人游戏一般, 我们通过应用程序将数据放入第七层的包裹,再将第七层的包裹放到第六层的包裹内,依序一直放到第一层的最大的包裹内,然后发送出去给接收端。 接收端的主机就得由第一个包裹开始,依序将每个包裹拆开,然后一个一个交给对应负责的阶层来视察!这就是整人游戏...喔!是 OSI 七层协定在阶层定义方面需要注意的特色。

不论是写程序、写网页、写 PHP 等等,会持续用到的部份,请尽量使用副程序或函数来处理,要用到的时候就调用, 这样好处很多!因为除了你不用改写之外,未来这段代码如果有优化,任何调用到这段代码的其他程序,都可以享受到优化后的成果! 而且维护也会变得很方便!
  • OSI 七层堆栈的实际分层名称与功能

既然说是包裹,那我们都知道,包裹封面都会有个重要的信息,这些信息包括有来自哪里、要去哪里、接收者是谁等等, 而包裹里面才是真正的数据。同样的,在七层协定中,每层都会有自己独特的表头数据 (header),告知对方这里面的信息是什么, 而真正的数据就附在后头啰!我们可以使用如下的图标来表示这七层每一层的名字,以及数据是如何放置到每一层的包裹内:

OSI七层堆栈示意
图 4.1.3-2、OSI 七层分层的名称示意图

OSI 七层协定的七层,从底层往上层的名称如上图所示。当应用程序,例如浏览器或者是 WWW 服务器软件将数据收集完毕之后, 就会将数据塞入应用层,应用层会在表头记载该数据的特性,然后再往底下塞给表现层,表现层又写一个自己的表头数据,再往下塞给会谈层, 这样一层一层的往下塞,直到最底层的实体层,转成电子信号之后,就交给操作系统,然后提交给网络卡进行发送。 那接收端的系统从网卡接收到这些信号之后,再由实体层、炼结层一个一个的拆解,最终再由应用层将数据传输给应用程序。 至于每一层的名称与功能,简述如下,看看就好。

OSI 七层协定的分层负责内容解释
分层负责内容
Layer 1
实体层
Physical Layer
由于网络媒体只能发送 0 与 1 这种比特串,因此实体层必须定义所使用的媒体设备之电压与信号等, 同时还必须了解数据讯框转成比特串的编码方式,最后连接实体媒体并发送/接收比特串。
Layer 2
数据链结层
Data-Link Layer
这一层是比较特殊的一个阶层,因为底下是实体的定义,而上层则是软件封装的定义。因此第二层又分两个子层在进行数据的转换动作。 在偏硬件媒体部分,主要负责的是 MAC (Media Access Control) ,我们称这个数据报裹为 MAC 讯框 (frame), MAC 是网络媒体所能处理的主要数据报裹,这也是最终被实体层编码成比特串的数据。MAC 必须要经由通信协定来取得媒体的使用权, 目前最常使用的则是 IEEE 802.3 的以太网路协定。详细的 MAC 与以太网路请参考下节说明。

至于偏向软件的部分则是由逻辑链接层 (logical link control, LLC) 所控制,主要在多任务处理来自上层的封包数据 (packet) 并转成 MAC 的格式, 负责的工作包括消息交换、流量控制、失误问题的处理等等。
Layer 3
网络层
Network Layer
这一层是我们最感兴趣的啰,因为我们提及的 IP (Internet Protocol) 就是在这一层定义的。 同时也定义出电脑之间的连接创建、终止与维持等,数据封包的传输路径选择等等,因此这个层级当中最重要的除了 IP 地址之外,就是封包能否到达目的地的路由 (route) 概念了!
Layer 4
发送层
Transport Layer
这一个分层定义了发送端与接收端的连接技术(如 TCP, UDP 技术), 同时包括该技术的封包格式,数据封包的发送、流程的控制、传输过程的侦测检查与复原重新发送等等, 以确保各个数据封包可以正确无误的到达目的端。
Layer 5
会谈层
Session Layer
在这个层级当中主要定义了两个地址之间的连接信道之连接与挂断,此外,亦可创建应用程序之对谈、 提供其他加强型服务如网络管理、签到签退、对谈之控制等等。如果说发送层是在判断数据封包是否可以正确的到达目标, 那么会谈层则是在确定网络服务创建连接的确认。
Layer 6
表现层
Presentation Layer
我们在应用程序上面所制作出来的数据格式不一定符合网络传输的标准编码格式的! 所以,在这个层级当中,主要的动作就是:将来自本地端应用程序的数据格式转换(或者是重新编码)成为网络的标准格式, 然后再交给底下发送层等的协定来进行处理。所以,在这个层级上面主要定义的是网络服务(或程序)之间的数据格式的转换, 包括数据的加解密也是在这个分层上面处理。
Layer 7
应用层
Application Layer
应用层本身并不属于应用程序所有,而是在定义应用程序如何进入此层的沟通接口,以将数据接收或发送给应用程序,最终展示给用户。

事实上, OSI 七层协定只是一个参考的模型 (model),目前的网络社会并没有什么很知名的操作系统在使用 OSI 七层协定的联网代码。那...讲这么多干嘛?这是因为 OSI 所定义出来的七层协定在解释网络传输的情况来说, 可以解释的非常棒,因此大家都拿 OSI 七层协定来做为网络的教学与概念的理解。至于实际的联网代码,那就交给 TCP/IP 这个玩意儿吧!

  • Layer2, Layer3, Layer4 的重要封包表头数据与防火墙

我们经常讲到『网络基础』或者是『防火墙』或者是『第二层交换器』或『第三层交换器』等网络专业术语中,会用到的层级概念, 都是使用 OSI 七层协定的规范!而所谓的『封包过滤式防火墙』主要就是在控制第 2, 3, 4 层的封包过滤, 而『网络基础』的概念,则也是着重在 2, 3, 4 层的介绍与使用的!所以,你一定要知道这七层协定以及各协定的表头数据喔! 当然,只要知道 layer 2, 3, 4 就是了!

那么 Layer 2, 3, 4 里面跟防火墙有关的封包与表头数据,各别有什么呢?

  • Layer 2:主要是 MAC 讯框 (frame),表头数据主要为 MAC 地址,习惯称为网卡卡号
  • Layer 3:主要是 IP 封包 (packet),表头数据主要是 IP 地址,目前有 IPv4 与 IPv6 两种 IP 协定
  • Layer 4:主要是 TCP 或 UDP 封包,两者的表头数据都有 port 号码,基本号码可达 65535 号。

另外,网络是双向的, client 会向 server 要求数据,而 server 自然就会回应数据给 client, 所以,防火墙与相关的网络路由规划,都需要注意到双向传输这件事喔!所以上述的 MAC 地址、IP 地址、port 号码, 都有 server 端与 client 端的纪录喔!如下图所示,下图为第二、三、四层的表头数据最重要的两个数据而已! 并不是所有的表头数据喔!

网络基础的表头数据
图 4.1.3-3、网络基础 (layer2, 3, 4) 的表头数据示意图

所以,所谓的『第二层交换器』,其主要针对的设备为网络卡卡号,比较偏向于硬件方面的设置。而防火墙管理第二层时, 主要也是通过管理主机的网络卡卡号地址!所谓的『第三层交换器』代表该交换器基本上有 IP 地址, 而且比较偏向管理软件封包,而不只是针对硬件而已,当然价格就更高档。而防火墙针对第三层网络层, 主要就是针对操作系统的 IP 地址进行限制。第四层传输层,用在防火墙的规范中,就是针对软件连接到某个应用程序来限制, 这时就是针对服务启动在某个端口口 (port number) 来管理!这样,对 layer 2, 3, 4 有没有稍微清楚些?

4.1.4、TCP/IP 互联网协定

OSI 七层协定规范的网络层级相当清晰,不过架构太过严谨,就是一个网络设计的指引模型。后来美国国防部尖端研究企划署 (Defense Advanced Research Project Agency, DARPA) 依据 OSI 七层协定开发出一套网络系统,当时称为 ARPANET 网络。后来 DARPA 在 1980 年代推出 TCP/IP 技术后,将网络分为两个部份,一个仍给军方使用,另一个则与柏克莱 (Berkeley) 大学合作开发,并将他们的 TCP/IP 技术集成到著名的 BSD Unix 系统内,因此,在早期, TCP/IP 几乎就是学术网络,原因就是这样。

因为 TCP/IP 的架构比较松散,将原本的七层规范简化为四层,只要操作系统的网络功能符合 TCP/IP 的规范,就能够加入该网络系统中。后来更由于 email 的流行,让学术网络风行于各大学间~在 80 年代后期,更由于 Web 以及超链接的发展,让商业公司投入 TCP/IP 的领域中!因此,后来才有网络的大爆发!这个 TCP/IP 的技术,也被称为 Internet (互联网) 啰!所以,学名是 TCP/IP,而俗名就称为互联网 (Internet), 这两者其实是同意字喔!

既然 TCP/IP 是由 OSI 七层协定简化而来,那么这两者之间有没有什么相关性呢?它们的相关性可以图标如下, 同时这里也列出目前在这架构底下常见的通信协定、封包格式与相关标准:

OSI 与 TCP/IP
图 4.1.4-1、OSI 与 TCP/IP 的相关性示意图

TCP/IP 将 OSI 最上层的三层结合成为一个应用层,中间的传输、网络层则保留,最底层的硬件与炼结层结合成为炼结层,所以仅有 4 层而已。 由于应用层偏向于应用程序的调用使用,因此基础网络大概就是底下三层,其实对应起来,也就是 OSI 七层协定的 layer 2, 3, 4 啦!

如同前几个小节提到的,在 TCP/IP 当中,炼结层最重要的数据其实是 layer 2 的 MAC 讯框数据,而网络层最重要的其实是 IP 封包 (packet) 与表头数据,传输层有两种重要的封包,一个是可靠连接的 TCP 封包,一个是非连接导向的 UDP 封包。 至于应用层的相关封包协定,则大多与网络服务有关!那已经是应用程序使用的层级,不算是基础网络概念。 不过比较重要的网络服务协定你还是得要注意一下!尤其是各个服务缺省会激活在某些特定的端口口号码!

4.2、Layer 2 的相关协定

OSI 七层协定的第二层是所谓的『数据链结层』,这一层里面最重要的是一个名为 Media Access Control, MAC 的包裹, 这个包裹主要跟硬件的资源比较有关系,因此,被称为讯框 (frame) 而不是软件包裹而来的封包 (packet)。不过, 其实就是名称不太一样就是了,你还是可以将它想成是个包裹啦!

那这个讯框的表头数据里面有什么?还有,我们前面谈到的网络卡卡号又该如何查看? 以及数据如何在网络卡之间传递?这就是 Layer 2 相关的数据了!

4.2.1、MAC 的封装格式与 MTU

Layer 2 最重要的讯框 (frame) 就是 MAC 讯框,这个讯框上面有两个很重要的数据,就是目标与来源的网卡卡号, 因此我们又简称网卡卡号为 MAC 地址而已。简单的说,你可以把 MAC 讯框想成是一个在网络在线面传递的包裹, 而这个包裹是整个网络硬件上面发送数据的最小单位了。也就是说,网络线可想成是一条『一次仅可通过一个人』的独木桥, 而 MAC 讯框就是在这个独木桥上面动的人啦!接下来,来看一看 MAC 这个讯框的内容吧!

以太网路讯框表头数据
图 4.2.1-1、以太网路 MAC 讯框表头数据示意图

上图中的目的地址与来源地址指的就是网卡卡号 (hardware address, 硬件地址),每一张网卡都有一个独一无二的卡号, 那个卡号的目的就在这个讯框的表头数据使用到啦!硬件地址最小由 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF (16 进位法,共 12 个值), 这 6 bytes 当中,前 3bytes 为厂商的代码,后 3bytes 则是该厂商自行设置的设备码了。

还记得 nmap 这个指令嘛?用 nmap 去扫描自己的区网主机群的时候,nmap 会顺便告诉你该主机可能是哪个厂牌, 就是根据 MAC 地址前三个 bytes 的分析啦!另外,虽然网络卡的 MAC 地址可以通过 ip 指令伪装与修改, 但是很不建议这样做喔!
  • 为什么数据量在 46bytes 到 1500bytes 呢?

早期讯框内的数据内容最大仅能到 1500bytes 而已,近期则可能可以放大到 9000bytes 左右。但是,为何需要规范最小数据量为 46byes 呢? 这是由于 CSMA/CD (稍后说明) 机制所算出来的!在这个机制上面可算出若要侦测碰撞,则讯框总数据量最小得要有 64bytes , 那再扣除目的地址、来源地址、检查码 (前导码不算) 后,就可得到数据量最小得要有 46bytes 了!也就是说,如果妳要传输的数据小于 46byes ,那我们的系统会主动的填上一些填充码,以补齐至少 46bytes 的容量才行!这都是 TCP/IP 网络功能自动处理, 你不用理会的!

  • MTU (Maximum Transmission Unit) 最大传输单位

通过上面 MAC 封装的定义,现在我们知道标准以太网路讯框所能发送的数据量最大可以到达 1500 bytes ,这个数值就被我们称为 MTU (Maximum Transmission Unit, 最大传输单位)。你得要注意的是,每种网络接口的 MTU 都不相同,因此有的时候在某些网络文章上面你会看到 1492 bytes 的 MTU 等等。不过,在以太网路上,标准的定义就是 1500 bytes。

在待会儿会介绍到的 IP 封包中,这个 IP 封包最大可以到 65535 bytes,比 MTU 还要大哩!既然礼物 (IP封包) 都比盒子 (MAC讯框) 大, 那怎么可能放的进去啊?所以啰, IP 封包是可以进行拆解的,然后才能放到 MAC 讯框当中啊!等到数据都传到目的地, 再由目的地的主机将他组装回来就是了。所以啰,如果 MTU 能够大一些的话,那么 IP 封包的拆解情况就会降低, 封包与封包发送之间的等待时间 (大约是 96 bit time) 也会减少,就能够增加网络带宽的使用啰!

为了这个目的,所以 Gigabit 的以太网路媒体才有支持 Jumbo frame 的嘛!这个 Jumbo frame 一般都定义到 9000bytes。 那你会说,既然如此,我们的 MTU 能不能改成 9000bytes 呢?这样一来不就能够减少数据封包的拆解,以增加网络使用率吗? 是这样没错,而且,你也确实可以在 Linux 系统上更改 MTU 的!但是,如果考量到整个网络,那么我们不建议你修改这个数值。为什么呢?

我们的封包总是需要在 Internet 上面跑吧?你无法确认所有的网络媒体都是支持那么大的 MTU 对吧!如果你的 9000 bytes 封包通过一个不支持 Jumbo frame 的网络媒体时,好一点的是该网络媒体 (例如 switch/router 等) 会主动的帮你重组而进行发送,差一点的可能就直接回报这个封包无效而丢弃了~这个时候可就糗大啰~ 所以, MTU 设置为 9000 这种事情,大概仅能在内部网络的环境中作~举例来说,很多的内部集群系统 (cluster) 就将他们的内部网络环境 MTU 设置为 9000,但是对外的适配器可还是原本的标准 1500 喔!

MTU 真的不能乱改!鸟哥许多环工模式的运算系统,都没有对外网络,因此内部喜欢使用 10G 网卡搭配 9K 的 MTU 来设计! 但是,使用了华硕 10G 的网卡,沿用了 9K MTU 的设计后,虽然使用 ethtool 看起来是 10G 的连网速度,但是实际使用 NFS 文件系统操作时,文件传输速度竟然掉到 100Mbps 而已...吓死我了!改回 1500 的 MTU 设计,立刻恢复正常,大约回到 6G~7Gbps 的带宽使用率。 所以说,要变更网络参数时,在变更前/后,最好都使用测试方式 (第二章后面谈到的内容) 来测试性能,比较能够有依据的反应你的调整是否有效。
  • 使用 ifconfig, ip link 等方式查看/修改网卡卡号 (MAC address) 与 MTU

查看网卡卡号也是挺容易的,好几个指令功能可以处理。我们来看看简单的 ifconfig 以及 ip link show 吧! 不过,要注意的是,底下的操作,可以的话,请尽量使用类似 remote-viwer 的方式在 VNC 情境下实做,因此, 鸟哥不敢肯定你改了 MTU / MAC address 之后,ssh 的网络连接是否能够持续...说不定会暂时中断啦!

# 1.1 先用 ifconfig 查看一下虚拟机的网卡
[root@localhost ~]# ifconfig  enp1s0
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.52  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::5054:ff:feed:63aa  prefixlen 64  scopeid 0x20
        ether 52:54:00:ed:63:aa  txqueuelen 1000  (Ethernet)
        RX packets 6860  bytes 430760 (420.6 KiB)
....

# 1.2 使用 ip link show 也行:
[root@localhost ~]# ip link show enp1s0
2: enp1s0: >BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
# 其实,两个指令都可以查看 MAC address 以及 MTU 的数值!

# 2.1 使用 ip link set 功能,进行 MAC address 伪装,将原本的地址结果变成 ff 看看
[root@localhost ~]# ip link set enp1s0 address 52:54:00:ed:63:ff
[root@localhost ~]# ip link show enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:ed:63:ff brd ff:ff:ff:ff:ff:ff permaddr 52:54:00:ed:63:aa
# 这个设置值在下次开机会恢复成原本的 MAC 地址。

# 2.2 使用 ifconfig 指令修改 MTU 数值
[root@localhost ~]# ifconfig  enp1s0 mtu 9000
[root@localhost ~]# ifconfig  enp1s0
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 192.168.10.52  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::5054:ff:feed:63aa  prefixlen 64  scopeid 0x20
        ether 52:54:00:ed:63:ff  txqueuelen 1000  (Ethernet)
....

# 3. 测试完毕后,使用 ip 指令将 MAC address 与 MTU 修改回默认值
[root@localhost ~]# ip link set enp1s0 mtu 1500 address 52:54:00:ed:63:aa
[root@localhost ~]# ip link show enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff

ip 就是个万用指令!这个指令后续接的 layer 2 参数,就是『 ip link 』,如果是 layer 3 时,那就用『 ip addr 』参数! 只是,不知道你的网络环境当中是否可接受这些数值前,不要乱改喔!所以,上面我们测试完毕之后, 最后一步有改回来喔!注意注意!如果需要永久生效,那就得要使用 nmcli 这个指令的配合!这边只是先行测试而已!

4.2.2、以太网路的 CSMA/CD

了解了 MAC 讯框与其表头数据之后,接下来让我们了解一下,那么这个 MAC 讯框的包裹,是怎么在主机之间互相发送的呢? 基本上,以太网路的 MAC 讯框,主要是通过 CSMA/CD (Carrier Sense Multiple Access with Collision Detection) 的方式进行发送的! 这个 CSMA/CD 是 IEEE 802.3 的标准,整体流程我们使用底下的图标来进行说明:

CSMA/CD 图标说明
图 4.2.2-1、CSMA/CD连接示意图,由 A 发送数据给 D 时,注意箭头方向

集线器是一种网络共享媒体,什么是网络共享媒体啊?想像一下上述的环境就像一个十字路口,而集线器就是那个路口! 这个路口一次只允许一辆车通过,如果两辆车同时使用这个路口,那么就会发生碰撞的车祸事件啊!那就是所谓的共享媒体。 也就是说,网络共享媒体在单一时间点内, 仅能被一部主机所使用。

理解了共享媒体的意义后,再来,我们就得要讨论,那么以太网路的网卡之间是如何传输的呢?我们以上图中的 A 网卡要发数据给 D 网卡为例好了,简单的说,CSMA/CD 搭配上述的环境,它的传输情况需要有以下的流程:(A 所发送的讯框,MAC 的表头数据中, 来源卡号为 A 的卡号,目标卡号为 D 的卡号)

  • 监听媒体使用情况 (Carrier Sense, CS):

    A 主机要发送 MAC 讯框前,需要先对网络媒体进行监听,确认没有人在使用后,才能够发送出讯框

  • 多点传输/接收 (Multiple Access, MA):

    A 主机所送出的 MAC 讯框会被集线器拷贝一份,然后以广播的方式发送给所有连接到此集线器的主机!也就是说,A 所送出的数据, B, C, D 三部电脑都能够接收的到!但由于目标是 D 主机,因此 B 与 C 会将此讯框数据丢弃,而 D 则会抓下来处理;

  • 碰撞侦测 (Collision Detection):

    该讯框数据附有检测能力,若其他主机例如 B 电脑也刚好在同时间发送讯框数据时,那么 A 与 B 送出的数据碰撞在一块 (出车祸), 此时这些讯框就是损毁,那么 A 与 B 就会各自随机等待一个时间, 然后重新通过第一步再发送一次该讯框数据。

强者我同事蔡董大大说了一个非常有趣的 CSMA/CD 的解释~所谓的 CSMA/CD ,就好像乡下人骑摩托车过马路十字路口, 过马路前先看一下 (CS) ,没人用的话,就直接过去了 (MA),如果有人在用,那就等一下。万一大家都觉得你会让我, 所以都冲过去,但是撞到了?那就把摩托车都牵回来,等待一段时间再冲过去 (CD)...好像很传神!不用管有没有红绿灯...
  • CSMA/CD 通过共享媒体所产生的问题:

通过上述的 CSMA/CD 方式,我们就可以很轻松的将 MAC 讯框这个包裹,在局域网路内,通过共享媒体直接传输! 但是,这个情境有点问题呢!有什么问题呢?我们轻松的说一说好了。

  • 网络忙碌时,集线器灯号闪个不停,但我的主机明明没有使用网络:

    通过上述的流程我们会知道,不管哪一部主机发送出讯框,所有的电脑都会接收到!因为集线器会拷贝一份该数据给所有电脑。 因此,虽然只有一部主机在对外连接,但是在集线器上面的所有电脑灯号就都会闪个不停!大家都疯狂收到该 MAC 讯框数据喔!

  • 我的电脑明明没有被入侵,为何我的数据会被隔壁的电脑窃取:

    通过上述的流程,我们只要在 C 电脑上面安装一套监听软件,这套软件将原本要丢弃的讯框数据捉下来分析,并且加以重组, 就能够知道原本 A 所送出的消息了。这也是为什么我们都建议重要数据在互联网上面得要『加密』后再传输!看不懂嘛?没关系, 我们来想个人间类似的情境好了。假设你在教室上课,老师正在讲一些政治八卦,旁边路过的同学觉得很有趣,但是他不想进入教室, 所以就拿录音笔在教室外面录音。此时,教室内的老师、同学都不会知道有人录音走了这些数据 (没人被入侵), 但是上课的内容都被录音窃取了(数据被窃取)!这样的意思!

  • 既然共享媒体只有一个主机可以使用,为何大家可以同时上网:

    这个问题就有趣了,既然共享媒体一次只能被一个主机所使用,那么万一我传输 100MB 的文件,集线器就得被我使用 80 秒 (以 10Mbps 传输时),在这期间其他人都不可以使用吗?不是的,由于标准的讯框数据在网络卡与其他以太网路媒体一次只能传输 1500bytes,因此:

    • 我的 100MB 文件就得要拆成多个小数据报,然后一个一个的发送,
    • 每个数据报发送前都要经过 CSMA/CD 的机制。

    所以,这个集线器的使用权是大家抢着用的!即使只有一部主机在使用网络媒体时,那么这部主机在发送每个封包间, 也都是需要等待一段时间的 (96 bit time)!bit time 的单位很特别,它的定义有点像这样:

    简单的意思是,发送 1 bit 所需要花费的时间~所以,如果是 10Mbps 的速度,代表的就是 10*106 bit/s = 107 bit/s, 那么 1 bit time 就是 1/107 = 10-7 秒!所以,现今的 1Gbps 网卡速度,其 bit time 就会是 10-9 秒的意思!

  • Layer 3 的 ARP 协定找寻目标 MAC 讯框地址

等等,上面的 CSMA/CD 机制中,开宗明义就说来源 MAC address 是 A 而目标 MAC address 是 D,问题是, A 怎么知道 D 的网卡卡号?这真是没道理!如果没有什么特别的『询问机制』,在局域网路内,不应该大家立刻知道彼此谁是谁吧? 所以,A 认识 D 的卡号,是怎么办到的呢?这就得要说明一下 ARP 协定了!

其实,互联网 TCP/IP 只认 IP 地址,所以,互联网连接的两部主机之间,使用的是 IP 封包传递数据的。 但是,实际上的以太网路数据传递则是通过 MAC 讯框,这两者之间,一定会有某种关系! 这通过的就是 ARP 协定 (Address Resolution Protocol, 网络地址解析协定),这是从 layer 3 的 IP 地址去找到 layer 2 的 MAC 地址的一个重要协定。

当 A 需要知道『局域网路内』的某部主机的 MAC 地址时,就会发送一个广播封包,询问有没有人知道 D 的 MAC 地址。 跟原本的 CSMA/CD 相同,B 与 C 会主动略过这个询问,而 D 就会回报他自己的 MAC 地址给 A,这时, D 就将 A 的 MAC 地址纪录起来,而 A 也会将 D 的地址纪录下来!就纪录到 arp table 当中 (内存内的数据)。 我们来测试看看这个效果! (跟前面类似的,底下的测试会使用到 KVM host 以及虚拟机喔!所以要开两个窗口)

# 1. 先在虚拟机上面使用 ping 去检查一部不存在的区网 IP
[root@localhost ~]# ping 192.168.10.20   <== 这个是『区网』内的一个没用到的 IP
PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.
From 192.168.10.52 icmp_seq=1 Destination Host Unreachable
From 192.168.10.52 icmp_seq=2 Destination Host Unreachable
....
# 反复出现这个错误,是正常的!不要紧!

# 2. 在 KVM host 上面,使用 tcpdump 监听 templan 网络界面
[root@cloud ~]# tcpdump -i templan -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on templan, link-type EN10MB (Ethernet), snapshot length 262144 bytes
15:23:24.184714 ARP, Request who-has 192.168.10.52 tell 192.168.10.254, length 28
15:23:24.184842 ARP, Reply 192.168.10.52 is-at 52:54:00:ed:63:aa, length 28
15:23:24.210949 ARP, Request who-has 192.168.10.20 tell 192.168.10.52, length 28
....
# 测试完毕之后,两边都按下 [ctrl]-c 结束测试

上面有两个情境,(1)一个是鸟哥的 server (192.168.10.254) 在查找谁是 192.168.10.52,实际 .52 就是虚拟机, 有活着喔!所以,虚拟机就回应它的网卡卡号给 .254 了!(2)另一个就是虚拟机询问的,它问说有没有人知道 .20 是谁? 因为 .20 并不实际存在,所以没有人会给予回应,于是该条消息就会一直持续不断的通过广播来询问整个 LAN 喔! 如果这个时候你使用 arp 这个指令来查看一下虚拟机上面的 arp table 数据,就会有点像这样:

# 显示出虚拟机内的 arp table 数据
[root@localhost ~]# arp -n
Address             HWtype  HWaddress           Flags Mask   Iface
192.168.10.20               (incomplete)                     enp1s0
192.168.10.254      ether   52:54:00:00:ff:01   C            enp1s0

很明白的告诉你, 192.168.10.20 找不到相关的 MAC 地址,而路由器的 192.168.10.254 就有纪录好该主机的 MAC 地址了! 相当的清楚明白!那如果其实你知道 192.168.10.20 这个主机的 MAC 号码,所以不想让你的主机去『学习』, 而是想要主动的『设置 MAC 地址到 arp table 中』呢?例如假设 192.168.10.20 的 MAC 卡号是 52:54:00:00:ff:20 时! 那可以这样做:

# 在虚拟机上面设置 IP 地址与 MAC 地址的『静态 ARP』对应
[root@localhost ~]# arp -s 192.168.10.20 52:54:00:00:ff:20
[root@localhost ~]# arp -n
Address          HWtype  HWaddress           Flags Mask    Iface
192.168.10.20    ether   52:54:00:00:ff:20   CM            enp1s0
192.168.10.254   ether   52:54:00:00:ff:01   C             enp1s0
[root@localhost ~]# ping 192.168.10.20

# 在 KVM host 上面,继续侦测 templan 的封包状态
[root@cloud ~]# tcpdump -i templan -nn
16:04:35.502439 IP 192.168.10.52 > 192.168.10.20: ICMP echo request, id 5, seq 8, length 64
16:04:36.526746 IP 192.168.10.52 > 192.168.10.20: ICMP echo request, id 5, seq 9, length 64

使用 arp -s 可以将 IP 地址与 MAC 地址『静态』的纪录到自己主机的 arp table 当中,因为是静态的, 所以这笔纪录不会遗失 (重新开机或使用 arp -d 删除就 OK),而再次使用 ping 与 tcpdump 去查看局域网路内的封包情况,你就可以发现 ARP 要求不见了!因为该发送 ping 的主机『已经知道 MAC 地址』了, 所以当然不用重新找寻 MAC 地址。

arp 设置静态 MAC 地址对应,在某些状况底下可能很有用,例如在某些 proxy 的情况下。除此之外, 大部分的情况下,设置静态 MAC 并不是好事...如果设置错误,该部主机你永远都连不上了...

4.2.3、hub 与 switch

刚刚我们上面提到了,当一个很忙碌的网络在运作时,集线器 (hub) 这个网络共享媒体就可能会发生碰撞的情况, 这是因为 CSMA/CD 的缘故。那有没有办法避免这种莫名其妙的封包碰撞情况呢?有的,那就使用非共享媒体的交换器即可啊!

交换器 (switch) 等级非常多,我们这里仅探讨支持 OSI 第二层的交换器。交换器与集线器最大的差异, 在于交换器内有一个特别的内存,这个内存可以记录每个 switch port 与其连接节点的 MAC 地址,所以,当来自 switch 两端的节点要互传数据时,每个讯框将直接通过交换器的内存数据而发送到目标主机上!所以 switch 不是共享媒体,且 switch 的每个端口口 (port) 都具有独立的带宽喔!

如下所示,当 A 与 D 之间要互相传递数据,而 B 与 C 之间也同时要互相传递数据时,两者通过 switch 的内存辅助, 因此可以直接将讯框数据丢到特定的 switch 端口口去,因此就可以略过大部分的封包碰撞,同时也才能够达到全双工的功能! 说实在的,目前 (2023) 家庭用 8 port 的 switch 几乎都可达到 1Gbps 的速度,而且价格大多在 1000 新台币以内, 千万不要买错!买成 500 元以下的 hub,那就伤脑筋了!

switch 运作方式
图 4.2.3-1、交换器每个端口口的带宽使用示意图
  • 信号衰减的问题

另外,在布线的时候你也需要注意,一般来说,当你的网络线拉的线段太长,然后水晶头压制的不够好,这个时候, 电子信号由于衰减的关系,可能会造成连接品质不良,因此网络情况就会时通时不通~一般来说,Cat 5e 的速度达到 1Gbps 的情况,可以拉线到 100m 左右,不过实际布线时,能够达到 90m 就已经是很棒的情况了。

如果布线是 10Gbps 的话,那么肯定需要使用到 Cat 6a 等级的线路较佳,因为线长可以达到 100m 左右之外,未来可以使用到 10Gbps 的速度!要注意,短距离 (可能小于 1.5m) 的情况下,即使是 Cat 5e 的线路,依旧有可能达到 10Gbps 的连接速度 (在实际测试中,确实可以达成此速度),不过,稍微拉长一点之后,可能网络品质就会下降到 1Gbps 了!为了未来着想,要拉长距离的线路, 最好还是使用 Cat 6 以上等级的网络线较佳。

那『为什么市面上贩卖的网络线,通常绝对长于 1.5m 呢?』难道没有短线的需求?查了查 wiki , 底下这一段文本相当有趣:

靠近水晶头的地方,网络线的八条芯被从线路中独立出来,被捋平了。此时这 8 芯将失去了双绞线的特性。线越短, 未绞线/正常绞线的比例会越来越大,这样这段线的电气性能会有降低。此原因导致有线缆最短长度为 1.5m 或 1m 来保证其电气性能。

虽然自己压制短线材是没问题,不过使用上可能需要注意,不要拿来作为重要应用!自己的 PC 使用自己压制的网络线当然没问题!另外,Cat 5e 的线材还能自己压制, Cat 6 以上等级的线路,尽量使用信息插座,不用自己压制水晶头~而且 Cat 5e 与 Cat 6 等级的水晶头并不一样,Cat 6 等级的水晶头很难压制! 即使压制成功,其电气效果可能也大打折扣。所以,超过 Cat 6 以上等级的网络线,就买工厂制作的线材, 如果要自己压制,请尽量使用信息插座吧!

说到压制水晶头,鸟哥是老派的老人家,一直以为网络水晶头只有一种格式,没想到目前有直接穿透式的水晶头格式,大家可以使用 google 找『RJ-45 穿透式』关键字,就会知道鸟哥在说什么。这种穿透式的水晶头真的很好压制,只是据说裸露的铜线很容易由于风化而生锈, 导致信号不佳。不过...自己压制的水晶头能用个几年年也 OK 了!好压制就好!用这种水晶头来让学生体验压制网络线, 成功率大大提升!同学们有自信多了!哈哈!

4.3、Layer 3 的相关协定

我们现在知道要有网络的话,必须要有网络相关的硬件,而目前最常见的网络硬件接口为以太网路,包括网络线、网络卡、Hub/Switch 等等。 而以太网路上面的传输使用网络卡卡号为基准的 MAC 讯框,配合 CSMA/CD 的标准来发送讯框,这就是硬件部分。 在软件部分,我们知道 Internet 其实就是 TCP/IP 这个通信协定的通称,Internet 是由 InterNIC 所统一管理的, 但其实他仅是负责分配 Internet 上面的 IP 以及提供相关的 TCP/IP 技术文档而已。不过 Internet 最重要的就是 IP 协定/地址啊!所以, 这个小节就让我们来讲讲网络层的 IP 与路由吧!

4.3.1、IP 封包的版本与表头

互联网原本仅有 IPv4 (Internet Protocol version 4) 这个版本的 IP 协定,IPv4 的 IP 地址仅有 32 比特, 目前已经发放完毕,没有多余的 IPv4 地址可以提供给新进的 ISP 了!因此,很早之前,国际组织就开始着手制定 IPv6 的 IP 协定。 IPv6 的 IP 地址为 128 比特,单算数值的话, IPv6 的地址数量是 IPv4 的 296 倍数,等于是用不完的 IP 地址啦! 只是,因为 IPv6 在台湾的路由与相关网络媒体还是不热门,所以,目前大致上还是以 IPv4 为主要的 IP 地址设置依据就是了。好, 那么 IPv4 的封装是怎样呢?其实有点像这样:

4 bits 4 bits 8 bits 3 bits 13 bits
Version IHL Type of Service Total Length
Identification Flags Fragmentation Offset
Time To Live Protocol Header Checksum
Source Address
Destination Address
Options Padding
Data
图 4.3.1-1、IPv4 封包的表头数据

在上面的图标中有个地方要注意,那就是『每一行所占用的比特数为 32 bits』。相关的表头数据可以参考许多网络文档, 鸟哥这边仅介绍我们比较有兴趣的部份:

  • Time To Live(TTL, 存活时间)

    表示这个 IP 封包的存活时间,范围为 0-255。当这个 IP 封包每通过一个路由器时,TTL 就会减一,当 TTL 为 0 时,这个封包将会被直接丢弃,因为代表几乎找不到目标 IP 地址了。说实在的, 要让 IP 封包通过 255 个路由器,还挺难的~

  • Protocol Number(协定代码):

    来自传输层 (layer4) 与网络层 (layer3) 本身的其他数据都是放置在 IP 封包当中的,我们可以在 IP 表头记载这个 IP 封包内的数据是啥, 在这个字段就是记载每种数据封包的内容啦!在这个字段记载的代码与相关的封包协定名称如下所示:

    IP 内的号码封包协定名称(全名)
    1ICMP (Internet Control Message Protocol)
    2IGMP (Internet Group Management Protocol)
    3GGP (Gateway-to-Gateway Protocol)
    4IP (IP in IP encapsulation)
    6TCP (Transmission Control Protocol)
    8EGP (Exterior Gateway Protocol)
    17UDP (User Datagram Protocol)

    我们比较常见到的有 TCP, UDP, ICMP等。

  • Source Address 与 Destination Address

    就是这个 IP 封包的来源地址与目标地址,两者均是 32 比特喔!一定要记下来的是,IPv4 的 IP 地址是 32 比特这件事!

还记得我们使用 ping 的方式去探索目标主机是否存在时,屏幕上会出现 TTL 这个关键字嘛?对了!该数值就是从这里取得的! IP 封包里面纪录的来源与目标地址,我们称为『IP 地址』,要特别留意的是,所谓 IP 是一种封包协定,在这个 IP 封包上面, 有个来源 (发送端) 与目标 (接收端)的地址,那就我们称的 IP 地址!通常大家习惯都说 IP,老实说,那是错误的!这里了解一下即可! 另外,在协定代码中,TCP 与 UDP 我们在本章稍后介绍,这边先讲一讲 ICMP 好了。

  • Layer 3 的 ICMP 协定

ICMP 的全名是『 Internet Control Message Protocol, 互联网消息控制协定 』。基本上,ICMP 是一个错误侦测与回报的机制,最大的功能就是可以确保我们网络的连接状态与连接的正确性! ICMP 也是网络层的重要封包之一,不过,这个封包并非独立存在,而是纳入到 IP 的封包中!也就是说,ICMP 同样是通过 IP 封包来进行数据发送的啦!因为在 Internet 上面有传输能力的就是 IP 封包啊!ICMP 有相当多的类别可以侦测与回报,底下是比较常见的几个 ICMP 的类别 (Type):

ICMP 协定之类别代号意义
类别代号类别名称与意义
0Echo Reply (代表一个回应信息)
3Destination Unreachable (表示目的地不可到达)
4Source Quench (当 router 的负载过高时,此类别码可用来让发送端停止发送消息)
5Redirect (用来重新导向路由路径的信息)
8Echo Request (请求回应消息)
11Time Exceeded for a Datagram (当数据封包在某些路由发送的现象中造成逾时状态,此类别码可告知来源该封包已被忽略的消息)
12Parameter Problem on a Datagram (当一个 ICMP 封包重复之前的错误时,会回复来源主机关于参数错误的消息)
13Timestamp Request (要求对方送出时间消息,用以计算路由时间的差异,以满足同步性协定的要求)
14Timestamp Reply (此消息纯粹是回应 Timestamp Request 用的)
15Information Request (在 RARP 协定应用之前,此消息是用来在开机时取得网络信息)
16Information Reply (用以回应 Infromation Request 消息)
17Address Mask Request (这消息是用来查找子网络 mask 设置信息)
18Address Mask Reply (回应子网络 mask 查找消息的)

那么我们是如何利用 ICMP 来检验网络的状态呢?最简单的指令就是 ping 与 traceroute 了,这两个指令可以通过 ICMP 封包的辅助来确认与回报网络主机的状态。在设置防火墙的时候,我们最容易忽略的就是这个 ICMP 的封包了,因为只会记住 TCP/UDP 而已~事实上,ICMP 封包可以帮助连接的状态回报,除了上述的 8 可以考虑关闭之外,基本上,ICMP 封包也不应该全部都挡掉喔!

4.3.2、IPv4 地址与局域网路

互联网很多的设计其实应该是有参考人类的邮务系统~所以,我们说,网络主机都会有个门牌, 这个门牌就是代表人家怎么来到你的服务器的主要目标,这个目标就是 IP 地址啰!前面也谈到, IPv4 的 IP 地址为 32 比特, 也就是 32 个 0 与 1 组合而成的地址长度。亦即 IP 地址最小与最大的数值分别是 (使用 2 进位展示时):

IP 地址在 2 进位的表示方式:
二进位最小:00000000000000000000000000000000
二进位最大:11111111111111111111111111111111

上述的字符串你真背的出来倒也真是相当不容易~为了让人类使用习惯的 10 进位数字来记忆,因此许多操作系统都提供 8 比特为一组共拆成 4 组的 IP 地址设计方式,并且四组之间通过小数点 (.) 来区分,因此就变成这样:

IP 地址在 10 进位的表示方式:
二转十进位最小:00000000.00000000.00000000.00000000 ==> 0.0.0.0
二转十进位最大:11111111.11111111.11111111.11111111 ==> 255.255.255.255
  • 同一局域网路的 IP 地址:从定义上来讲 (需要背的分级定义)

缺省的 IP 地址是有等级之分的!这个『等级』的意思是,该 IP 地址的『局域网路的范围』到哪里的意思。 举个简单的例子来说好了,昆山科技大学所在的地址是:『台南市、永康区、昆大路、195号』,这个门牌的意思是:

  • 台南市的市长 (Class A):台南市.XX.XX.XX 都是我管的!
    代表『台南市』是市长管理的,底下的永康区、北区、东区、仁德区等等,都是市长管理的!所以,『台南市』名称不能变,其他区、路、号码不能重复! 在台南市底下的所有区,所有的 XX.XX.XX 居民们,都可以通过广播器互通信息。
  • 永康区的区长 (Class B):台南市.永康区.XX.XX 是我区长管的
    代表『台南市、永康区』是区长管理的,这个大门牌基本不变。而后续的昆大路、大湾路、永大路、文化路等等, 这些门牌就属于永康区长管理的!所以,在永康区底下的所有住户,同样可以通过广播器互通信息。
  • 昆大路的路长 (Class C):台南市.永康区.昆大路.XX 是我路长管的
    代表『台南市、永康区、昆大路』是路长管理的,里面的所有号码 (包括 195号),都是在同一条巷子的住户群! 受这个路长管理的意思。这些住户都可以通过广播器来广播互通信息啦!

所以说,IP 地址的数值,就跟上面的门牌号码一样,该 IP 地址就会决定广播到哪里的意思。那接下来就有趣了! 在『基本定义』上,到底 IP 地址的范围到哪里呢?这一开始需要从 2 进位来看才行!InterNIC 将所有 IPv4 地址分为五种基本等级:

以二进位说明 Network 第一个数字的定义:
Class A : 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  ==> Net_ID 的开头是 0
          |--net--|---------host------------|
Class B : 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  ==> Net_ID 的开头是 10
          |------net-------|------host------|
Class C : 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  ==> Net_ID 的开头是 110
          |-----------net-----------|-host--|
Class D : 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  ==> Net_ID 的开头是 1110
Class E : 1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  ==> Net_ID 的开头是 1111

五种分级在十进位的表示:
Class A :   0.xx.xx.xx ~ 127.xx.xx.xx
Class B : 128.xx.xx.xx ~ 191.xx.xx.xx
Class C : 192.xx.xx.xx ~ 223.xx.xx.xx
Class D : 224.xx.xx.xx ~ 239.xx.xx.xx
Class E : 240.xx.xx.xx ~ 255.xx.xx.xx

根据上表的说明,我们可以知道,你只要知道 IP 地址的第一个十进位数字,就能够约略了解到该 IP 地址属于哪一个等级, 以及同网域 IP 数量有多少。不过,上表中你只要记忆三种等级,亦即是 Class A, B, C 即可,因为 Class D 是用来作为群播 (multicast) 的特殊功能之用 (最常用在大批电脑的网络还原),至于 Class E 则是保留没有使用的网段。 因此,能够用来设置在一般系统上面的,就只有 Class A, B, C 三种等级的 IP 地址啰!

我们以 class A 为范本来说明好了,假设就选 127.xx.xx.xx 这一段来说明,这一组 IP 地址的范围会是 127.0.0.0 到 127.255.255.255 之间! 所以,这组 class A 的局域网路 IP 地址群,就总共会有 256x256x256 个 IP 地址喔!那如果以 class B 为范本呢? 定义上的 class B 不会有 172.0.0.0 ~ 172.255.255.255 这样的分群,而是 172 底下共有 256 个分群 (172.0, 172.1, 172.2, ...), 我们拿 172.16.xx.xx 这个分群来说,这一组 IP 地址就会是 172.16.0.0 到 172.16.255.255,共会有 256x256 个 IP 地址在同一个网段喔!

所以,一般比较有经验的网管人员,大概一看第一组的 IP 地址,就知道这组 IP 地址的范围到哪里了! 也就能够设计好一整个区段的电脑啰!
  • 同一个局域网路:在同一个 LAN 的意义

我们以 192.168.0.0~192.168.0.255 这个 Class C 的网段做个简单的介绍,基本上,这一段 IP 地址的范围中, 最大与最小的 2 进位表示方式如下:

192.168.0.0~192.168.0.255 这个 Class C 的说明:
11000000.10101000.00000000.00000000  ==> 192.168.0.0
11000000.10101000.00000000.11111111  ==> 192.168.0.255
|----------Net_ID---------|-host--|

如之前谈到的『台南市、永康区、昆大路、195号』相同,上面所谓的 Class C,他的 IP 地址分为巷子 (Net ID) 与户号 (host ID)。 同一个局域网路,意思是说,巷子号码要完全一样,户号则不能重复!就跟我们一般住家的巷子内每一户人家的门牌设计一样。 这就是所谓的同一网段啰!

在定义上,为了要让大家更清楚 Net ID 的范围,因此有定义出所谓的子网络遮罩 (subnet mask, 或仅称 netmask),我们继续用上面的案例做说明。 基本上, netmask 是另一个类似 IP 地址的数值,只是,它规范的是分开 Net ID 与 Host ID,简单的设计方式是, 所有的 Net ID 都补上 2 进位的 1,所有的 Host ID 都补上 2 进位的 0,如下所示:

192.168.0.0~192.168.0.255 这个 C Class 的 Netmask 说明
第一个 IP: 11000000.10101000.00000000.00000000
最后一个 : 11000000.10101000.00000000.11111111
            |----------Net_ID---------|-host--|
Netmask  : 11111111.11111111.11111111.00000000  <== Netmask 二进位
         :   255   .  255   .  255   .   0      <== Netmask 十进位
特别注意喔,netmask 也是 32 比特,在数值上,位于 Net_ID 的为 1 而 Host_ID 为 0

另外,在定义上,上面整组 192.168.0.{0..255} 的第一个 IP 地址我们称为网域 IP 地址 (network IP address),最后一个 IP 地址则被称为广播地址 (broadcast address)。同时,一段局域网路的写法,通常是将 network IP 与 netmask 写在一起, 另外,netmask 除了用 10 进位来写出数值之外,还可以用『共有几个 Net ID 的个数』来撰写!以上面为例, netmask 在 Net ID 的部份,共占有 24 个比特,所以,最终可以写成这样:

整组区网的写法 : 192.168.0.0/255.255.255.0  ==> netmask 用 10 进位
整组区网的写法 : 192.168.0.0/24             ==> netmask 用 bit 数
netmask        : 255.255.255.0
network IP addr: 192.168.0.0
broadcast addr : 192.168.0.255
可用 IP 范围   : 192.168.0.1 ~ 192.168.0.254

上面的整组局域网路的写法中,未来我们会在防火墙或者是其他的服务器软件设置当中使用到!所以,要非常熟悉! 另外,总是思考一下记忆会比较深刻~来来~做一下底下的题目看看:

思考例题:想想看,底下的问题解答是什么?
  • 有个 IP 为 119.231.23.52,请问这个 IP 是 Class A, B, C 的那一个?
  • 承上,那么该 IP 所在的网段理论上,其 (1)Netmask IP, (2)Network IP address, (3)Broadcast address, (4)可用 IP 范围,各别是多少?
  • 承上,有没有可能存在类似 119.231.23.0 这样的『可用 IP』呢?
  • IP address 的种类: Public / Private

接下来要跟大家谈一谈也是很容易造成大家困扰的一个部分,那就是 IP 地址的种类!很多朋友常常听到什么『真实 IP, 实体 IP, 虚拟 IP, 假的 IP....』烦都烦死了~其实不要太紧张啦!实际上,在 IPv4 里面就只有两种 IP 地址的类别,分别是:

  • Public IP (公共 IP 或公开 IP 地址):
    这种 IP 地址必须要从 ISP 申请而来,以学校来说,就是要跟计算机中心申请;以住家来说,就是需要向类似中华电信申请 (要花钱)。 这种 IP 地址可以直接上网,也可以架设网站,全世界都可以直接跟这个 IP 地址连接与沟通。
  • Private IP (私有 IP 或保留 IP 地址):
    当初设计 IPv4 时,缺省保留给内部网络设置用的 IP 地址区段。这种 IP 地址不能直接上网, 需要通过 IP 分享器 (通过 NAT 技术) 后才能够上网。当局域网路还不需要连上 Internet 时,可以使用这种 IP 地址来设置内部设备, 未来有 Internet 的需求,只需要加上 IP 分享器即可。这种 IP 地址所架设的网站,也需要通过 IP 分享器的转递 (port mapping) 后, 才有可能让 Internet 浏览到。

规划私有 IP 地址时,同样根据 Class 的分类,私有 IP 地址也分三个 class 提供给用户或企业来设置规划自己的局域网路, 这三段私有 IP 地址分别如下:

  • Class A:10.0.0.0/8,一组 Class A
  • Class B:172.16.0.0/16, 172.17.0.0/16..., 172.31.0.0/16,共 16 组 Class B
  • Class C:192.168.0.0/24, 192.168.1.0/24..., 192.168.255.0/24,共 256 组 Class C
思考例题:下列哪几个是属于 Private IP address,这种 IP 地址需要通过 IP 分享或伪装才能够连上 Internet
  1. 172.15.1.1/16
  2. 192.28.1.1/24
  3. 10.100.1.1/8
  4. 172.20.1.1/16
  5. 192.168.5.1/24
  6. 61.5.5.1/8
  • 特殊的 Loopback IP 网段

除了 Public / Private IP 地址之外,还有一个网段也是非常特别,当初在设计 IPv4 时,预留一段 Class A 的网段给所有的主机内部使用! 也就是说,几乎所有能够上网的主机,其内部都会有一个 Class A 的网段可以当作内部环境来测试应用!那个就是有名的 127.0.0.0/8 这个网段!在 Linux 的环境下,这个网段还拥有一个特别的网卡,那就是 lo 这张网卡!让我们来看看这个网段:

# 在虚拟机里面,看看 loopback 长怎样?
[vbird@localhost ~]$ ip addr show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

# 测试一下,名为 localhost 的主机名称存在否?
[vbird@localhost ~]$ ping -4 -c 3 localhost
PING  (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.030 ms
....

同时你也可以发现,系统缺省给了一个主机名称 localhost (中文翻译为本机) 对应到 127.0.0.1/8 这个 IP 地址上! 每一部主机都有自己的 127.0.0.1,每一部主机都有内部的 lo 网卡,如果没有特别的防火墙设置与导向,这个 lo 网卡是外网连接不到的! 所以,许多在系统自己内部会用到的网络服务,没有对外开放的,就会启动到 lo 这个界面上! 还记得我们在设置 chronyd 服务时,需要有个 323 的端口口吧?现在再次看看这个端口口的信息看看:

# 再次查看一下 chronyd 启动的 323 端口口,是在哪个界面上?IP 地址又是什么?
[root@localhost ~]# netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State  PID/Program name
udp        0      0 127.0.0.1:323  0.0.0.0:*               617/chronyd
udp6       0      0 ::1:323        :::*                    617/chronyd

从上面看起来,这个 323 端口口其实是在系统内部的 lo 界面上,这个服务开在这边,基本上是挺安全的! 只有你自己连接的到而已!

所以,当有人想要攻击你的主机,并且要你说你主机的 IP 地址时,请告诉对方,你的 IP 地址是 127.0.0.1 就是了! 千万不要迟疑!让对方攻击这个 IP 地址就对了!

4.3.3、无等级 IP 地址 (Classless Interdomain Routing, CIDR)

我们前面谈到,通过 10 进位的 IP 地址的第一组,我们就可以约略知道该 IP 地址的等级是 Class A/B/C 这样。 但是,实务上,我们不可能将整个 Class A 的 Public IP 地址真的只设置为一个局域网路,这样全世界的 IP 地址真的不够用! 所以,子网络的切割就很重要了!而,不是标准等级的局域网路,就被我们称为无等级的 IP 地址,简称为 CIDR 啰!

想像一下,假设你有一组 192.168.0.0/24 的局域网路可以使用,但是你底下有两个团队,这两个团队要求你得要让他们各自拥有独立的网络环境! 那么你可以怎么做?以『台南市、永康区、昆大路、XX号』为例,假设 XX 为 1~200 号,那要分成两群,最简单的方式,就是 1~100 号一组, 101~200 号一组,简单分好!没问题!那子网络的切割是否相同?对啊!完全相同!就对半切,立刻生成两组啦!想法很简单啦! 但是...网域表示怎么说明呢?例如重要的 netmask 要怎么设计呢?

其实很简单啦,将原本的 8 比特 host ID 借一个比特当成 Net ID 即可!让我们用底下的表格来了解一下:

先显示原本的 Class C 网段的 Net_ID 与 Host_ID
11000000.10101000.00000000.00000000      Network:   192.168.0.0
11000000.10101000.00000000.11111111      Broadcast: 192.168.0.255
|----------Net_ID---------|-host--|

切成两个子网络之后的 Net_ID 与 Host_ID 为何?
11000000.10101000.00000000.0 0000000  多了一个 Net_ID 了, 为 0 (第一个子网)
11000000.10101000.00000000.1 0000000  多了一个 Net_ID 了, 为 1 (第二个子网)
|----------Net_ID-----------|-host--|

第一个子网络
Network:   11000000.10101000.00000000.0 0000000   192.168.0.0
Broadcast: 11000000.10101000.00000000.0 1111111   192.168.0.127
           |----------Net_ID-----------|-host-|
Netmask:   11111111.11111111.11111111.1 0000000   255.255.255.128

第二个子网络
Network:   11000000.10101000.00000000.1 0000000   192.168.0.128
Broadcast: 11000000.10101000.00000000.1 1111111   192.168.0.255
           |----------Net_ID-----------|-host-|
Netmask:   11111111.11111111.11111111.1 0000000   255.255.255.128

用文本说明非常痛苦...不过,用上面的表格来解释,大家应该就能比较清楚的了解吧?基本上,大部分的 CIDR 都是把大的切成小的, 所以我们经常说『子网络』啊!所以,netmask 的比特数会长大,例如上面的范例中,我们的 netmask 比特数从 24 长大到 25 这样。 主要是借用原本 host ID 的号码来当 Net ID 的号码而已。那 netmask 25 比特可以得到 255.255.255.128 这个数值! 然后再由 2 进位的方式,分别计算 192.168.0.XX 最后一位,就得到『二进位 0 0000000 = 十进位 0』及『二进位 1 0000000 = 十进位 128』的模样, 所以最终就可以得到 192.168.0.0/25 及 192.168.0.128/25 这两段局域网路了!

  • 一个练习

让我们来做个简单的练习~看看你会不会计算了?有个 IP 地址『 192.168.5.100/26 』,请根据上面 CIDR 的说明, 分别计算出 (1)netmask, (2)Network IP address, (3)Broadcast address, (4)可用 IP 地址范围。

  • 先计算 netmask:
    一般做这种笔算的网络参数运算,大多会先计算 netmask!因为 Net ID 占用 26 比特 (/26),也就是『11111111.11111111.11111111.11000000』, 所以最后一个 byte 的二进位内容会是『 11 000000 』,那就可以推算出十进位 255.255.255.192 这个子网络遮罩的参数了!
  • 再计算第一个 IP 地址,意即是 Network IP address:
    由 192.168.5.100 中,前面 192.168.5 已经是固定不会变度动,而 100 推算成二进位,就会是:『 01100100 』这样, 前面两个比特是 01,所以第四组十进位数值可以得到的第一个 IP 地址就会是『 01 000000 』的样式,计算成为十进位就会是 64 了! 所以得到 192.168.5.64 为其 Network IP address
  • 计算最后一个 IP 地址,亦即 Broadcase address:
    承上 Network IP address 的说明,第四组十进位数值的最后一个 IP 地址就会是『 01 111111 』的样式,计算成为十进位就会是 127 了! 所以 Broadcase address 会是 192.168.5.127。
  • 可用于设置主机的 IP 地址范围:
    介于 network ip address 与 broadcast address 之间的 IP 地址,就是可用的范围!所以会是: 192.168.5.65 ~ 192.168.5.126

计算可用 IP 的偷吃步:以 192.168.5.100/26 来说,因为是占用 2 bits 在第四组十进位,而 2bits 共可以分为 4 种组合,分别是 00, 01, 10, 11,也就是说,可以将最终的 0~255 平均分成 4 段的意思~所以从 256/4 可以得到 64,因此,四段子网络的开头就会是 192.168.5.0, 192.168.5.64, 192.168.5.128, 192.168.5.192,查出 100 在 64 与 128 之间,当然最终的结果就用 192.168.5.64/26 这一段了!

思考例题:
  • 再请尝试计算出 192.168.10.200/27 的 Netmask IP address, Network IP address, Broadcast IP address, 可用 IP address 范围分别是什么?
  • 三段 Private IP 地址的简化

从前面的 Private IP 规划当中,我们会有 1 段 Class A, 16 段 Class B,以及 256 段 Class C,不过,如果我要放行所有的私有 IP 区段, 那么根据标准定义,我得要写出 1+16+256 的防火墙规则~真烦~不过,毕竟这几个 IP 区段是连续的,那么能不能通过 CIDR 简化写法呢?应该是可以的! 其中, 10.0.0.0/8 不用简化了,因为它就是最简的写法...那么 Class C 的区段呢?也很简单,写成 192.168.0.0/16 就可以了! 比较麻烦的应该是 172.16.0.0/16 ~ 172.31.0.0/16 这个数据。

分析一下 Class B 第二组十进位的数值,是从 16 到 31 共 16 个,这也就是 2 的 4 次方,所以看起来就是占用了 4 个比特的意思~ 也就是说,其实第二组十进位只有 4 bits 被用来作为 Net ID 啦!所以总共的 Net ID 应该是『 第一组 8 + 第二组 4 = 12』,当然这一段私有 IP 地址段就应该要写成 172.16.0.0/12 这样才合理!所以最终的三段 Private IP 地址,可以通过 CIDR 简化成为 (括号内为十进位 netmask 数值):

  • 10.0.0.0/8 (255.0.0.0)
  • 172.16.0.0/12 (255.240.0.0)
  • 192.168.0.0/16 (255.255.0.0)

4.3.4、路由概念 (gateway)

我们现在知道局域网路 (LAN) 里面的电脑系统,可以通过网卡间的广播直接进行数据的交流,那如果你要传输的目标主机并非在 LAN 里面呢? 举例来说,你得要连接到 google 去查数据时,这个封包数据会怎么跑?基本上,跟人类的包裹流通一样!你得要将你住家的包裹拿到路口的邮局, 或者是通过路口的便利商店的宅急便之类的店家,填好你的数据后,交由他们的邮差先生去传输~在局域网路内的这个邮局/宅急便, 就是所谓的通信闸 (gateway) 或者是路由器 (router) 了!

也就是说,当你封包传输的目标是在局域网路内,那封包可以直接通过广播,直接交给目的地主机来收取。那当你的封包传输的目标并不在局域网路内, 那这个封包就会通过你自己的路由表 (routing table),发送到缺省的通信闸,由该设备主动帮你传输出去这样!因此, 这个通信闸就是你的局域网路与整个互联网社会连接的重要关卡啦!一般来说,就是我们家里/企业的 IP 分享器啦!

一般来说,路由器的 IP 地址范围通常也是在你的局域网路内,比较常见的路由器 IP 地址,通常是可用 IP 地址范围的最后一个 (或第一个), 这样比较好保留与分辨~由于路由器也在你的局域网路内,所以,只要设置好缺省的路由器地址,你的封包通常就可以自由的在互联网上面流通了。 当然,某些特殊的机制,例如 pppoe 这种通过网络卡拨接的情况,则是通过点对点的连接,比较特别~无论如何, 我们主机系统的网络参数,一定得要有缺省通信闸 (gateway) 才能够连上 Internet 就是了。

  • 观察本机的路由表状态

不论是广播还是通过通信闸传输你主机系统的封包,这个封包的传输,都是通过你本机上面的路由表来进行传输的! 如果路由表设计错误,那你的封包将可能会无法顺利的传输到正确的目的地~那如何观察路由表呢?很简单,通过 route 指令即可:

# 1. 使用 route -n 观察虚拟机的路由表
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 enp1s0
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 enp1s0

上面输出的消息共有 8 个字段,你需要注意的大概是这几个:

  • Destination:其实就是 Network IP address 的意思!
  • Gateway:就是该界面的 Gateway IP 地址,如果是 0.0.0.0,代表直接通过广播,不用额外的 gateway IP 地址。
  • Genmask:就是 Netmask,与 Destination 字段可以组合成为一个局域网路的网域。
  • Flags:旗标,底下是常见的旗标意义:
    • U:代表该路由是可用的
    • G:代表该路由需要通过 gateway 来帮忙转递
    • H:代表路由为一部主机,而非一整段网域的意思。
  • Iface:基本上,就是网络卡界面。

因此,我们知道虚拟机输出的路由表共有两条,先谈比较简单的,也就是开头为 192.168.10.0 那一条:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 enp1s0

这个路由代表的是 192.168.10.0/255.255.255.0 (Destination/Genmask) 的网段,这个网段主要通过 enp1s0 (Iface) 界面发送,目前是可用的 (U Flags),直接通过广播发送 (0.0.0.0, Gateway)。简单的理解完毕,再来看一下另一条路由表:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 enp1s0

这个路由代表的是不特定目标 0.0.0.0/0.0.0.0 (Destination/Genmask),通过 enp1s0 发送,目前可用之外,还需要通过 192.168.10.254 这个通信闸进行转递才行。所以,结合这两条路由,我们就可以知道,除了 192.168.10.0/24 可以直接广播进行消息传递之外, 其他非在这个区网的封包,直接送去 192.168.10.254 之后,就可以不用理会了的意思!

  • 添加/删除路由信息

其实,不一定同一个网段才可以沟通喔!你也可以强迫我们的主机通过自订的路由来与对方进行沟通!不过要注意的是, 很可能网络连接是:『你可以连过去,但是对方连不回来...』!所以,网络设置得要双向都进行好才行啊! 现在,让我们来『手动』调整设计看看,能不能凭空增加/删除某些路由呢?同样简单通过 route 指令来处理即可!

# 1. 在虚拟机上面,针对 192.168.20.0/24 进行直接广播传递信息
[root@localhost ~]# route add -net 192.168.20.0 netmask 255.255.255.0 dev enp1s0

# 2. 在虚拟机上面,针对 192.168.30.5 进行直接广播传递信息
[root@localhost ~]# route add -host 192.168.30.5  dev enp1s0

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 enp1s0
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 enp1s0
192.168.20.0    0.0.0.0         255.255.255.0   U     0      0        0 enp1s0  <==针对网域
192.168.30.5    0.0.0.0         255.255.255.255 UH    0      0        0 enp1s0  <==针对单一主机

# 3. 删除上面两条新建的路由
[root@localhost ~]# route del -net 192.168.20.0 netmask 255.255.255.0 dev enp1s0
[root@localhost ~]# route del -host 192.168.30.5  dev enp1s0

更多详细的用法,请 man route 查找!

  • 使用 traceroute 查找通过的通信闸

有时候,你可能有兴趣针对邮局的邮差到底怎么送货到对方去的路线查找,那你能不能知道你的封包到底是怎么发送到目的地的呢? 我们可以通过 traceroute 来追踪一下。不过,目前很多通信闸的防火墙,有关闭追踪的功能,因此,许多通信闸你无法查找! 那也是正常的。通常我们可以通过简单的 ICMP 查找比较没有问题,如果担心出状况,也能够使用 UDP (port 53) 来做简单的查找! 比较不会卡住太久!

# 在虚拟机上面,查找你到 168.95.1.1 这部系统中间,到底经过几个通信闸?
[root@localhost ~]# yum -y install traceroute
[root@localhost ~]# traceroute -I 168.95.1.1 -n
 1  192.168.10.254  0.161 ms  0.139 ms  0.137 ms
 2  192.168.201.254  0.357 ms  0.356 ms  0.355 ms
 3  172.20.168.254  1.348 ms  1.534 ms  1.744 ms
 4  * * *
 5  120.114.50.201  1.099 ms  1.141 ms  1.152 ms
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  168.95.1.1  2.430 ms  2.428 ms  2.426 ms

[root@localhost ~]# traceroute -U 168.95.1.1 -n
 1  192.168.10.254  0.258 ms  0.221 ms  0.194 ms
 2  192.168.201.254  0.268 ms  0.232 ms  0.219 ms
 3  172.20.168.254  1.155 ms  1.222 ms  1.322 ms
 4  * * *
 5  120.114.50.201  0.982 ms  0.972 ms  0.974 ms
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  168.95.1.1  2.429 ms  2.546 ms  2.333 ms

中间通过数个关卡之后,才能够到答 168.95.1.1。因为某些通信闸没有放行查找的功能,因此就如同上表的数据, 会出现 * 的符号!否则,通常会有检测的数据出现!你也就能知道你的封包大致上通过哪些通信闸了!

4.3.5、IPv6 地址认识

IPv4 的网络地址已经发放完毕了,目前新兴国家或新的 ISP 若想要取得 IPv4 的话,就只能向其他已经申请的人购买~不过应该还是不够用的! 因为现在连手机等行动设备,还有 IoT 的侦测器与收集器都需要用到互联网,这也都需要 IP 地址的!所以,没有新的 IP 地址来源,那就惨了! 因此,IPv6 就这样产生啰!IPv6 当然还有很多额外的功能,不过,在这里我们只是介绍 IPv6 的网络地址计算/设计方式而已喔!

IPv6 跟 IPv4 一样都在网络层 (Layer 3),使用的 IP 封包也差不多,只是表头数据与相关功能比较不同。相关功能这里就不说明, 要强调的是 IPv6 使用了 128bits 来作为 IP 地址使用~也就是说 IPv4 用 32 个 0 与 1 排列来展示地址,而 IPv6 用了 128 个 0 与 1 排列来展示地址。 因为用到 128 个 0 与 1 的组合,实在没办法简单的写下来二进位的列表...好长啊~

为了简化地址长度, IPv4 是转 2 进位为 10 进位,而 IPv6 则是转 2 进位成为 16 进位 (2 的 4 次方),因此 128bit/4bit = 32 个 16 进位的数字! 所谓的 16 进位指的是 0, 1 ... 9, a, b, c, d, e, f ,其中 f 代表的就是 15 的意思,那每 4 个 16 进位的数字 (2 bytes) 分别做一个区隔, 因此就有 32/4 = 8 组各 4 个 16 进位的数值,最小与最大就分别是:

  • 0000:0000:0000:0000:0000:0000:0000:0000
  • FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

如上所示,用冒号 (:) 隔开共 8 组,每组里面有 4 个 16 进位的数值,每一组最小是 0000,最大则是 FFFF。

  • IPv6 的 IP 地址简化表示法:

如上所示,虽然 IPv6 的 128 比特由二进位改由十六进位的数字来简化,不过毕竟还是有 32 个数值,真的还是太长了! 毕竟 IPv4 也才 32 比特~而且设计成为 4 组十进位而已~IPv6 光是十六进位数值,就有 32 个,想到就头疼了! 所以,IPv6 的地址是允许做一些简化的写法的!简化写法的规则说明如下:

  • 在同一个冒号之间的数值,若为连续的 0,则只填一个 0 即可,例如『 :0000: 』可写成『 :0: 』
  • 在同一个冒号区间的数值,左边高比特若为连续的0,则可以简化略过不写,例如『 :002a: 』可写成『 :2a: 』
  • 连续(含)一个以上的 :0000: 时,可以使用 :: 来取代,但只能保留一组 :: 的存在。

如下所示,第一行为标准的 IPv6 的 IP 地址写法,第二行则符合上述第 2 点,连续的 0 可以简化,第三行则符合上述的第 3 点,超过一个以上的 :0000: 时, 可以使用 :: 来取代,但是只能保留一组,所以第三行右侧的 :0:0 就不能继续简化了 (通常保留左侧高位的数值)

  • 原本的样式:FE80:1234:5678:0000:0000:0010:0000:0000
  • 先简化一次:FE80:1234:5678:0:0:10:0:0
  • 再次简化后:FE80:1234:5678::10:0:0
  • IPv6 的子网络遮罩 (Netmask)

就跟 IPv4 的 IP address 一样具有区网的 netmask,IPv4 同样也有自己的区网所需要指定的 Netmask,只是...这个 IPv6 的 netmask 就没道理还要用 IP 吧?当然是直接使用 bit 来展示即可!一般来说,IPv6 的 netmask 通常使用 64bit 作为局域网路的划分,不过就如 IPv4 的无等级 IP (CIDR) 一样,你当然也能够指定自己的 Netmask 啰。由于 IPv6 是以 16bit 为一个 IP 地址区段分隔,因此 netmask 也通常就是 16 的倍数,这样才能够定位在冒号的位置上!就跟 IPv4 以 8 为倍数一样,比较好计算。底下以『 2001:0db8:: 』 这个网段来说明:

  • Netmask 为 32 bit 时:
    • Network IP: 2001:0db8:0000:0000:0000:0000:0000:0000
      • 可以简化为: 2001:db8::
    • Broadcast IP: 2001:0db8:ffff:ffff:ffff:ffff:ffff:ffff
    • 网域表示方式:2001:db8::/32
  • Netmask 为 64 bit 时:
    • Network IP: 2001:0db8:1234:5678:0000:0000:0000:0000
      • 可以简化为: 2001:db8:1234:5678::
    • Broadcast IP: 2001:0db8:1234:5678:ffff:ffff:ffff:ffff
    • 网域表示方式:2001:db8:1234:5678::/64
  • 只用于区网且只与网卡卡号有关的 Link Local Address 的 IPv6 地址

为了简化局域网路内部的 IPv6 之 IP 地址设置,因此 IPv6 规划的时候,有提出一个名为局域网路链接地址 (Link Local Address) 的 IPv6 地址设置方式!规划的数据其实很简单,就是:

  • 提供 fe80::/10 的区段给 LAN 使用
  • 且最后的 64 比特 (最后 4 组地址数值) 使用网卡卡号来计算
  • 同时能使用的区网为 64bit 的设计

因此最终会有 fe80::/64 这一段的区网来使用喔!让我们来瞧瞧虚拟机里面,缺省的 IPv6 地址长怎样?

[root@localhost ~]# ip addr show
....
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.52/24 brd 192.168.10.255 scope global dynamic noprefixroute enp1s0
       valid_lft 2861sec preferred_lft 2861sec
    inet6 fe80::5054:ff:feed:63aa/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

使用网络卡本身的局域网路链接地址时,在网址最后,得要使用『 %网卡名称』的方式来处理, 否则应该会无法使用该 IPv6 的 IP 地址~我们来自己测试一下这个 IPv6 的地址能否自己 ping 到自己? 处理的方式如下:

[root@localhost ~]# ping -c 3 fe80::5054:ff:feed:63aa%enp1s0
PING fe80::5054:ff:feed:63aa%enp1s0(fe80::5054:ff:feed:63aa%enp1s0) 56 data bytes
64 bytes from fe80::5054:ff:feed:63aa%enp1s0: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from fe80::5054:ff:feed:63aa%enp1s0: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from fe80::5054:ff:feed:63aa%enp1s0: icmp_seq=3 ttl=64 time=0.045 ms

所以,你会看到所有自动产生的 IPv6 的 IP 地址都是 fe80 开头的!这是由操作系统根据网卡卡号自动计算产生的喔! 再说一次,不能够直接对外连网,只能在局域网路内部互相链接而已喔!

  • IPv6 的 private IP (Unique Local Address) 与 public IP (Global Unicast Address)

与 IPv4 的 private IP 类似,IPv6 也提供一段的 IP 地址来给区网使用,使用的区段为 FC00::/7,亦即开头为 FC00:: ~ FDFF:: 之间的 IP 段落。 目前较常使用 FD00::/8 这一网段。

至于 public IP 则使用 2000::/3 (2000:00 ~ 3FFF::) 这一大段,与 IPv4 的 public IP 一样,你的 IPv6 地址得要从你的 ISP 处取得, 才能够顺利的以 IPv6 的 IP 地址连上 Internet 的。那么有没有哪一段 Public IP 可作为测试的区段呢? 有的,那就是 2001:0db8::/32 这一大段 IP 地址可以提供给测试范本 (example) 使用,亦即是,你可以使用这一段 IP 地址来测试你的 IPv6 网络啰! 所以,基本上,大家在测试环境时,似乎大部分使用 2001:0db8::/32 来处置,倒不是使用 FD00::/8 来设置呢!

4.4、Layer 4 的相关协定

通过网络层的 IP 地址以及 IP 封包,顺利的将包裹送到目标主机上头去,接下来,这个封包要不要被接受? 这个封包要交给谁来处理?那就是发送层的任务之一。从 图 4.1.4-1 我们可以看到发送层有两个重点, 一个是连接导向的 TCP 封包,一个是非连接导向的 UDP 封包,这两个封包很重要啊!数据能不能正确的被送达目的, 与这两个封包有关喔!

4.4.1、可靠连接的 TCP 协定

TCP 封包被称为可靠连接导向的封包,为什么它可靠呢?这是因为 TCP 的表头数据比较丰富!有比较多的检测信息在里面。 相关的表头有点像这样:

4 bits 6 bits 6 bits 8 bits 8 bits
Source Port Destination Port
Sequence Number
Acknowledge Number
Data
Offset
Reserved Code Window
Checksum Urgent Pointer
Options Padding
Data
图 4.4.1-1、TCP 封包的表头数据

我们只讲比较有趣的项目,包括底下这几个:

  • Source Port & Destination Port (来源端口口 & 目标端口口)
    如果说 IP 地址是地址,那么 TCP 的端口口 (port) 就是该地址上面的楼层!每个连接的 server / client 两端互相沟通时, 就是通过这个端口口号码来进行正确目标的连接处理。以网页服务器与浏览器来说,网页服务器需要先启动一个例如 port 80 的端口口, 然后用户端使用随机的一个端口口 (Source port) 连接到网页服务器的 80 号端口口 (Destination port),server/client 通过这条『信道』就可以传输数据了。
  • Sequence Number (封包序号)
    由于 TCP 封包必须要带入 IP 封包当中,所以如果 TCP 数据太大时(大于 IP 封包的容许程度), 就得要进行分段。这个 Sequence Number 就是记录每个封包的序号,可以让收受端重新将 TCP 的数据组合起来。
  • Acknowledge Number (回应序号)
    为了确认主机端确实有收到我们 client 端所送出的封包数据,我们 client 端当然希望能够收到主机方面的回应,那就是这个 Acknowledge Number 的用途了。 当 client 端收到这个确认码时,就能够确定之前传递的封包已经被正确的收下了。(所以,通常回应序号会使用序号+1的方式做编号)
  • Code (Control Flag, 控制标志码)
    当我们在进行网络连接的时候,必须要说明这个连接的状态,好让接收端了解这个封包的主要动作。 这可是一个非常重要的控制码喔!这个字段共有 6 个 bits ,分别代表 6 个控制码,若为 1 则为启动。分别说明如下:
    • URG(Urgent):若为 1 则代表该封包为紧急封包, 接收端应该要紧急处理,且图 4.4.1-1 当中的 Urgent Pointer 字段也会被激活。
    • ACK(Acknowledge):若为 1 代表这个封包为回应封包, 与上面提到的 Acknowledge Number 有关。
    • PSH(Push function):若为 1 时,代表要求对方立即发送缓冲区内的其他对应封包,而无须等待缓冲区满了才送。
    • RST(Reset):若为 1 的时候,表示连接会被马上结束,而无需等待终止确认手续。这也就是说, 这是个强制结束的连接,且发送端已断线。
    • SYN(Synchronous):若为 1,表示发送端希望双方创建同步处理, 也就是要求创建连接。通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。
    • FIN(Finish):若为 1 ,表示发送结束,所以通知对方数据传毕, 是否同意断线,只是发送者还在等待对方的回应而已。
    其实每个项目都很重要,不过我们这里仅对 ACK/SYN 有兴趣而已,这样未来在谈到防火墙的时候,你才会比较清楚为啥每个 TCP 封包都有所谓的『状态』条件!那就是因为连接方向的不同所致啊!底下我们会进一步讨论喔! 至于其他的数据,就得请您自行查找网络相关书籍了!
  • Socket Pair 与特权端口口 (Privileged Ports)

在上图的 TCP 表头数据中,我们最需要知道的就属那 16 比特的 Source port 与 Destination port。由于是 16 比特,因此目标与来源端口口范围在 0 ~ 65535 号 (2 的 16 次方)! 由于网络是双向的,要达成连接的话得要服务器与用户端均提供了 IP 地址与端口口才行。 因此,我们常常将这个成对的数据称之为 Socket Pair 了!

  • 来源 IP + 来源端口口 (Source Address + Source Port)
  • 目的 IP + 目的端口口 (Destination Address + Destination Port)

由于 IP 地址与端口口常常连在一起说明,因此网络寻址常常使用『 IP:port 』来说明,例如想要连上鸟哥的网站时, 正确的鸟哥网站写法应该是:『 linux.vbird.org:443 』才对!但是,不对啊!明明我们在浏览器上面输入的网址应该只是:『 http://vbird.org.cn 』而已,并没有输入 port 号码!这是因为大家都知道 https 需要连接到 port 443 的意思! 这种大家都熟知的端口口,就称为 well-known port,这种端口口通常会设计在 0~1023 之间的号码,而由于服务器网络服务通常仅有 root 能唤醒,所以 0~1023 之间的端口口,就被我们称为特权端口口(只有 root 可以唤醒使用)。而特权端口口与其服务名称的对应,我们 Linux 通常写在 /etc/services 文件内喔!底下鸟哥列出几个常见的 port number 与网络服务的对应:

一般常见端口口号码 (port number) 对应的服务
连接端口口服务名称与内容
20FTP-data,文件传输协定所使用的主动数据传输端口口
21FTP,文件传输协定的命令信道
22SSH,较为安全的远程连接服务器
23Telnet,早期的远程连接服务器软件
25SMTP,简单邮件传递协定,用在作为 mail server 的端口口
53DNS,用在作为名称解析的领域名称服务器
80WWW,这个重要吧!就是万维网服务器
110POP3,邮件收信协定,办公室用的收信软件都是通过他
443https,有安全加密机制的WWW服务器
    TCP 封包的三向交握 (Three-way handshake)

TCP 被称为可靠连接导向,其连接主要是通过许多机制来达成的,其中最重要的就是三向交握的功能。当然, TCP 发送数据的机制非常复杂,有兴趣的朋友请自行参考相关网络书籍。那么如何借由 TCP 的表头来确认这个封包有实际被对方接收,并进一步与对方主机达成连接?我们以底下的图标来作为说明:

TCP 的三向交握
图 4.4.1-2、TCP 的三向交握示意图

图标中 Server / Client 往下方的箭头代表的是时间轴,要达成连接之前,需要通过三次确认的动作,也因此这个行为就被称为三向交握 (Three-way handshake)。我们根据上图的 A, B, C, D 四个阶段来简单说明一下:

  • A:封包发起状态,TCP 封包带有 SYN 旗标,假设序号为 10001 号
    当用户端想要对服务器端连接时,就必须要送出一个要求连接的封包,此时用户端必须随机取用一个大于 1024 以上的端口口来做为程序沟通的接口。然后在 TCP 的表头当中,必须要带有 SYN 的主动连接旗标(SYN=1),并且记下发送出连接封包给服务器端的序号 (Sequence number = 10001)
  • B:封包接收并发送确认封包,TCP 封包同时带有 ACK 与 SYN 旗标,假设序号 20001,回应序号为 10001+1
    当服务器接到这个封包,并且确定要接收这个封包后,就会开始制作一个同时带有 SYN=1, ACK=1 的封包,其中那个 acknowledge 的号码是要给 client 端确认用的,所以该数字会比(A 步骤)里面的 Sequence 号码多一号 (ack = 10001+1 = 10002), 那我们服务器也必须要确认用户端确实可以接收我们的封包才行,所以也会发送出一个 Sequence (seq=20001) 给用户端,并且开始等待用户端给我们服务器端的回应喔!
  • C:送出确认封包,TCP 封包带有 ACK 旗标:
    当用户端收到来自服务器端的 ACK 数字后 (10002) 就能够确认之前那个要求封包被正确的收受了, 接下来如果用户端也同意与服务器端创建连接时,就会再次的发送一个确认封包 (ACK=1) 给服务器,亦即是 acknowledge = 20001+1 = 20002 啰。
  • D:取得最后确认
    若一切都顺利,在服务器端收到带有 ACK=1 且 ack=20002 序号的封包后,就能够创建起这次的连接了。
鸟哥上课谈到 TCP 最常做的事就是,叫一个同学起来,实际表演三向交握给大家看!
1. 鸟哥说:甲同学你在不在(SYN)?
2. 甲同学说:我在(ACK)!那鸟哥你在不在(SYN)?
3. 鸟哥说:我也在(ACK)
此时两个人就确认彼此都可以听到对方在讲啥,这就是可靠连接啦! ^_^

4.4.2、非连接导向的 UDP 协定

UDP 的全名是:『User Datagram Protocol, 用户数据流协定』,UDP 与 TCP 不一样, UDP 不提供可靠的传输模式,因为他不是连接导向的一个机制,这是因为在 UDP 的发送过程中,接受端在接受到封包之后,不会回复回应封包 (ACK) 给发送端,所以封包并没有像 TCP 封包有较为严密的检查机制。至于 UDP 的表头数据如下表所示:

16 bits 16 bits
Source Port Destination Port
Message Length Checksum
Data
图 4.4.2-1、UDP 封包的表头数据

TCP 封包确实是比较可靠的,因为通过三向交握嘛!不过,也由于三向交握的缘故, TCP 封包的传输速度会较慢。至于 UDP 封包由于不需要确认对方是否有正确的收到数据 (射后不理),故表头数据较少,所以 UDP 就可以在 Data 处填入更多的数据了。同时 UDP 比较适合需要即时反应的一些数据流,例如图像即时发送软件等,就可以使用这类的封包发送。也就是说, UDP 传输协定并不考虑连接要求、连接终止与流量控制等特性,所以使用的时机是当数据的正确性不很重要的情况,例如网络摄影机!

那么上课时怎么介绍 UDP 呢?很简单喔!鸟哥就会说:『现在老师就是在进行 UDP 的发送,因为老师一直讲一直讲, 俺也没有注意到你有没有听到,也不需要等待你的回应封包!就这样一直讲!当然,你没有听到鸟哥讲啥,我也不会知道...』

4.5、网络基础与上网参数取得

从上面的解释,我们大概理解了某些网络基础,也大致知道了 IPv4 地址以及端口口号码的意义等等。但是, 到底那是什么东西?然后,听人家说被值入木马可能会被开后门?那前门在哪里?而,这些网络参数 (IP address, Netmask, Gateway..) 在你的主机上面是如何取得的?就让我们好好说一说。

  • Layer 2, 3, 4 与邮务系统比对

我们大概知道网络基础就是所谓的 OSI 七层协定里面的 Layer 2, 3, 4 这三层,这三层的重点封包协定主要是 MAC, IP, TCP 与 UDP 等。 然后,这三层封包上面最重要的表头数据,分别是网卡卡号、IP 地址、端口口号码,而网卡卡号与硬件相关性较高,IP 地址与端口口号码, 则是软件设置来的!可以随时修改。基本原理是这样,那...到底什么是什么?能不能用小学生知道的语言来解释?

相对于『软件』与『硬件』来说,网卡卡号 (MAC address) 比较偏向硬件,基本上,网卡卡号应该是不变的。 那么 IP 地址是我们可以通过软件去设置调整的,因此 IP 地址当然是比较偏向软件设置,是可调整的。所以,简单的说:

  • 网卡卡号可以想成是我们家与邮局的实际地理位置,道路可以看成是一个 switch ,连接两个网卡 (实际的地理条件)。
  • 至于 IP 地址,则是门牌!就是我们家 (client) 与邮局 (server) 的门牌号码,门牌可以通过申请来修改!

所以,你就知道网卡卡号与 IP 地址的差异了!那 port 是什么?现在幻想一下,你从你家走路到邮局 (MAC address),看到门牌号码 (IP address) 之后,确定是该家邮局没问题,然后进到邮局内部,看到很多的窗口 (port),每个窗口的服务都不一样,有汇款的、有邮寄、有信用卡业务的等等 (well-known port)。 是的,你应该可以幻想成这样:

  • 端口口号码可以想成是在该邮局里面的窗口号码,而某些特定的窗口号码会有约定俗成的固定的服务。

但是,这些窗口不见得有激活,因为某些窗口里面没有服务人员 (process/service 进程),有服务人员的, 这才是有激活的端口口。

有个路人,偷偷跑到信用卡业务的窗口上,这时,信用卡窗口就打开了 (port open),但是实际的邮局人员并不认识这个路人, 这就是所谓的被值入后门程序,值入这个后门程序就被启动了一个端口口。那怎么关闭这个错误的人激活的端口口呢? 很简单啊!把这个人赶走 (kill -9) 就好!也就是说,启动端口口与窗口本身无关,是『谁』在这个窗口的位置提供服务, 这才是重点!所以我们才会说,将软件 (尤其是服务器软件) 升级到最新,更新到没有错误的版本上,那在窗口那个位置上的人, 就比较不容易被攻陷啊~这也就是说:

  • 端口口的激活与否,可以想成窗口里面那个提供服务的人员,窗口里面有人,窗口就是激活的,无论这个人是否是正常的...
  • 主机名称与 DNS 系统

等等!不对啊!我们上面谈到的都是 TCP/IP 的连网方式,也就是说,你得要知道 IP 地址才能够连接到 server 来使用对方的服务。 但是,你实际使用互联网连上 Internet 的时候,真的有在网址列输入过 IP 地址嘛?没有吧!你应该都是输入类似: http://vbird.org.cn 这样的主机名称的方式吧!这代表什么呢?应该是有一个特别的服务会提供你将主机名称转换成为 IP 地址的方式才对! 这就是非常重要的 DNS 系统!

你的网络参数里面一定会有一个以上的 DNS 服务器 IP 地址的设置,这个 DNS 服务器 IP 地址就会在你需要将主机名称转成 IP 地址时, 主动的帮你进行转译,如此一来,你只需要输入大家比较容易记忆的英文主机名称,这个 DNS 服务,就会主动帮你转成 IP 地址, 然后你使用的软件,就可以直接连接到该 IP 地址上~简单处理完毕!我们确实用 TCP/IP 上网,但是那个 IP 地址使用的是 DNS 服务! 更多的 DNS 说明,我们会在第三部份互联网服务里面谈到,目前你只需要知道,DNS 服务器的目的就是在让你可以使用主机名称代替 IP 地址!

  • 连上 Internet 必要的网络参数

从上面的所有说明当中,我们知道一部主机要能够使用网络,必须要有 IP 地址,而 IP 地址的设置当中,就必须要有 IP address, Network IP address, Broadcast address, Netmask 等参数,此外,还需要考虑到路由里面的 Default Gateway 才能够正确的将非同网域的封包给他发送出去。另外,考虑到主机名称与 IP 地址的对应,所以你还必须要给予系统一个 DNS 服务器的 IP 才行~ 所以说,一组合理的网络设置需要哪些数据呢?

  1. IP/Netmask:这个组合还包含自动计算出来的 Network IP, Broadcast IP 地址等。
  2. Gateway IP address
  3. DNS IP address
  4. 一个好记的主机名称 (缺省通常是 localhost)

必要的是前面三项,最后一项只是让你在登录系统的时候,可以有比较清楚且有意义的主机名称,避免你登录到错误的系统啰!

思考例题:假设你有一个局域网路是 Class C 的 192.168.1.0/24,而你想要用最后一个可用 IP 地址当成 gateway, 且使用中华电信的 168.95.1.1 当成 DNS 服务器的服务 IP 地址,那么第一个可用 IP 地址拿来当用户端电脑的设置时, 上面三个需要的设置值就会是:
  • IP: 192.168.1.1/24
  • GW: 192.168.1.254
  • DNS: 168.95.1.1
  • 网络参数的取得方式

上面这三个数值要怎么取得呢?意思是,你的主机是怎么拿到这三个数值的?基本上可以这样取得与设置:

  • 直接手动设置 (manual, static):
    你可以直接向你的网管人员询问可用的网络参数,然后使用 nmcli 之类的软件来设置好你的网络。这种方式常见于校园网络中, 以及向你的 ISP 申请固定 IP 地址的连接环境。
  • 自动取得网络参数 (auto, DHCP):
    在局域网路内会有一部主机负责管理所有电脑的网络参数,你的主机开机时就会主动向该服务器要求相关的网络参数, 若取得网络相关参数后,你的主机就能够自行设置好所有服务器给你的网络参数了。 最常使用于企业内部、IP 分享器后端、校园网络与宿舍环境,及缆线宽带 (第四台的信号线) 等连接方式。
  • 通过拨接取得 (pppoe):
    向你的 ISP 申请注册,取得帐号密码后,直接拨接到 ISP ,你的 ISP 会通过他们自己的设置,让你的操作系统取得正确的网络参数。 此时你并不需要手动去编辑与设置相关的网络参数啦。目前台湾的 ADSL 拨接、光纤到大楼、光纤到府等,大部分都是使用拨接的方式。

不管是使用上面哪种方式取得的网络参数,你的 IP 地址都只有所谓的『 Public 与 Private IP 』而已! 而其他什么浮动式、固定制、动态式等等有的没有的,就只是告诉你这个 IP 地址取得的方式而已。 举例来说,台湾地区光纤拨接后取得的 IP 地址通常是 public IP,但是鸟哥曾接到香港网友的来信,他们拨接后,取得的 IP 地址是 Private 呢!所以导致无法架设网站喔!

另外,目前我们手边应该都有很多平板、手机、笔电等可携式设备,而目前的无线网络应用非常的广泛!所以, 我们的电脑系统也经常使用无线 AP (Access Point) 进行网络连接。无线 AP 基本上就是一部通信闸, 只是这个通信闸通过的是无线的 wifi 技术来达成以太网路连接而已!基本上无线 AP 大概就是使用 DHCP 自动取得网络参数的方式提供用户网络啰!

参考数据

修改历史:
  • 2023/08/09:在 2022 年暑假写了 2/3 的数据,因为新冠确诊以及后续学校课程的缘故,让这篇文章延迟了一年...去年思考的想法都被今年否决...写的真辛苦...
2023/08/09以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计