You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
14 KiB
Markdown

2 years ago
# 第8讲 | 世界这么大,我想出网关:欧洲十国游与玄奘西行
前几节,我主要跟你讲了宿舍里和办公室里用到的网络协议。你已经有了一些基础,是时候去外网逛逛了!
## 怎么在宿舍上网?
还记得咱们在宿舍的时候买了台交换机几台机器组了一个局域网打游戏吗可惜啊只能打局域网的游戏不能上网啊盼啊盼啊终于盼到大二允许宿舍开通网络了。学校给每个宿舍的网口分配了一个IP地址。这个IP是校园网的IP完全由网管部门控制。宿舍网的IP地址多为192.168.1.x。校园网的IP地址假设是10.10.x.x。
这个时候,你要在宿舍上网,有两个办法:
第一个办法让你们宿舍长再买一个网卡。这个时候你们宿舍长的电脑里就有两张网卡。一张网卡的线插到你们宿舍的交换机上另一张网卡的线插到校园网的网口。而且这张新的网卡的IP地址要按照学校网管部门分配的配置不然上不了网。**这种情况下,如果你们宿舍的人要上网,就需要一直开着宿舍长的电脑。**
第二个办法,你们共同出钱买个家庭路由器(反正当时我们买不起)。家庭路由器会有内网网口和外网网口。把外网网口的线插到校园网的网口上,将这个外网网口配置成和网管部的一样。内网网口连上你们宿舍的所有的电脑。**这种情况下,如果你们宿舍的人要上网,就需要一直开着路由器。**
这两种方法其实是一样的。只不过第一种方式,让你的宿舍长的电脑,变成一个有多个口的路由器而已。而你买的家庭路由器,里面也跑着程序,和你宿舍长电脑里的功能一样,只不过是一个嵌入式的系统。
当你的宿舍长能够上网之后,接下来,就是其他人的电脑怎么上网的问题。这就需要配置你们的**网卡。**当然DHCP是可以默认配置的。在进行网卡配置的时候除了IP地址还需要配置一个**Gateway**的东西,这个就是**网关**。
## 你了解MAC头和IP头的细节吗
一旦配置了IP地址和网关往往就能够指定目标地址进行访问了。由于在跨网关访问的时候牵扯到MAC地址和IP地址的变化这里有必要详细描述一下MAC头和IP头的细节。
![](https://static001.geekbang.org/resource/image/82/65/825e54560a6de08a32e4cab4e0f59f65.jpg)
在MAC头里面先是目标MAC地址然后是源MAC地址然后有一个协议类型用来说明里面是IP协议。IP头里面的版本号目前主流的还是IPv4服务类型TOS在第三节讲ip addr命令的时候讲过TTL在第7节讲ICMP协议的时候讲过。另外还有8位标识协议。这里到了下一层的协议也就是是TCP还是UDP。最重要的就是源IP和目标IP。先是源IP地址然后是目标IP地址。
在任何一台机器上当要访问另一个IP地址的时候都会先判断这个目标IP地址和当前机器的IP地址是否在同一个网段。怎么判断同一个网段呢需要CIDR和子网掩码这个在第三节的时候也讲过了。
**如果是同一个网段**例如你访问你旁边的兄弟的电脑那就没网关什么事情直接将源地址和目标地址放入IP头中然后通过ARP获得MAC地址将源MAC和目的MAC放入MAC头中发出去就可以了。
**如果不是同一网段**例如你要访问你们校园网里面的BBS该怎么办这就需要发往默认网关Gateway。Gateway的地址一定是和源IP地址是一个网段的。往往不是第一个就是第二个。例如192.168.1.0/24这个网段Gateway往往会是192.168.1.1/24或者192.168.1.2/24。
如何发往默认网关呢网关不是和源IP地址是一个网段的么这个过程就和发往同一个网段的其他机器是一样的将源地址和目标IP地址放入IP头中通过ARP获得网关的MAC地址将源MAC和网关的MAC放入MAC头中发送出去。网关所在的端口例如192.168.1.1/24将网络包收进来然后接下来怎么做就完全看网关的了。
**网关往往是一个路由器,是一个三层转发的设备。**啥叫三层设备前面也说过了就是把MAC头和IP头都取下来然后根据里面的内容看看接下来把包往哪里转发的设备。
在你的宿舍里面网关就是你宿舍长的电脑。一个路由器往往有多个网口如果是一台服务器做这个事情则就有多个网卡其中一个网卡是和源IP同网段的。
很多情况下,人们把网关就叫做路由器。其实不完全准确,而另一种比喻更加恰当:**路由器是一台设备它有五个网口或者网卡相当于有五只手分别连着五个局域网。每只手的IP地址都和局域网的IP地址相同的网段每只手都是它握住的那个局域网的网关。**
任何一个想发往其他局域网的包都会到达其中一只手被拿进来拿下MAC头和IP头看看根据自己的路由算法选择另一只手加上IP头和MAC头然后扔出去。
## 静态路由是什么?
这个时候问题来了该选择哪一只手IP头和MAC头加什么内容哪些变、哪些不变呢这个问题比较复杂大致可以分为两类一个是**静态路由**,一个是**动态路由**。动态路由下一节我们详细地讲。这一节我们先说静态路由。
**静态路由,其实就是在路由器上,配置一条一条规则。**这些规则包括想访问BBS站它肯定有个网段从2号口出去下一跳是IP2想访问教学视频站它也有个自己的网段从3号口出去下一跳是IP3然后保存在路由器里。
每当要选择从哪只手抛出去的时候就一条一条的匹配规则找到符合的规则就按规则中设置的那样从某个口抛出去找下一跳IPX。
## IP头和MAC头哪些变、哪些不变
对于IP头和MAC头哪些变、哪些不变的问题可以分两种类型。我把它们称为“**欧洲十国游”型**和“**玄奘西行”型**。
之前我说过MAC地址是一个局域网内才有效的地址。因而MAC地址只要过网关就必定会改变因为已经换了局域网。两者主要的区别在于IP地址是否改变。不改变IP地址的网关我们称为**转发网关;**改变IP地址的网关我们称为**NAT网关**。
### “欧洲十国游”型
结合这个图,我们先来看“欧洲十国游”型。
![](https://static001.geekbang.org/resource/image/1d/8c/1d604f88456096a73e40437d8f9e458c.jpg)
服务器A要访问服务器B。首先服务器A会思考192.168.4.101和我不是一个网段的因而需要先发给网关。那网关是谁呢已经静态配置好了网关是192.168.1.1。网关的MAC地址是多少呢发送ARP获取网关的MAC地址然后发送包。包的内容是这样的
* 源MAC服务器A的MAC
* 目标MAC192.168.1.1这个网口的MAC
* 源IP192.168.1.101
* 目标IP192.168.4.101
包到达192.168.1.1这个网口发现MAC一致将包收进来开始思考往哪里转发。
在路由器A中配置了静态路由之后要想访问192.168.4.0/24要从192.168.56.1这个口出去下一跳为192.168.56.2。
于是路由器A思考的时候匹配上了这条路由要从192.168.56.1这个口发出去发给192.168.56.2那192.168.56.2的MAC地址是多少呢路由器A发送ARP获取192.168.56.2的MAC地址然后发送包。包的内容是这样的
* 源MAC192.168.56.1的MAC地址
* 目标MAC192.168.56.2的MAC地址
* 源IP192.168.1.101
* 目标IP192.168.4.101
包到达192.168.56.2这个网口发现MAC一致将包收进来开始思考往哪里转发。
在路由器B中配置了静态路由要想访问192.168.4.0/24要从192.168.4.1这个口出去,没有下一跳了。因为我右手这个网卡,就是这个网段的,我是最后一跳了。
于是路由器B思考的时候匹配上了这条路由要从192.168.4.1这个口发出去发给192.168.4.101。那192.168.4.101的MAC地址是多少呢路由器B发送ARP获取192.168.4.101的MAC地址然后发送包。包的内容是这样的
* 源MAC192.168.4.1的MAC地址
* 目标MAC192.168.4.101的MAC地址
* 源IP192.168.1.101
* 目标IP192.168.4.101
包到达服务器BMAC地址匹配将包收进来。
通过这个过程可以看出每到一个新的局域网MAC都是要变的但是IP地址都不变。在IP头里面不会保存任何网关的IP地址。**所谓的下一跳是某个IP要将这个IP地址转换为MAC放入MAC头。**
之所以将这种模式比喻称为欧洲十国游是因为在整个过程中IP头里面的地址都是不变的。IP地址在三个局域网都可见在三个局域网之间的网段都不会冲突。在三个网段之间传输包IP头不改变。这就像在欧洲各国之间旅游一个签证就能搞定。
![](https://static001.geekbang.org/resource/image/35/3b/35fb548bbaa7d77012ab46151bfbe63b.jpg)
### “玄奘西行”型
我们再来看“玄奘西行”型。
这里遇见的第一个问题是局域网之间没有商量过各定各的网段因而IP段冲突了。最左面大唐的地址是192.168.1.101最右面印度的地址也是192.168.1.101如果单从IP地址上看简直是自己访问自己其实是大唐的192.168.1.101要访问印度的192.168.1.101。
怎么解决这个问题呢?既然局域网之间没有商量过,你们各管各的,那到国际上,也即中间的局域网里面,就需要使用另外的地址。就像出国,不能用咱们自己的身份证,而要改用护照一样,玄奘西游也要拿着专门取经的通关文牒,而不能用自己国家的身份证。
首先目标服务器B在国际上要有一个国际的身份我们给它一个192.168.56.2。在网关B上我们记下来国际身份192.168.56.2对应国内身份192.168.1.101。凡是要访问192.168.56.2都转成192.168.1.101。
于是源服务器A要访问目标服务器B要指定的目标地址为192.168.56.2。这是它的国际身份。服务器A想192.168.56.2和我不是一个网段的因而需要发给网关网关是谁已经静态配置好了网关是192.168.1.1网关的MAC地址是多少发送ARP获取网关的MAC地址然后发送包。包的内容是这样的
* 源MAC服务器A的MAC
* 目标MAC192.168.1.1这个网口的MAC
* 源IP192.168.1.101
* 目标IP192.168.56.2
包到达192.168.1.1这个网口发现MAC一致将包收进来开始思考往哪里转发。
在路由器A中配置了静态路由要想访问192.168.56.2/24要从192.168.56.1这个口出去,没有下一跳了,因为我右手这个网卡,就是这个网段的,我是最后一跳了。
于是路由器A思考的时候匹配上了这条路由要从192.168.56.1这个口发出去发给192.168.56.2。那192.168.56.2的MAC地址是多少呢路由器A发送ARP获取192.168.56.2的MAC地址。
当网络包发送到中间的局域网的时候服务器A也需要有个国际身份因而在国际上源IP地址也不能用192.168.1.101需要改成192.168.56.1。发送包的内容是这样的:
* 源MAC192.168.56.1的MAC地址
* 目标MAC192.168.56.2的MAC地址
* 源IP192.168.56.1
* 目标IP192.168.56.2
包到达192.168.56.2这个网口发现MAC一致将包收进来开始思考往哪里转发。
路由器B是一个NAT网关它上面配置了要访问国际身份192.168.56.2对应国内身份192.168.1.101于是改为访问192.168.1.101。
在路由器B中配置了静态路由要想访问192.168.1.0/24要从192.168.1.1这个口出去,没有下一跳了,因为我右手这个网卡,就是这个网段的,我是最后一跳了。
于是路由器B思考的时候匹配上了这条路由要从192.168.1.1这个口发出去发给192.168.1.101。
那192.168.1.101的MAC地址是多少呢路由器B发送ARP获取192.168.1.101的MAC地址然后发送包。内容是这样的
* 源MAC192.168.1.1的MAC地址
* 目标MAC192.168.1.101的MAC地址
* 源IP192.168.56.1
* 目标IP192.168.1.101
包到达服务器BMAC地址匹配将包收进来。
从服务器B接收的包可以看出源IP为服务器A的国际身份因而发送返回包的时候也发给这个国际身份由路由器A做NAT转换为国内身份。
从这个过程可以看出IP地址也会变。这个过程用英文说就是**Network Address Translation**,简称**NAT**。
其实这第二种方式我们经常见现在大家每家都有家用路由器家里的网段都是192.168.1.x所以你肯定访问不了你邻居家的这个私网的IP地址的。所以当我们家里的包发出去的时候都被家用路由器NAT成为了运营商的地址了。
很多办公室访问外网的时候也是被NAT过的因为不可能办公室里面的IP也是公网可见的公网地址实在是太贵了所以一般就是整个办公室共用一个到两个出口IP地址。你可以通过 [https://www.whatismyip.com/](https://www.whatismyip.com/) 查看自己的出口IP地址。
## 小结
好了,这一节内容差不多了,我来总结一下:
* 如果离开本局域网,就需要经过网关,网关是路由器的一个网口;
* 路由器是一个三层设备,里面有如何寻找下一跳的规则;
* 经过路由器之后MAC头要变如果IP不变相当于不换护照的欧洲旅游如果IP变相当于换护照的玄奘西行。
最后,给你留两个思考题吧。
1. 当在你家里要访问163网站的时候你的包需要NAT成为公网IP返回的包又要NAT成你的私有IP返回包怎么知道这是你的请求呢它怎么就这么智能的NAT成了你的IP而非别人的IP呢
2. 对于路由规则,这一节讲述了静态路由,需要手动配置,如果要自动配置,你觉得应该怎么办呢?
欢迎你留言和我讨论。趣谈网络协议,我们下期见!