所有最新极客时间课程请加QQ群170701297

第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头的细节。

在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网关

“欧洲十国游”型

结合这个图,我们先来看“欧洲十国游”型。

服务器A要访问服务器B。首先,服务器A会思考,192.168.4.101和我不是一个网段的,因而需要先发给网关。那网关是谁呢?已经静态配置好了,网关是192.168.1.1。网关的MAC地址是多少呢?发送ARP获取网关的MAC地址,然后发送包。包的内容是这样的:

  • 源MAC:服务器A的MAC

  • 目标MAC:192.168.1.1这个网口的MAC

  • 源IP:192.168.1.101

  • 目标IP:192.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地址,然后发送包。包的内容是这样的:

  • 源MAC:192.168.56.1的MAC地址

  • 目标MAC:192.168.56.2的MAC地址

  • 源IP:192.168.1.101

  • 目标IP:192.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地址,然后发送包。包的内容是这样的:

  • 源MAC:192.168.4.1的MAC地址

  • 目标MAC:192.168.4.101的MAC地址

  • 源IP:192.168.1.101

  • 目标IP:192.168.4.101

包到达服务器B,MAC地址匹配,将包收进来。

通过这个过程可以看出,每到一个新的局域网,MAC都是要变的,但是IP地址都不变。在IP头里面,不会保存任何网关的IP地址。所谓的下一跳是,某个IP要将这个IP地址转换为MAC放入MAC头。

之所以将这种模式比喻称为欧洲十国游,是因为在整个过程中,IP头里面的地址都是不变的。IP地址在三个局域网都可见,在三个局域网之间的网段都不会冲突。在三个网段之间传输包,IP头不改变。这就像在欧洲各国之间旅游,一个签证就能搞定。 

“玄奘西行”型

我们再来看“玄奘西行”型。

这里遇见的第一个问题是,局域网之间没有商量过,各定各的网段,因而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

  • 目标MAC:192.168.1.1这个网口的MAC

  • 源IP:192.168.1.101

  • 目标IP:192.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。发送包的内容是这样的:

  • 源MAC:192.168.56.1的MAC地址

  • 目标MAC:192.168.56.2的MAC地址

  • 源IP:192.168.56.1

  • 目标IP:192.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地址,然后发送包。内容是这样的:

  • 源MAC:192.168.1.1的MAC地址

  • 目标MAC:192.168.1.101的MAC地址

  • 源IP:192.168.56.1

  • 目标IP:192.168.1.101

包到达服务器B,MAC地址匹配,将包收进来。

从服务器B接收的包可以看出,源IP为服务器A的国际身份,因而发送返回包的时候,也发给这个国际身份,由路由器A做NAT,转换为国内身份。

从这个过程可以看出,IP地址也会变。这个过程用英文说就是Network Address Translation,简称NAT

其实这第二种方式我们经常见,现在大家每家都有家用路由器,家里的网段都是192.168.1.x,所以你肯定访问不了你邻居家的这个私网的IP地址的。所以,当我们家里的包发出去的时候,都被家用路由器NAT成为了运营商的地址了。

很多办公室访问外网的时候,也是被NAT过的,因为不可能办公室里面的IP也是公网可见的,公网地址实在是太贵了,所以一般就是整个办公室共用一个到两个出口IP地址。你可以通过 https://www.whatismyip.com/ 查看自己的出口IP地址。

小结

好了,这一节内容差不多了,我来总结一下:

  • 如果离开本局域网,就需要经过网关,网关是路由器的一个网口;

  • 路由器是一个三层设备,里面有如何寻找下一跳的规则;

  • 经过路由器之后MAC头要变,如果IP不变,相当于不换护照的欧洲旅游,如果IP变,相当于换护照的玄奘西行。

最后,给你留两个思考题吧。

  1. 当在你家里要访问163网站的时候,你的包需要NAT成为公网IP,返回的包又要NAT成你的私有IP,返回包怎么知道这是你的请求呢?它怎么就这么智能的NAT成了你的IP而非别人的IP呢?
  2. 对于路由规则,这一节讲述了静态路由,需要手动配置,如果要自动配置,你觉得应该怎么办呢?

欢迎你留言和我讨论。趣谈网络协议,我们下期见!

