<audio id="audio" title="协议专栏特别福利 | 答疑解惑第二期" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/03/c0/035030be01889cd02f5e909528650bc0.mp3"></audio>

你好，我是刘超。

第二期答疑涵盖第3讲至第6讲的内容。我依旧对课后思考题和留言中比较有代表性的问题作出回答。你可以点击文章名，回到对应的章节复习，也可以继续在留言区写下你的疑问，我会持续不断地解答。希望对你有帮助。

## [《第3讲 | ifconfig：最熟悉又陌生的命令行》](https://time.geekbang.org/column/article/7772)

### 课后思考题

你知道 net-tools 和 iproute2 的“历史”故事吗？

<img src="https://static001.geekbang.org/resource/image/02/ba/02ae5ca5ab1c87bf5fea29196725c0ba.png" alt="">

这个问题的答案，盖同学已经写的比较全面了。具体的对比，我这里推荐一篇文章[https://linoxide.com/linux-command/use-ip-command-linux/](https://linoxide.com/linux-command/use-ip-command-linux/)，感兴趣的话可以看看。

### 留言问题

1.A、B、C类地址的有效地址范围是多少？

<img src="https://static001.geekbang.org/resource/image/eb/c5/ebf13d11cb0bc03d520c6cc4796ee8c5.png" alt="">

我在写的时候，没有考虑这么严谨，平时使用地址的时候，也是看个大概的范围。所以这里再回答一下。

A类IP的地址第一个字段范围是0～127，但是由于全0和全1的地址用作特殊用途，实际可指派的范围是1～126。所以我仔细查了一下，如果较真的话，你在答考试题的时候可以说，A类地址范围和A类有效地址范围。

2.网络号、IP地址、子网掩码和广播地址的先后关系是什么？

<img src="https://static001.geekbang.org/resource/image/25/56/254f28a3623ca8b4ee368ac02f0cf656.png" alt="">

当在一个数据中心或者一个办公室规划一个网络的时候，首先是网络管理员规划网段，一般是根据将来要容纳的机器数量来规划，一旦定了，以后就不好变了。

假如你在一个小公司里，总共就没几台机器，对于私有地址，一般选择192.168.0.0/24就可以了。

这个时候先有的是网络号。192.168.0就是网络号。有了网络号，子网掩码同时也就有了，就是前面都是网络号的是1，其他的是0，广播地址也有了，除了网络号之外都是1。

当规划完网络的时候，一般这个网络里面的第一个、第二个地址被默认网关DHCP服务器占用，你自己创建的机器，只要和其他的不冲突就可以了，当然你也可以让DHCP服务自动配置。

规划网络原来都是网络管理员的事情。有了公有云之后，一般有个概念虚拟网络（VPC），鼠标一点就能创建一个网络，网络完全软件化了，任何人都可以做网络规划。

3.组播和广播的意义和原理是什么？

<img src="https://static001.geekbang.org/resource/image/92/f1/92654ed9549bba6c4e609e256ba083f1.png" alt="">

C类地址的主机号8位，去掉0和255，就只有254个了。

在《TCP/IP详解》这本书里面，有两章讲了广播、多播以及IGMP。广播和组播分为两个层面，其中MAC层有广播和组播对应的地址，IP层也有自己的广播地址和组播地址。

广播相对比较简单，MAC层的广播为ff:ff:ff:ff:ff:ff，IP层指向子网的广播地址为主机号为全1且有特定子网号的地址。

组播复杂一些，MAC层中，当地址中最高字节的最低位设置为1时，表示该地址是一个组播地址，用十六进制可表示为01:00:00:00:00:00。IP层中，组播地址为D类IP地址，当IP地址为组播地址的时候，有一个算法可以计算出对应的MAC层地址。

多播进程将目的IP地址指明为多播地址，设备驱动程序将它转换为相应的以太网地址，然后把数据发送出去。这些接收进程必须通知它们的IP层，它们想接收的发给定多播地址的数据报，并且设备驱动程序必须能够接收这些多播帧。这个过程就是“加入一个多播组”。

当多播跨越路由器的时候，需要通过IGMP协议告诉多播路由器，多播数据包应该如何转发。

4.MTU 1500的具体含义是什么？

<img src="https://static001.geekbang.org/resource/image/0b/3d/0b43a6d8c1b77daef705e6b08f40a43d.png" alt="">

MTU（Maximum Transmission Unit，最大传输单元）是二层的一个定义。以以太网为例，MTU为1500个Byte，前面有6个Byte的目标MAC地址，6个Byte的源MAC地址，2个Byte的类型，后面有4个Byte的CRC校验，共1518个Byte。

在IP层，一个IP数据报在以太网中传输，如果它的长度大于该MTU值，就要进行分片传输。如果不允许分片DF，就会发送ICMP包，这个在[ICMP](https://time.geekbang.org/column/article/8445)那一节讲过。

在TCP层有个MSS（Maximum Segment Size，最大分段大小），它等于MTU减去IP头，再减去TCP头。即在不分片的情况下，TCP里面放的最大内容。

在HTTP层看来，它的body没有限制，而且在应用层看来，下层的TCP是一个流，可以一直发送，但其实是会被分成一个个段的。

## [《第4讲 | DHCP与PXE：IP是怎么来的，又是怎么没的》](https://time.geekbang.org/column/article/8015)

### 课后思考题

PXE 协议可以用来安装操作系统，但是如果每次重启都安装操作系统，就会很麻烦。你知道如何使得第一次安装操作系统，后面就正常启动吗？

<img src="https://static001.geekbang.org/resource/image/8d/c2/8db1eca548b4eaacfd9fbbb544a467c2.png" alt="">



一般如果咱们手动安装一台电脑的时候，都是有启动顺序的，如果改为硬盘启动，就没有问题了。

<img src="https://static001.geekbang.org/resource/image/05/cc/053273db99e6ef2458fcf48a534ac4cc.png" alt="">

好在服务器一般都提供IPMI接口，可以通过这个接口启动、重启、设置启动模式等等远程访问，这样就可以批量管理一大批机器。

<img src="https://static001.geekbang.org/resource/image/8f/09/8f423b7215d40642f8c712250b65b709.png" alt="">



这里提到Cobbler，这是一个批量安装操作系统的工具。在OpenStack里面，还有一个Ironic，也是用来管理裸机的。有兴趣的话可以研究一下。

### 留言问题

1.在DHCP网络里面，手动配置IP地址会冲突吗?

<img src="https://static001.geekbang.org/resource/image/6c/bc/6cd736774a770fe0ca5e6d42ad3425bc.png" alt="">

<img src="https://static001.geekbang.org/resource/image/62/d0/62b7fbe964db964060d501e3ef5252d0.png" alt="">



在一个DHCP网络里面，如果某一台机器手动配置了一个IP地址，并且在DHCP管理的网段里的话，DHCP服务器是会将这个地址分配给其他机器的。一旦分配了，ARP的时候，就会收到两个应答，IP地址就冲突了。

当发生这种情况的时候，应该怎么办呢？DHCP的过程虽然没有明确如何处理，但是DHCP的客户端和服务器都可以添加相应的机制来检测冲突。

如果由客户端来检测冲突，一般情况是，客户端在接受分配的IP之前，先发送一个ARP，看是否有应答，有就说明冲突了，于是发送一个DHCPDECLINE，放弃这个IP地址。

如果由服务器来检测冲突，DHCP服务器会发送ping，来看某个IP是否已经被使用。如果被使用了，它就不再将这个IP分配给其他的客户端了。

2.DHCP的Offer和ACK应该是单播还是广播呢？

<img src="https://static001.geekbang.org/resource/image/2c/b0/2c3c71b16ffca3442ffb60c36de8dcb0.png" alt="">

<img src="https://static001.geekbang.org/resource/image/a6/68/a6745f6d648ce8819976fed6fdc82468.png" alt="">

没心没肺 回答得很正确。



这个我们来看[DHCP的RFC](http://www.faqs.org/rfcs/rfc2131.html)，我截了个图放在这儿：

<img src="https://static001.geekbang.org/resource/image/5b/ba/5ba44ea86352594b78c30ce75cc123ba.jpg" alt="">

这里面说了几个问题。

正常情况下，一旦有了IP地址，DHCP Server还是希望通过单播的方式发送OFFER和ACK。但是不幸的是，有的客户端协议栈的实现，如果还没有配置IP地址，就使用单播。协议栈是不接收这个包的，因为OFFER和ACK的时候，IP地址还没有配置到网卡上。

所以，一切取决于客户端的协议栈的能力，如果没配置好IP，就不能接收单播的包，那就将BROADCAST设为1，以广播的形式进行交互。

如果客户端的协议栈实现很厉害，即便是没有配置好IP，仍然能够接受单播的包，那就将BROADCAST位设置为0，就以单播的形式交互。

3.DHCP如何解决内网安全问题?

<img src="https://static001.geekbang.org/resource/image/f7/8c/f7ff8bed68c94247a19772113d87e18c.png" alt="">



其实DHCP协议的设计是基于内网互信的基础来设计的，而且是基于UDP协议。但是这里面的确是有风险的。例如一个普通用户无意地或者恶意地安装一台DHCP服务器，发放一些错误或者冲突的配置；再如，有恶意的用户发出很多的DHCP请求，让DHCP服务器给他分配大量的IP。

对于第一种情况，DHCP服务器和二层网络都是由网管管理的，可以在交换机配置只有来自某个DHCP服务器的包才是可信的，其他全部丢弃。如果有SDN，或者在云中，非法的DHCP包根本就拦截到虚拟机或者物理机的出口。

对于第二种情况，一方面进行监控，对DHCP报文进行限速，并且异常的端口可以关闭，一方面还是SDN或者在云中，除了被SDN管控端登记过的IP和MAC地址，其他的地址是不允许出现在虚拟机和物理机出口的，也就无法模拟大量的客户端。

## [《第5讲 | 从物理层到MAC层：如何在宿舍里自己组网玩联机游戏？》](https://time.geekbang.org/column/article/8094)

### 课后思考题

1.在二层中我们讲了 ARP 协议，即已知 IP 地址求 MAC；还有一种 RARP 协议，即已知 MAC 求 IP 的，你知道它可以用来干什么吗？

<img src="https://static001.geekbang.org/resource/image/e3/51/e3f91712382b9322beb02ec3d12ce851.png" alt="">

2.如果一个局域网里面有多个交换机，ARP 广播的模式会出现什么问题呢？

盖还说出了环路的问题。

<img src="https://static001.geekbang.org/resource/image/74/a8/74de5ae71807bd0ee3d95f44d7e82aa8.png" alt="">

没心没肺不但说明了问题，而且说明了方案。

<img src="https://static001.geekbang.org/resource/image/fa/a4/fa42fea4d9b4b8ed75008e3f1eadd7a4.png" alt="">



## [《第6讲 | 交换机与VLAN：办公室太复杂，我要回学校》](https://time.geekbang.org/column/article/8386)

### 课后思考题

STP 协议能够很好地解决环路问题，但是也有它的缺点，你能举几个例子吗？

<img src="https://static001.geekbang.org/resource/image/b4/61/b4cb0842468ab9bb16916e9fb29ccb61.png" alt="">

<img src="https://static001.geekbang.org/resource/image/ee/a1/eebc423ca8a37fbc3e7dfc06f07e4ea1.png" alt="">



STP的主要问题在于，当拓扑发生变化，新的配置消息要经过一定的时延才能传播到整个网络。

由于整个交换网络只有一棵生成树，在网络规模比较大的时候会导致较长的收敛时间，拓扑改变的影响面也较大，当链路被阻塞后将不承载任何流量，造成了极大带宽浪费。

## 留言问题

1.每台交换机的武力值是什么样的？

<img src="https://static001.geekbang.org/resource/image/ae/51/ae72cc32931fc72918dd2f5da0ea9e51.png" alt="">

<img src="https://static001.geekbang.org/resource/image/c2/d8/c24fe02c21f41449a3a896442bc3b4d8.png" alt="">

当一台交换机加入或者离开网络的时候，都会造成网络拓扑变化，这个时候检测到拓扑变化的网桥会通知根网桥，根网桥会通知所有的网桥拓扑发生变化。

网桥的ID是由网桥优先级和网桥MAC地址组成的，网桥ID最小的将成为网络中的根桥。默认配置下，网桥优先级都一样，默认优先级是32768。这个时候MAC地址最小的网桥成为根网桥。但是如果你想设置某台为根网桥，就配置更小的优先级即可。

在优先级向量里面，Root Bridge ID就是根网桥的ID，Bridge ID是网桥的ID，Port ID就是一个网桥上有多个端口，端口的ID。

<img src="https://static001.geekbang.org/resource/image/c0/95/c04244bf0b91ae964871698e7811d695.png" alt="">

按照RFC的定义，ROOT PATH COST是和出口带宽相关的，具体的数据如下：

<img src="https://static001.geekbang.org/resource/image/d6/b9/d606b2c9f636ea3bc5694ac95d51f7b9.jpg" alt="">

2.图中的LAN指的是什么？

<img src="https://static001.geekbang.org/resource/image/48/83/48efc105d54eff1ca6099e44df5c5a83.png" alt="">

在这一节中，这两张图引起了困惑。

<img src="https://static001.geekbang.org/resource/image/a5/85/a57a66bf97d326fd0b1355a0ba844e85.png" alt="">

<img src="https://static001.geekbang.org/resource/image/92/17/92450a4c1d7f261a3fbf06a12d621d17.png" alt="">





本来是为了讲二层的原理，做了个抽象的图，结果引起了大家的疑问，所以这里需要重新阐述一下。

首先，这里的LAN1、LAN2、LAN 3的说法的确不准确，因为通过网桥或者交换机连接，它们还是属于一个LAN，其实这是三个物理网络，通过网桥或者交换机连接起来，形成一个二层的LAN。

对于一层，也即物理层的设备，主要使用集线器（Hub），这里我们就用Hub将物理层连接起来。

于是我新画了两个图。

<img src="https://static001.geekbang.org/resource/image/ea/48/ea499064396aa5078b9fe9cd5f4fcc48.png" alt="">

<img src="https://static001.geekbang.org/resource/image/7d/e5/7d0ec3b857e7c85bba8aefc340a86ce5.png" alt="">



在这里，我用Hub将不同的机器连接在一起，形成一个物理段，而非LAN。

3.在MAC地址已经学习的情况下，ARP会广播到没有IP的物理段吗？

<img src="https://static001.geekbang.org/resource/image/1f/f4/1f0ae48921ea404705d93e8bcbf4daf4.png" alt="">

<img src="https://static001.geekbang.org/resource/image/0c/a8/0c5d8df850a2fff54c175789645bd7a8.png" alt="">



首先谢谢这两位同学指出错误，这里ARP的目标地址是广播的，所以无论是否进行地址学习，都会广播，而对于某个MAC的访问，在没有地址学习的时候，是转发到所有的端口的，学习之后，只会转发到有这个MAC的端口。

4.802.1Q VLAN 和Port-based VLAN有什么区别？

<img src="https://static001.geekbang.org/resource/image/98/4d/988673f41c561228c017e96435ea264d.png" alt="">

所谓Port-based VLAN，一般只在一台交换机上起作用，比如一台交换机，10个口，1、3、5、7、9属于VLAN 10。1发出的包，只有3、5、7、9能够收到，但是从这些口转发出去的包头中，并不带VLAN ID。

而802.1Q的VLAN，出了交换机也起作用，也就是说，一旦打上某个VLAN，则出去的包都带这个VLAN，也需要链路上的交换机能够识别这个VLAN，进行转发。

感谢第3讲至第6讲中对内容有深度思考和提出问题的同学。我会为你们送上奖励礼券和知识图谱。（稍后运营同学会发送短信通知。）

欢迎你继续提问！

<img src="https://static001.geekbang.org/resource/image/c6/9c/c65176654fe6305665399da89cfe909c.jpg" alt="">
