[Linux基础] 03、Linux的网络配置

上一篇我们介绍了如何安装 Linux 以及介绍关于 Linux 的终端。这一篇主要介绍如何设置 Linux 的网络。

1、集线器、网桥、交换机

      主机与主机之间进行通信的时候是需要介质传递信息的,就像人与人之间交流需要空气充当介质,因为你说的话是信息,而传递信息则需要空气作为载体介质进行传播。就目前而言,主机与主机之间传递信号的介质有有形的也有无形的,例如有形的网线,无形的则是电磁波。

      在计算机网络诞生的初期,那个时候使用最多的是同轴线缆。也就是闭路电视的那种线,但是一根线只有两个头,一端连接一个主机只能连接两台主机,所以还有一种叫做T型头的东西。

       上图就是同轴电缆和T型头。将两者结合起来使用,一根线就可以接入很多主机了。所以早期的网络架构可能就是下面这样的:


      就像上图一样,多台主机连接到一根总线(同轴电缆)上,然后使用T型头接入,这种网络拓扑也叫做总线型网络。但是我们得思考一个问题,如果 A 与 B 进行通信的时候,那么 C 与 D 可以进行通信吗?

      答案显然是不可能的,因为他们只有一根线,所有主机共用了这么一个底层通信信道。A 与 B 通信的时候,必然会导致总线上有电流,那么在同一时刻 C 与 D 就不能通信了,不然会相互干扰。导致整个网络充满的都是混乱信息,没有任何意义。但是我们如何保证 A 发送信息的时候,C 不发送信息呢?我们需要引入一种机制,就是 MAC (Media Access Control)机制,中文翻译过来就是介质访问控制。

      MAC 机制有很多种,其中一种就是 CSMA/CD。其工作机制简单来说就是 A 在发报文的时候先看看当前网络是否繁忙,如果发现当前线路没有信号传输,那么就开始发送信息,并且边发送边检测。如果检测到发送失败,就后退一步,将之前发送的信息再次发送。所以 CSMA/CD 有个专业叫法:带冲突检测的载波监听多路访问技术。而我们常说的 MAC 地址,就是指在 MAC 协议下通讯时使用到的通讯地址。一般而言 MAC 地址是固化在网卡中,专注于数据链路层,将一个数据帧从一个节点传送到相同链路的另一个节点。

      对于这种总线型的网络有一个比较麻烦的地方就是如果你想添加一台主机,那么你就需要加一个T型头。添加移除主机挺麻烦的。所以就出现了这么一种设备,这个设备上事先做好了几个口留着,你想用的时候直接插入网线就行了,到了这个时候的网络拓扑可能就是所谓的星型网络,大致就是如下这种结构:


      上图中间的这种事先预留了网线口的这种设备我们叫他 HUB 中文翻译就是集线器,这种设备的好处就是可以很方便的接入一台主机,因为他已经事先做好了网线接入口了。但是他的本质仍然是总线型的,因为 A 与 B 通信的时候,占用了 HUB 内的通信信道,导致了其他主机仍然不能通信,他只是将总线型网络从物理形态的一根线转变成了一个具有多个网线口的盒子,并同时提供了信号放大的功能。

      科技总是不断的进步,一开始的时候一个网络中连接几台主机传输少量数据 HUB 还是能轻松处理的,后来网络中主机越来越多,传输的数据量按照指数型暴增,想想如果一个网络中有两台电脑之间在传一个小电影,那么完了大家都等待吧,因为同一时刻这种网络只能有两台主机通信,其他主机通信时需要不断检当前网络是否繁忙,所以可能更多的情况下网络中的信号都是检测信号。于是有人想出了这么一个办法,把 HUB 内部做成四通八达的线路,当两台主机之间需要通信的时候,就临时建立一条通信信道,例如当 A 与 B 通信的时候,就在 A 与 B 之间建立一条线路,C 与 D 通信时就再在 C 与 D 之间建立一条线路,这样一来他们之间互不干扰可以独立工作了。而这种分隔冲突域的设备我们把它称之为网桥

      因为在早些时候,网络之间连接是使用 HUB 连接的,这样的网络如果有两台主机进行通信时,其他的主机就不能通信,否则就会冲突。我们把所有能够造成冲突的主机组成的一个集合叫做冲突域。网桥的主要作用是用来分隔冲突域的。例如一开始有一个网络里面有 10 台主机,他们之间使用 HUB 连接工作良好,如果再加 10 台,就是 20 台,那么任意两台之间发送信息,剩下的 18 台就不能通信了。所以将 20 台主机分成两组,中间使用网桥连接起来就可以大大提高通信质量。


      就像上图,其中 A 和 B 是在一个冲突域中的,因为他们使用了同一个底层通信线路,而 C 与 D 是在另外一个冲突域中的,这样 A 与 B 通信的时候,C 与 D 就可以通信了,只有当 A 与 C 通信时就通过网桥建立临时通道。也许你会想,既然网桥这么好用,如果在上面多做几个孔,每个孔连接一个主机,然后把 HUB 给去掉,这样岂不是可以把冲突域分割到最小了?是的,目前而言这种多孔的“网桥”十分常见,我们一般叫他交换机,一般而言有 8 孔的,24 孔的等。

      于是乎,在这种情况下我们又平安无事的用了一段时间,但是你需要知道的是人的欲望是永远无法满足的。随着计算机越来越普及,传输的数据也越来越多,一个交换机上连接的电脑越来越多,你见过的交换机最多多少口呢?48 孔不得了了,那么如果需要接入 100 台主机怎么办?其实也不难,多个交换机连起来用呗,就像下面这样:


      但是多台主机通过交换机连接到一起使用,随着主机数越来越多,就会暴露出一个很严重的问题。我们知道交换机内部的 CPU 会在每个端口成功连接时,通过将 MAC 地址和端口对应,形成一张 MAC 表。在今后的通讯中,发往该 MAC 地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分冲突域。但是问题就出在这里,MAC 表的形成是通过数据链路层进行广播得到的,就是说如果想要知道某个主机连接在哪个端口上,就需要进行广播一下,交换机需要对每个端口连着的主机都挨个问下你的 MAC 地址是多少,试想下全球多少台主机,如果都使用交换机连接,那么网络还能用吗?那为什么交换机会有这个问题呢?这是因为交换机不能划分网络层的广播,也就是广播域。

      什么是广播域呢?就像上图里面两台交换机连在一起的六个主机他们就是一个广播域,如果 A 发个广播,其他主机都能收到,我们把这种其中一台主机发广播,都能收到的主机组成的集合叫做广播域。和冲突域不同,冲突域是其中一台主机发信息,大家都不能发的主机集合,是共用同一个底层通信信道的主机集合。

      那么如何分隔广播域呢?很简单啊,做个设备,如果发现主机发送的报文是本网段内的则这个设备不转发,如果发现主机发送的信息是其他网段内的,则将其转发到对应的网段,而这个设备就是我们生活中常见的路由器。


       如上图,主机 A 与主机 B 通信是很简单的,就像以前一样依靠 MAC 地址通信。但是如何实现主机 A 和 E 的通信呢?他们之间不再一个网段内,交换机发广播查 MAC地址被路由器隔断。好像单纯的使用 MAC 定位定位不到主机 E 了。所以我们需要使用一种新的地址,从逻辑上来 定位主机位置。

      例如,下面这样,左边的我们叫做网段1,并且给每个主机标号为1.1,1.2,1.3等,右边的是网段2,里面每个主机就是 2.1,2.2,2.3等。同时路由器的两个端口也配置一个地址,标记为1.4 2.4

      主机 1.1 与主机 1.2 通信,通过广播交换机能够获取 1.2 的 MAC 地址,两者可以正常通信。当 1.1 与 2.1 进行通信时,1.1发现他想发信息的那台主机是 2.0 网段的,和他不再一个网段内,于是他就将信息直接发给 1.4 ,路由器收到这个请求之后,发现目标地址是另外一个网段内的,于是将其从 2.4 端口转发到 2 号网段,这样一来因为 2.4 和  2.1 是同一个网段内的,可以通过广播获取 MAC 地址,于是正常通信。于是 1.1 就可以与 2.1 通信了。

      于是你会发现 ,为了解决夸网段的问题,我们引入了类似于 1.X 这种分段的地址。这种地址使用点号分隔,点号前面的 1 表示网段编号,点号后面的则是表示对应网段内的主机编号。但是 1.1 和 2.1 通信,1.1 如何知道 2.1 和他不在一个网段内的呢?很简单,使用掩码计算。因为在计算机世界中任何数字和 1 做 & 运算都得本身,而与 0 做 & 运算得 0,我们将上面的地址中表示网段编号的部分的用 1 表示,而表示主机编号的部分用 0 表示,这样通过 & 计算就知道对应的主机是那个网段内的了。

      其实到这里你应该知道了,那个逻辑地址编号 1.X 的就是 IP 地址,而广播询问 IP 地址对应的主机 MAC 地址是多少的行为就是 ARP 地址解析。上面的 1.4 与 2.4 这种能够与外界通信的 IP 地址其实就是网关 IP(关就是边关,和古代的国与国之间的边塞差不多),而掩码其实就是子网掩码。

      例如:IP 是 10.20.139.48 的主机所在网络子网掩码是 255.255.255.0 ,经过运算得知其所在网段是 10.20.139.0 ,而 IP 地址是 10.20.138.11 与子网掩码 255.255.255.0经过运算得知其所在网段是 10.20.138.0,通过比较就知道这是两个网段内的主机。并且,对于表示主机位部分全 0 的IP我们一般叫做网段IP,例如 10.20.139.0就是网段IP,而全 1 的叫做广播IP,例如 10.20.139.255。