精选留言

  • lh
    老师,你在第二种情况说,网关B上记下来,国际身份192.168.56.2对应国内身份192.168.1.101。那么如果该局域网内还有很多其他机器,比如192.168.1.102,103等等,它们对应的国际身份呢?如果也是192.168.56.2,那么从192.168.56.1发来请求时,网关B要将该消息转发到哪个国内身份呢?
    2018-06-04 21:37
  • 张爽
    NAT Gateway会以源IP+源端口的方式记录连接的NAT记录,Ping是直接调用的ICMP,不经过第四层的协议,并没有端口号,请问老师,同一内网的两台机器同时Ping百度,再收到两个应答之后,在没有端口号做区分的情况下,如何进行转发,谢谢
    2018-06-04 09:27
    作者回复

    连接维护用哈希匹配,tcp有端口的一种算法,icmp也有相应的算法

    2018-06-04 09:57

  • 流沙咖啡
    有个地方有错误,在例子中,路由器B右边的192.168.1.0/24并不是静态路由,而是“直连网段”
    2018-06-04 09:04
    作者回复

    赞,是直连,直连也有条路由的

    2018-06-04 09:54

  • yunfei_lei
    对于情况二,服务器A怎么知道服务器B的国际地址的?
    2018-06-05 00:36
  • Malcolm
    这一节讲的特别不清楚,对于懂的人来说当然懂,对于初学者来说,这节有点故弄玄虚了。
    1.访问的外网的某个地址,怎么可能会访问某个私有ip(主机B)?
    2.NAT的TCP用一主机+端口映射,你不讲初学者怎么知道如何响应给哪台主机?
    2018-09-10 09:32
    作者回复

    比如访问学校里面的选课网站?可以先理解一对一映射的场景

    2018-09-10 13:08

  • 蔺波
    Nat有session,这一块需要讲的
    2018-07-02 18:50
    作者回复

    是的,会讲

    2018-07-03 17:31

  • 顾骨
    局域网中两台机器同时访问百度,但是出现了一个极端情况:两台机器的源端口都是一样的,回来时,网关怎么区分该发给谁呢。
    2018-06-04 11:24
  • Geek_9807b5
    老师您好,我有一个关于NAPT的疑问。
    将端口号和ip地址都translate成为公网ip和运算后的端口号,端口号最多65535个,如果内网机器特别多,都走tcp请求,导致接口超过65535个,怎么办?
    2018-06-05 09:55
  • monkay
    有下一跳和没有下一条运作上有什么区别?为什么每次都强调有没有下一跳?
    2018-06-04 10:18
  • 化雨
    查了下第一题,nat时不光会替换ip地址,也会替换端口号;每个网关应该都维护了一张端口主机映射表,这样便能准确寻址私网主机。仔细看了下您画的报文结构,猜测端口号占用的应该是ip报文中的选项字段
    2018-06-05 09:20
  • jacy
    回答一下第一题,nat支持一对一转换,即一个内网ip与一个外网ip,题一需要协议支持一个外网ip对应多个内网ip,则需要napt协议支持,。协议会维护一张映射表,结构如下:
    内网ip:port-->外网ip:空闲port
    只要路由器空闲ip足够即可。但有个问题想请教老师,像微信这种有海量用户保持长连接的场景,路由port不够,是怎么处理的,不可能是加路由设备来处理吧?
    2018-07-05 19:41
  • Alery
    老师,你在第二种情况说,网关B上记下来,国际身份192.168.56.2对应国内身份192.168.1.101。那么如果该局域网内还有很多其他机器,比如192.168.1.102,103等等,它们对应的国际身份呢?如果也是192.168.56.2,那么从192.168.56.1发来请求时,网关B要将该消息转发到哪个国内身份呢?就好比公司局域网往往是几十个几百个绑定到一个公网ip上的,这个时候怎么对应到具体的某个局域网ip呢?
    2018-07-05 07:39
  • zj坚果
    老师,为啥我们在宿舍里用交换机而不是用路由器啊,我们能够上外网呀
    2018-06-07 00:49
    作者回复

    有的交换机叫交换机,其实是有路由功能的

    2018-06-07 13:22

  • Leon📷
    这里面留言的都是人才。知识面又广,声音又好听,我超喜欢在这个地方看评论的感觉,不看评论是不可能的,这辈子都不可能不看评论的。
    2018-10-27 09:57
  • Yangjing
    什么场景下网络是“欧洲十国游”类型的,能提供个例子不?
    2018-08-05 10:22
  • 我是大神郑
    老师,您好。我有个小疑问。就是三层交换机和路由器可以不可以理解为同一功能的设备,还是有包络关系?期待老师答复
    2018-06-10 18:51
  • u
    对于第一个问题,答案叫做napt!
    2018-06-09 23:42
  • 林三杠
    一直有个疑问,IPv4的公网地址是有限的,现在那么多云厂商卖虚拟主机,每台主机都有一个公网IP,会有用完的时候吗?分给每个云厂商的公网IP有多少啊?
    2018-06-05 12:56
  • Rimin
    对于第一个问题:通过NAT地址转换表进行转换。不过一个NAT全球ip地址只能对应一个专用网内的主机。所以现在常用的NAT转换表把运输层端口号也给用上,即NAPT。
    2018-06-04 14:43
  • Ziggy_aa
    老师,有个不理解的地方。
    如果外网和内网的 IP是一一绑定的话,内网 IP的意义不就没有了么?
    还是说,一个内网中有十台机器,但只有一个公网IP的情况,这个网络中就只有一台可以连接外网,其他都连接不了。
    2018-06-04 12:44
    作者回复

    当然不能一一绑定,所以有多台机器共享一个外网ip的情况

    2018-06-04 14:23