码农翻身讲网络1:网卡和路由器的故事

  1. 云栖社区>
  2. 博客>
  3. 正文

码农翻身讲网络1:网卡和路由器的故事

程序员黄小斜 2018-02-06 14:44:04 浏览1184
展开阅读全文

 

集线器、交换机、路由器有什么区别?

 

我出生在深圳的一家工厂,然后飘洋过海来到美国,被安装到一个电脑里, 然后这个电脑又漂洋过海, 被运到了中国。

我知道我的使命就是传递信件,但有一个前提:我需要知道对方的地址才行,其实我们网卡都有一个全球唯一的地址,这个地址一出生就确定了,就像你们人类的身份证一样,终生不变。 无论我走到哪里,我都拥有这个唯一的标志:11:27:F5: 8A:79:54 , 挺长的是吧,你们人类把它叫做MAC地址, 简单起见, 你可以叫我 “TP-Link 7954”

刚开始的时候我非常孤独,因为这台电脑虽然经常开机,但却不联网,真不知道主人是怎么想的!

不上网就没人来找我发信,不发信我也就没什么价值,也没人搭理我,我整天听着CPU阿甘和金士顿内存在那里喋喋不休的聊天,真是烦死了。 
(公众号“码农翻身”注:参见文章《CPU阿甘》

只是这两人都记不住对方,每次重启都像是第一次相识,实在是太搞笑了。

 

1 DHCP


在我入住机箱30天以后,音箱向大家报告说:“主人终于决定要上网了” 这绝对是个重磅新闻!

我很兴奋,大家也很兴奋,早就听说外边的世界很精彩了。

一天晚上,只听到“咔嗒”一声, 一个RJ45的网线插头便和我亲密接触了。

网线的那头传来了陌生而熟悉的声音,我的潜意识告诉我,那是交换机在转发信件 。

CPU阿甘看到了这种情况,也不和金士顿内存聊天了,他对着我大叫一声: TP-Link 你在等啥,赶紧上网啊。

这是他第一次和我说话。

操作系统老大是见过世面的,他镇定的说: “心急吃不了热豆腐, 我们得先搞一个IP地址才行。 这需要用到DHCP(动态主机配置协议)”

阿甘说: “谁那里有IP地址啊?”

“这个网络里应该有DHCP 服务器,可以动态的分配地址, 我们可以发个信广播下 ” 老大接着说 “ 阿甘,你和金士顿赶紧写一封信:”

收件人 : 255.255.255.255 : 67 
发件人 : 0.0.0.0 :68 
内容: 我想租用一个Ip地址, 谁有啊?

(公众号“码农翻身”注: 这里我做了简化, 实际上这里首先是一个应用层的DHCP发现报文, 然后被一个UDP的报文封装,然后再被一个IP的数据报封装。形象化一点如下图所示)

这里写图片描述

阿甘傻乎乎的, 也不问为什么收件人和发件人这么奇怪, 只是飞快的按老大的指示写信, 信马上写好了,交到我的手里。

“给你, TP-Link 7954, 赶紧发出去吧”。

我对外发信是有原则的: 我工作在数据链路层, 必须得知道对方的MAC地址才能发信, 如果不知道, 我就对外广播, 那就是所有的电脑都会收到。

这封信显然就是要广播的,因为到目前为止, 我们还是网络大海中的一个孤岛, 和外界没有任何联系, 我还不知道任何其他电脑的MAC地址。

按照规定,我又把阿甘写的信封装了一下, 装到另外一个信封里, 只有这样,我最重要的伙伴交换机才能看懂。 
目的地: FF:FF:FF:FF:FF:FF (广播到同一子网内的所有电脑) 
发件人: 11:27:F5:8A:79:54 (就是我自己了!)

这里写图片描述

我把它通过网线发给了交换机。 交换机看到FF:FF:FF:FF:FF:FF, 立刻转发给了所有连到交换机的设备。

如同老大所料, 这个局域网里确实有DHCP服务器, 还不止一个!因为没有多久, 交换机转来两封信, 我拆开其中一封, 里边写着:

“我是DHCP服务器192.168.1.1 , 我这里有个空闲的IP 192.168.1.2, 你租不租?”

另外一封信也差不多, 是另外一个DHCP服务器发来的,提供了另外一个IP地址。

CPU阿甘迫不及待了: “看来我们很受欢迎啊,这么多人愿意给我们IP, 老大, 快抢一个吧。 ”

操作系统老大说: 好, 我们要这个192.168.1.2吧, 再写一封信: 
“你好,服务器192.168.1.1 , 我们就要这个IP 192.168.1.2了”

我又把这封信广播出去, 看来我们所处的网络非常快, 确认的回信眨眼间就到: 
“这是一个确认信, IP 192.168.1.2 给你了。 网关路由器是192.168.1.1 , DNS服务器的地址是 202.102.224.69”

金士顿内存说: “不容易啊, 终于搞定一个IP 了, 我把它记下来。 ”

操作系统老大说: “把所有信息都记下来, 接下来很快就会用到” 
我们的IP : 192.168.1.2 
网关路由器: 192.168.1.1 
DNS服务器: 202.102.224.69

阿甘说:“ 要是重启了, 我们是不是要这么重来一遍? ”

“阿甘, 你现在越来越聪明了, 确实是这样, 除非主人手动的给我们配置IP地址,网关, DNS , 但是那样很烦,容易出错, 所以一般情况下, 主人都是依赖我们自动的去用DHCP搞定一个IP 。 ”

经过这一番折腾, 我也初步了解了我们所在的网络结构:

这里写图片描述

 

2 DNS和ARP


搞定了IP地址, 大家都喜气洋洋。

我们赶紧把浏览器村的老IE叫来, 让它访问一下著名的google网站。

(公众号“码农翻身”注:参见文章《老IE为什么把火狐和Chrome打伤了?》

老IE说: “你们还不知道? google在中国被屏蔽了, 访问不了, 要不访问百度吧。 ”

我说: “都行, 我们先访问一下试试。 ”

老IE说: ”百度的域名是www.baidu.com, 你们给我查查它对应的IP地址呗!”

阿甘说: “上个网这么麻烦, 这么多地址要查 ”

“是啊, 网络世界的规矩就是这样 ,想要互联, 我们得有IP地址, 也得知道对方的IP地址, 现在只知道域名www.baidu.com , 我们得给他翻译成IP才行, 阿甘你准备一个DNS查询吧 ” 老大说

CPU阿甘遵照指示,先向金士顿内存问了DNS服务器的地址, 然后写了这么一封信, 交给我 
发件人: 192.168.1.2 (我们刚刚搞定的IP) 
收件人: 202.102.224.69 (DNS服务器) 
内容: 哥们, 给我查查www.baidu.com 的IP地址吧

“但是这封信发给谁呢, 我需要知道对方MAC地址啊, 总不成还是对外广播吧。“ 我心里想。

操作系统老大看出了我的疑虑, 解释说: “DNS服务器不在我们的局域网内, 我们要把这个信发给 网关路由器 , 他会想办法转给 DNS服务器的。 ”

我说: “可是我不知道网关路由器的MAC地址啊”

金士顿内存说: “别急, 我查查之前我们存下来没有, 我靠, 刚才那个DHCP服务器(192.168.1.1)也是网关服务器, 他怎么没把MAC地址顺便发过来啊!”

CPU阿甘急了: “TP-LINK7954, 你是怎么干活的, 怎么非得要MAC地址, 直接用IP地址不行吗?”

我回答说: “没办法, 这是规定, 你不知道网络是分层的吗?  我只工作在数据链路层, 就得用MAC地址。 另外网络多种多样, 可不仅仅是TCP/IP , 我要是只用IP地址, 那其他网络怎么工作?”

操作系统老大说: “我记得好像有个叫ARP东西, 可以通过广播查询一个IP地址对应的MAC地址, 你试试”

其实我也想起来了, 这个ARP叫地址解析协议, 我可以把下面的消息广播出去, 这个子网内的所有机器都会收到, 网关路由器也不例外, 他收到以后,一看是查询自己的MAC地址, 就会创建一个ARP的应答。

收件人: FF:FF:FF:FF:FF:FF (同一子网内的所有电脑) 
发件人: 11:27:F5:8A:79:54 (就是我自己了!) 
内容:呼叫网关路由器(192.168.1.1), 请问你的MAC地址是什么?

过了一会, ARP应答果然来了, 我们看到了网关路由器的MAC地址: 88-25-93-79-E0-C8

我告诉金士顿内存: “赶紧记下来,下次咱就不用再查询了” 
192.168.1.1 <–> 88-25-93-79-E0-C8

有了网关路由器的MAC地址, 剩下的事情就好办了, 我只需要把之前准备好的DNS查询发给网关路由器即可。

阿甘好奇问我:“ 你只把这个信发到网关路由器, 剩下的事就不管了? ”

我没声好气的回答它说: “那当然了, 我只能管局域网的事情, 出了局域网, 那就是路由器的事情了, 路由器能抽取这个DNS查询的数据报, 看到收件人是202.102.224.69 (DNS服务器), 自然可以转发出去, 我们完全不用担心。”

我们等了一会, DNS服务器很快就返回了www.baidu.com的IP : 115.239.211.112

金士顿内存说: “我记下来了, 上网看来一点都不好玩啊, 这么费劲。 ”

老IE 说: “好玩的在后面呢, 现在所有的东西都齐活了, 开工 ”

老IE开始创建TCP连接, 然后通过TCP 发送HTT GET请求, 轻轻松松的把百度的主页给取了下来,展示了出来。

大家第一次看到外边的世界, 激动万分。

当然还是我最忙, 因为老IE的所有信件都需要我去发送和接收。

 

2 尾声


这几个月以来我都是电脑里的最忙碌的人, 一旦可以上网, 大家都上瘾了, 浏览网页,刷微博, 看视频, 玩游戏, 每天把我累的要死。

日子就这么一天天过去, 有一天, 大家发现主人把一个新家伙通过USB接口插到了电脑上, 然后顺手拔掉了网线 !

我失去了和交换机的联系 , 无法联网了, 难道我们电脑又要成为一个孤岛了吗?

老IE还正在访问一个博客网站呢, 一下子就断了。

不过奇怪的是, CPU阿甘, 金士顿内存, 操作系统老大 竟然都围着新来的家伙重新玩起了DHCP, DNS , ARP , 并且连上网了, 所有的信件都由这个新家伙来传递。

我偷偷的问老IE :“ 这是怎么回事? ”

老IE说: “看来你已经失宠了, 新来的家伙叫无线网卡!”

(刘欣注: 这篇文章其实来源于《计算机网络:自顶向下的方法》第5章的一个例子,我相当于又重新解读了一下。)

 

我相信我们都玩过一款特别火的游戏:帝国时代。小时候想要玩帝国时代,需要到软件城购买盗版光盘安装(大概3块钱一张左右的样子,当时已经觉得很便宜了,谁想到现在有了网络之后是免费)。下载完成后只能进行单机模式。

小A是一个帝国时代大神,他打通了游戏的所有关卡,可以一个人单挑8个疯狂的电脑。渐渐他觉得无聊了,想要找小伙伴一起PK。

但是如何实现两台设备的互联呢?小A很聪明,他发明了一个类似于USB口一样的可以传输数据的端口,他将其命名为网口。小A通过一根网线将自己的电脑与小B的网口相连,实现了两台电脑间的互连。

两个小伙伴很开心,联机玩了起来,这时被路过的小C看见了,小C也要加入进来。但是我们知道,每台电脑只有一个网口,无法实现三台电脑的相互连接,那要要怎么办呢?

这时候小B出了一个主意:咱们再找一台计算机,给他多设计几个网口,我们每个人都连到这台计算机的网口上,不也实现咱们哥几个之间的互连了吗。

说干就干,于是他们设计出了一款微型计算机,他本身具备多个网口,专门实现多台计算机的互联作用,这个微型计算机就是集线器(HUB)。顾名思义,集线器起到了一个将网线集结起来的作用,实现最初级的网络互通。集线器是通过网线直接传送数据的,我们说他工作在物理层。

有了集线器后,越来越多的小伙伴加入到游戏中,小D、小E等人都慕名而来。然而集线器有一个问题,由于和每台设备相连,他不能分辨出具体信息是发送给谁的,只能广泛的广播出去。例如小A本来想问小C:你吃了吗?结果小B,小D和小E等所有连接在集线器上的用户都收到了这一信息,且由于处于同一网络,小A说话时其他人不能发言,否则信息间会产生碰撞,引发错误,我们叫做各设备处于同一冲突域内。

这样的设备用户体验极差,于是小伙伴们一起讨论改进措施。这时聪明的小D发话了:我们给这台设备加入一个指令,让他可以根据网口名称自动寻址传输数据。比如我把小A的网口命名为macA,将小C的命名为macC,这时如果小A想要将数据传给小C,则设备会根据网口名称macA和macC自动将资料从A的电脑传送到C的电脑中,而不让小B、小D和小E收到。也就是说,这台设备解决了冲突的问题,实现了任意两台电脑间的互联,大大地提升了网络间的传输速度,我们把它叫做交换机。由于交换机是根据网口地址传送信息,比网线直接传送多了一个步骤,我们也说交换机工作在数据链路层。

这回小伙伴们高兴了,他们愉快地玩耍起来。渐渐地,他们在当地有了名气,吸引了越来越多的小伙伴加入到他们的队伍中。直到有一天,一个外村的小伙突然找上门来,希望能和他们一起互联,实现跨村间的网络对战。

小A说可以呀,于是他们找了一根超长的网线将两个村落的交换机连在了一起。结果发现一件奇怪的事:两个村落间竟然不能相互通信。怎么着,原来那边的电脑和他们用的不是一套操作系统,这导致信息间的传送形式的不匹配。在这期间,还有其他村落的人也来找过小A,可是小A发现,每个村子之间用的操作系统都不一样。

这可咋办呐?难道以后只能各自村子玩各自的了吗?为了解决这一问题,各村的小伙伴们坐在一起组织了一场会议,最终得出了一套解决方案:采用同样的信息传送形式(像不像秦始皇统一度量衡)。那如何实现呢?小伙伴们规定,不同的村子间先在各自的操作系统上加上一套相同的协议。不同村落通信时,信息经协议加工成统一形式,再经由一个特殊的设备传送出去。这个设备就叫做路由器。路由器通过IP地址寻址,我们说它工作在计算机的网络层。

这样,经由如此的一系列改装,小A终于带领村民们实现了整个乡镇的通信。随着越来越多的城里人也加入小A的协议,小A带领村民逐步实现了全市、全国乃至全世界的通信。这一套协议便是TCP/IP协议簇,互联网也便这样形成了。

然而,即便如今全网络已遍布了全世界,在小A和村里的小伙伴对战帝国时代的时候,也仍然用着交换机。只有和外面更大的世界交流的时候才用到路由器。

总结:交换机适合局域网内互联,路由器实现全网段互联。

 

这里再单独解释一下猫:猫的学名叫调制解调器,它的作用是将数字信号(电脑想要发送的信息)转换成模拟信号(网线中的电流脉冲)从而使信息在网线中传输。

由于计算机的一切信号都要由电流脉冲传送出去,因而猫是必须的。目前的家用路由器一般都是路由猫,即路由器兼顾了猫和简单交换机的功能,因而在选购时,选一款性价比超高的路由猫就可以了。

至于物理地址,逻辑地址,交换机与路由器的寻址方式等问题属于更专业的范畴,在这里就不再赘述了。如有兴趣的朋友可以留言,我有时间会另开专题。

最后,真心希望这篇文章能够帮助到大家。因为我也是从通讯小白走过来的,知道外行人对一些基本概念的糊涂。以后如果有机会,我会进一步写一些互联网通信类的文章,力求用通俗易懂的语言解释一些基本概念。大家如果有什么想知道的可以给我留言,文章中若存在错误也请指出,我会经查证后改正。 谢谢大家~

 

真正的知识是深入浅出的,码农翻身” 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解。

本文源地址:我是一个路由器

前言:《我是一个网卡》发出以后,受到很多人喜欢,感谢大家的支持,这也促使我多写一些网络相关的文章,以飨读者。
我注意到很多人提出了很好的问题,主要集中在数据包出了局域网以后的处理。所以特别写下这一篇文章,试图回答一下这些疑问。

我就是网卡TP-Link 7954经常和大家提起的网关路由器,我在网络中的位置是这样的:

为啥叫网关呢?因为大家想上网,一定得经过我这一关。

这不是开玩笑,确实是这样!所有的对局域网之外的访问那非得经过我不可。
其实我直接和ISP(就是联通)的网络相连,我从联通运营商那里搞了一个外网的地址:61.52.247.112。
可是只有这么一个地址,我们局域网内这么多电脑,如果轮流着让每个电脑去用,那大家可就抱怨死了。 
于是我巧妙的构思了一个网络世界,成功的欺骗了TP-Link 7954这些网卡们。

 1、NAT(网络地址转换)

还记得上次TP-Link 7954向我要地址的事儿吗

因为我不仅仅是个路由器,还是一个DHCP服务器,掌握着这个局域网的IP生杀大权。
我给TP-Link 7954 分配的IP是 192.168.1.2,但是他拿这个地址是无法直接上网的。因为这是属于我管辖的内网地址,别的网站像www.baidu.com根本都不知道!
即使知道了也没用,因为在这个世界上可能有无数的路由器都会分配192.168.xxx.xxx 这样的地址,你到底要找哪一个?
所以TP-Link 7954想上网必须得通过我,我需要施展一点点小魔法,比如说它想访问百度,通过交换机给我发来这么一个数据帧:

我把数据链路层的外衣去掉,发现IP数据包中的目标地址是115.239.211.112,我就知道这是要向外网发出请求了。(因为不是该网址不在当前局域网的网段中)
于是我就把IP数据包中的源地址192.168.1.2替换成我从联通那里搞到的外网地址61.52.247.112。
这还不够,我会创建一个新的端口号2001,把TCP数据包中的源端口也替换掉,数据包就变成了这个样子:

不知道你看出来其中的奥妙没有,我把源地址和源端口都替换了,其实我的目的就是让外部的网络认为这是我(路由器)发出的,他们根本不知道什么TP-Link 7954 这个网卡!

然后我需要查一下我的路由表,确定到底转发到哪个输出端口去,再给这个IP数据报穿上数据链路层的外衣,把数据包发给了联通的网络,剩下的事我就不管了。

注意看以太网帧的MAC地址,源地址已经是我了,而不是TP-Link 7954了,因为这是我和联通网络之间的数据链路。

这个替换源地址和源端口的小把戏就叫做网络地址转换,人类简称为NAT。

当然不只是TP-Link7954通过我上网,还有很多别的电脑呢,我得把我的小把戏记下来,形成这么一张表:

过了不久,baidu 网站的回复就会通过别的路由器转到我这里。正如你所想的,我需要反过来处理一遍:首先去掉数据链路层的外衣,发现TCP和IP数据报中包含这样的信息:目的地IP-61.52.247.112 ,端口-2001。 
这时候我就去查表,找到了192.168.1.2:3345,我就明白这是给TP-Link 7954的信了。 
那就再次把数据报中的IP地址和端口号改了吧,让TP-Link 7954 认为这个数据包就是我给他的。

就这样,我成功的用区区一个外网的IP就支持了局域网内多个电脑的上网需求,并且他们根本就不知道是怎么回事!

2、NAT穿越

欺骗终究是不能长久的,我的麻烦很快就来了。
TP-Link 7954 所在的机器为了下载一个大电影,安装了一个P2P软件:电驴。 
所谓的P2P 就是Peer to Peer,即网络中的机器是对等的。
所有使用电驴的机器不仅仅是一个发起请求下载数据的客户端,他们同时也是一个能够接受请求,向外发送数据的服务器。
这样一来,当下载大文件的时候,你就可以从很多安装了电驴的机器上分块下载,而不是仅仅从一个服务器上下载,速度快了很多。
人人为我,我为人人啊。 
可是TP-Link7954 很快就发现,当它试图做服务器的时候,其他电驴根本就连不上它,为什么? 
因为IP地址是我分配的啊,是个内网地址 192.168.1.2,外网的人根本就不知道,怎么连?
TP-Link 7954 给我发了一封措辞严厉的信件,质问我为什么他没法作为一个服务器接受外边的连接,这强烈的阻碍了他们下载各种电影的需求。
我估摸着是瞒不住了,只好把所有的网卡都召集起来,开个会大家商量一下。
我解释说:“现在IP地址很稀缺,我用这种NAT的方法也是不得已而为之,要不然大家怎么上网啊,你们之前不是过的也挺好吗? 我听说电驴会占用很大的流量,我们公司很快就会禁止的。”
D-Link3925 说:“公司的政策根本不是你应该考虑的事,你考虑的是怎么才能让外网的电驴连上我们!”
可是我实在是没有办法,就这一个外网的IP地址啊。 
TP-Link 7954倒是很聪明,他立刻就意识到了问题所在,想出了解决办法:

“这样吧,路由器你不是擅长搞玩小把戏吗?可以继续玩下去。但是得允许我们这些网卡参与进来玩,比如说我(ip地址192.168.1.2)会主动的要求你建立一个NAT映射 (192.168.1.2 : 4096) <-> (61.52.247.112: 3001)。

“你还可以保存在你的NAT表中,然后我就会对外通告了,我是一个电驴服务器。谁要是想连接我的话,请到这里来:61.52.247.112: 3001,当外网的连接来的时候,你必须把连接请求转发到我这里来。”

大家一致认为这个方法很简单、很实用,就这么决定了。
“码农翻身”公众号注:这其实就是UPnP , 你打开你的无线路由器,就能看到 :

 

事情就这么解决了,生活又恢复了平静。当然,我作为一个路由器,这些NAT、UPnP都是我的附加功能。我最重要的事情还是建立路由表,做路由选择、转发IP数据包,下次再说吧。

 

 

 微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 


                     wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

网友评论

登录后评论
0/500
评论
程序员黄小斜
+ 关注