2、同一个广播域内两台主机的通信过程

      我们知道两主机要通信传送数据时,就要把应用数据封装成IP包(因为我们的网络大多都是 TCP/IP 的以太网),然后再交给下一层数据链路层继续封装成帧;之后根据  MAC 地址才能把数据从一台主机,准确无误的传送到另一台主机。 
      当 A 要和 B 通信时,假如 A 知道 B 的 IP 但却不知道它的 MAC 地址,那 A 就会发送一个 ARP 的广播请求(里面源 IP 是 A ,目标 IP 是 B 源 MAC 是 A 目标 MAC 是12个 F)给同一广播域中的所有成员,当交换机从自己的端口上收到这个广播包,然后它会读取这个帧的源 MAC 地址和目标 MAC 地址,由于交换机刚启动,它的 MAC 表为空。所以它会把 A 的 MAC 地址与之相对应的端口放到一张表里,这张表就是 MAC 地址表记录了交换机的端口和 MAC 的映射关系。然后他再从别的端口广播这个数据帧,当别的主机收到这个广播时,查看目标 IP 不是自己的,就会丢弃此包。如果 B 接收到这个数据帧,它检查目标 IP 和自己的 IP 是一样的,就会回应这个 ARP 请求,把自己的 IP 和 MAC 封装成源 IP 和源 MAC,A 的 IP 和 A 的 MAC 地址为目标 IP 与目标 MAC,并记录 A 的 MAC 与 IP,放进自己的 ARP 缓存表中。
      此时,这个应答包经过交换机时,交换机会检查源 MAC 目标 MAC,并把 B 的 MAC 和交换机的端口对应信息放进 MAC 地址表中,再查看自己的 MAC 地址表,发现存在目标 MAC 与自己的端口对应信息(A 发信息经过交换机的时候记下的),那它就会直接把这个应答包从对应的端口送出去了。主机 A 收到这个包后发现目标 MAC 是自己,就会处理这个包。并把 B 的 MAC 与 IP 放进自己的 ARP 缓存表中。这时主机 A 就知道 B 的 MAC 地址了,以后要发送数据,就直接把 B 的 IP 与 MAC 封装进帧中进行点对点的发送了。


