- 我是一个线程(修订版)
- 我是一个 Java class
- Javascript:一个屌丝的逆袭
- Java : 一个帝国的诞生
- JSP 一个装配工的没落
- TCP/IP 之 大明王朝邮差
- TCP/IP 之大明内阁
- TCP/IP 之蓟辽督师
- CPU 阿甘
- CPU 阿甘之烦恼
- CPU 阿甘:函数调用的秘密
- 我是一个网卡
- 我是一个路由器
- 我是一个进程
- 我是一块硬盘(上)
- 我是一块硬盘(下)
- 我是一个键盘
- 张大胖的 socket
- 张大胖学递归
- 学习面向对象的令狐冲
- 张大胖学数据库
- 数据库村的旺财和小强
- 小李的数据库之旅(上)
- 小李的数据库之旅(下)
- 漫画:什么是机器学习?
- 那些烦人的同步和互斥问题
- IE 为什么把火狐和 Chrome 给打伤了?
- 对浏览器村的第二次采访
- 节约标兵 IE 的自述
- EMail 诞生记
- Email 诞生记(下)
- Http 历险记(上)
- Http 历险记(下)-- Struts 的秘密
- 动物王国的面向对象
- 冯·诺伊曼计算机的诞生
- Http Server : 一个差生的逆袭
- 张大胖的加法器
- 从 1 加到 100:一道简单的数学题挑战下你的大脑
- 编程语言
- Javascript:一个屌丝的逆袭
- 计算机语言之战
- 我和编程语言的爱恨情仇(上)
- 我和编程语言的爱恨情仇(下)
- Android 为什么选择了 Java
- iOS 为什么选择了 Object-C?
- Basic : 一个老兵的自述
- Node.js : 我只需要一个店小二
- 命令式编程 vs 声明式编程
- 编译还是解释?
- 程序人生
- “架构师"小赵
- 师兄说
- 师姐说
- 小王的架构师之路
- 小李的版本管理系统
- 小超穿越记
- 小李的 Build 之路(上)
- 小李的 Build 之路(下)
- 张大胖改 Bug
- 我的编程之路--大学趣事
- 码农小王的一天
- 小李在外企
- 张大胖的需求估算
- 从厨师到码农
- 聊一聊那些神一样的程序员们(上)
- 聊一聊那些神一样的程序员们(中)
- 聊一聊那些神一样的程序员们(下)
- 谁是互联网之父?
- 一个价值百万的创业教训
- 让自己与众不同 - 提升工作的价值
- 看看你的“易燃性”
- 从无聊的工作中寻找价值
- 什么样的学生适合报考计算机?
- 谈谈程序员的职业方向(上)
- 谈谈程序员的职业方向(中)
- 谈谈程序员的职业方向(下)
- 谈谈培训班的作用
- 码农需要知道的“潜规则”
- 学习编程的加速度
- 码农在工作中的必备能力
- 码农和英语
- 老司机经验
- 假如时光能够倒流, 我会这么学习 Java
- 假如我是计算机系老师
- 学会编程, 而不是学会 Java
- 从增删改查中突围
- 抽象:程序员必备的能力
- 懒就一个字
- 编程的自学方法
- 小王买房记
- 从一道面试题谈谈一线码农应该具备的基本素质
- 想写框架的看过来
- 苹果手机变砖头以后
- 如何快速的学习一门技术?
- 唯一不变的是变化: 谈谈微信应用号
- 什么是企业应用?
- 勿以浮沙筑高台
- 为什么敏捷开发难于成功?
- localhost vs 127.0.0.1
- GitHub/Stackoverflow 找工作时有什么用?
- 动词 or 名词 :这是一个问题
- 如何选择入行语言
- 有时候,沉默是金
- 零 Bug 的代码是怎么炼成的?
- 浮点数为什么不精确?
- 文章错误大全
- Open Source--不要为了开源而开源
- 一不留神,代码就腐化了
- 先做个“键盘侠”, 再来写程序
- 不加断点调试的程序员是好程序员
- 码农必备技能:烂代码的处理之道(上)
- 码农必备技能:烂代码的处理之道(下)
- 学习数据结构有用吗?
- 从现在开始,丰富你的简历
- 那些永不过时的书,你看过几本吗?
- 学好编程必备的一个品质你知道吗?
- 你最爱的 Java
- 搞懂了这几点,你就学会了 Web 编程
- Spring 的本质系列(1) -- 依赖注入
- Spring 本质系列(2)-AOP
- 三层架构和 MVC 那点事儿
- Java 帝国之拨云见日识回调
- 小张的 Duck Typing
- JDBC 的诞生
- JDBC 后传
- 一个不安分的 JDBC 驱动
- Java 帝国之 Java bean (上)
- Java 帝国之 Java bean(下)
- Java 帝国之函数式编程
- Java 帝国之函数式编程(下)
- 关于 Java 初学者需要知道的 10 件事
- JUnit 你不知道的那些事儿
- 圣诞礼物:Java EE 的历史
- Java EE 读书指南
- 给小白的 Java EE 指南
- 给小白的 Java EE 指南(2)
- 给小白的 Java EE 生存指南(3) : XML
- 给小白的 Java EE 生存指南(4) : 一只叫 Tom 的猫
- 给小白的 Java EE 指南(5) : AJAX
- 给小白的 Java EE 生存指南(6) :Java 反射
- 闲聊
- "饿了么"初体验
- 来自大脑的控诉
- 一个高中生是怎么玩自媒体的?
- 尝试 分答
- 到底应不应该上培训班?
- 自学编程中遇到问题怎么办?
- 据说 99%的初级程序员看完后都不迷茫了
- 一行代码引发的“血案”
- 对一个死锁问题的思考
- 通过外包进入名企
- 请开往十年前的今天
- 为什么自学中最好有个师傅指导一下?
- 这个网站值得你花时间投入
- 为什么你无法坚持自学编程?
我是一个网卡
我出生在深圳的一家工厂,然后飘洋过海来到美国,被安装到一个电脑里, 然后这个电脑又漂洋过海, 被运到了中国。
我知道我的使命就是传递信件,但有一个前提:我需要知道对方的地址才行,其实我们网卡都有一个全球唯一的地址,这个地址一出生就确定了,就像你们人类的身份证一样,终生不变。 无论我走到哪里,我都拥有这个唯一的标志:11:27:F5: 8A:79:54 , 挺长的是吧,你们人类把它叫做 MAC 地址, 简单起见, 你可以叫我 “TP-Link 7954”
刚开始的时候我非常孤独,因为这台电脑虽然经常开机,但却不联网,真不知道主人是怎么想的!
不上网就没人来找我发信,不发信我也就没什么价值,也没人搭理我,我整天听着 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 的数据报封装。形象化一点如下图所示) 2 DNS 和 ARP 搞定了 IP 地址, 大家都喜气洋洋。
我们赶紧把浏览器村的老 IE 叫来, 让它访问一下著名的 google 网站。
老 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 章的一个例子,我相当于又重新解读了一下。)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论