3、配置 Linux 网络准备

      首先我们明确下目标,我们将要组件的网络如下:

      我们的物理机 Windows 设置 IP 是 172.16.100.1 ,虚拟机 IP 是 172.16.100.XX 其中 XX 为 2-253 之间的任意一个数,表示主机号。
      172.16.100.0:网段 IP ,一般没人用这个 IP。
      172.16.100.1:Windows IP,VMware 默认是将网段内的主机号为 1 的主机设置成物理机的IP,网络设置中选择 VMnet8 可以修改。
      172.16.100.254:我们将这个 IP 设置成网关 IP 了,其他也行。
      172.16.100.255:网段内的广播 IP,同 172.16.100.0 一样是一个特殊 IP。
      在 VMware 中设置网络还是比较简单的,选择【编辑】--》【虚拟网络编辑器】设置 VMnet8 网络,你可以简单的把这个东西当作路由器使用。就当作这是一个路由器,设置他的网关以及子网掩码即可。

4、正式配置 Linux 网络

      还记得我们在第一章里面说的 Linux 的哲学思想吗?一切皆文件!是的,在 Linux 中,如果你想修改网卡的配置,只需要修改对应的文件就行了。Linux 将网卡操作映射成对一个配置文件的操作,我们只需要修改文件里面的内容就可以修改网卡的工作特性。这个文件就是/etc/sysconfig/network-scripts/ifcfg-eth0 vi编辑内容如下:
DEVICE=eth0
HWADDR=00:0C:29:04:30:15
TYPE=Ethernet
UUID=e6edf094-145d-4998-a03b-c9e9f31fa59a
ONBOOT=
yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=172.16.100.98
NETMASK=255.255.255.0
GATEWAY=172.16.100.254

     其中各个参数的含义如下:

DEVICE:此配置文件关联的硬件,对应的值就是 ifcfg- 后面的内容,例如:ifcfg-eth0,对应值就是 eth0
HWADDR:MAC 地址,与真实的 MAC 地址保持一致,可省略
TYPE:此设备类型,Ethernet 表示桥接
UUID:唯一标识,可省略
ONBOOT:是否开机自动启动此网络设备{yes|no}
NM_CONTROLLED:是否接受NetworkManager脚本控制:{yes|no}
BOOTPROTO:引导协议:{none|static|dhcp|bootp}
IPADDR:设置 IP 地址
NETMASK:子网掩码
GATEWAY:网关 IP
DNS1:DNS1服务地址
IPV6INIT:{yes|no} 是否开启 ipv6
USERCTL:{yes|no} 是否允许普通用户操作网卡
PEERDNS:{yes|no} 是否允许DHCP服务分配地址时直接更新/etc/resolv。conf中的DNS服务器地址

      经过上面的配置,执行命令验证是否修改成功:

[root@localhost ~]# service network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: Determining if ip address 172.16.100.98 is already in use for device eth0...
[ OK ]
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:36:FA:FF
inet addr:172.16.100.98 Bcast:172.16.100.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe36:faff/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:91 errors:0 dropped:0 overruns:0 frame:0
TX packets:85 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9843 (9.6 KiB) TX bytes:10539 (10.2 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1028 (1.0 KiB) TX bytes:1028 (1.0 KiB)

[root@localhost ~]#

      从上面红色部分可以看出网络已经设置成我们喜欢的网络了,这个时候可以使用 XSHELL 或者其他 CRT 工具通过模拟终端连接到 Linux 。

5、总结

      这里主要介绍了常见到网络设备,以及网络基础知识。具体详细内容需要参照计算机网络基础,网络很重要,后面的 LVS 以及相关的高可用分布式等需要用到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章