前言
本篇博文讲的内容,立足于网络编程,以及是一些网络相关的面试题。
大家在学校里学的计算机网络,则是“计算机网络”设计原理。 也就是讲的“计算机网络”这个东西怎么发明出来的。
?
网络发展史 - 互联网是怎么来的?
最开始的网络大概是在上个世纪50 - 60 年代左右,诞生的。 背景:冷战,又称美苏争霸。
大概在 194几年,第二次世界大战打完之后,世界 格局 开始进入崭新的格局了。 世界上 存在两个超级大国 苏联 和 美国 。 苏联在当今已经消失不见了。 剩下来的俄罗斯 相比 之前的苏联 还是弱了不少。 像我们前些日子中的新闻,俄罗斯 与 乌克兰 打仗,其实 俄罗斯 与 乌克兰 都属于苏联,自家人,
至于为什么不是热战,而是冷战。
这是因为当时有一个很nb的大杀器“核武器”。 “核武器” 给 战争的双方提供了足够的威慑力。 一旦打起来核战争,就是两败俱伤,甚至会影响到全人类的安全。
所以,它俩(美苏)想的是:我把你干掉,但是自己没事。
苏联那边可都是战斗名族,不服就干! 美国人当时是特别害怕苏联和它撕破脸的,不死不休。 一言不合,就给它来一发核弹,美国可能受不了。 所以美国要想保全自己,就得保证的反制手段是有效的。 ? 如果要使用核弹炸一波美国,肯定是炸重要地点。 美国要保证的是,我经受了一波核弹袭击后,我还能实力进行反击。 ?
如果保证能够进行反击? 1、保存指挥机构 2、保存核弹头 和 发射井 3、保证 指挥机构 和 核弹头之间的通信链路
假设,它要发射核弹。 核弹头也要能够接收到命令,然后进行发射。 指挥机构 ,核弹头 和 发射井,这两个都很好保证。 但是,关键就在于通信链路,需要保证 通信链路 在 核弹洗涤的情况下,仍然能够运行。
最终,美国采取额方式是“以力破巧。
让 指挥机构 和 核弹头之间,有无数条可以通信的链路。 哪怕有一部分被打掉,剩余的仍然能够正常工作。 ? 正式因为这个东西,随着发展,逐渐演化成我们今天所看到的互联网。 所以这是互联网,它诞生的一个背景。 计算机是为了计算导弹的轨迹而发明的,而现在的互联网是为了保证下达发射核弹的命令能正确到达而发明的。 ? 后来,我们发现 计算机 和 互联网这个东西,在生活中使用也是非常香的! 逐渐就走进平民百姓的生活中。 ? 在当年的时代背景下,还是非常的紧张的。 紧张到什么程度,据说:指挥机构,按发射核弹的按钮之前,需要输入密码。 为了防止紧急情况下,不知道密码是什么? 将密码设置为6个1。 正常密码盘上面是 0 到 9, 然后,把其它数字都给扣了,就留一个1。 所以当时发射核弹,只需要疯狂扣1 就行了。
这也是为什么 俄罗斯 打乌克兰,放声:北约谁要在插手我们 与 乌克兰 战争,我们直接就发动核战争,北约的那一帮人就熄火了。
想对比之下,中国的互联网的发展其实是非常滞后的。 原因就一个字“穷”。 中国的近代史,那就是一部血泪史。从鸦片战争开始,中国就被各个国家剥削。老百姓饭都吃不饱,拿来资源去搞互联网。 虽然建国之后,情况好了一些。但是为了以后能有更加美好的未来,所以我们国家只能勒紧裤腰带,发展生产、发展工业,将基础设施都搞定之后,才能更好提升老百姓的生活。 中国的互联网发展大概是在 90 年代左右,国内的计算机才逐渐多了起来。没有是计算机谈何而来的网络,所以可想而知中国互联网发展还是很短暂的,与世界的互联网技术,还是有一定的差距的。
在最初的时候,电脑还是没有网的,一般玩的都是一些单机游戏:cs,极品飞车,模拟人生,航海大时代… 玩这些游戏,都是需要买光碟,在电脑上安装的。
随着时间的推移,2004年左右,网吧就火起来了。 黑网吧,我记得我第一次进网吧的时候,还是非常便宜的,是1.5元 一个小时。 稍微去晚了一会,机子就没有了。 晚上溜出去包夜上网的情况屡见不鲜。【我看见的很多人都是这样的】
这一年最火的游戏,魔兽争霸3,GTA3,传奇… 传奇,可以说是整个网游界的开山鼻祖。 由此传奇这个游戏,当年中国互联网最牛逼的公司,叫做盛大。现在改名叫盛趣了。 现在基本上已经凉凉了,也不能说凉凉把。就是热度一般般,现在没有什么拿得出手的游戏。 当年的盛大,就相当于现在的字节腾讯。 主要就是因为 盛大 是 传奇 在国内的代理商。 当年除了盛大独一档之外,之下还有三巨头:网易,新浪,搜狐。 有了这个开端之后,随着计算机和网络的普及,中国这个十亿级别的市场开始爆发。 整个互联网行业出现,井喷式 发展。发展的非常快。 ?
2007年,国外出现了一件惊天动地的大事。(第一次发展的高峰) 乔布斯发布了 第一代苹果手机,也是从这一时刻开始,手机开始从功能机向智能机发展。
在 苹果之前,最牛逼的手机,叫做 诺基亚。 之后,受到了 iPhone 的 降维打击。 但是,不得不得诺基亚质量绝对是刚刚的! 有着其他手机都没有的“功能”,砸核桃 和 防弹。 ? 而 Android 还只是处于内部测试。 当时 iPhone 虽然比较简陋,但是也给 Android 开发团队 带来了 巨大冲击。 Android 对自己的定位 也是 模拟 诺基亚 这样的功能机设备。 但是 看到 iPhone 之后,发现这条路是走不通的。 于是 Android 进行大规模的重构,因此才给未来的制霸互联网埋下了伏笔。 ? 至于 诺基亚,不知道是因为上面原因,仍然坚持自己的路。 最终被拍死在沙滩上。
智能手机对于国内的影响,其实大概是2012 年左右才开始的。 这个时候国内的智能手机才逐渐普及。 为此做出重要贡献的公司,少不了 华为 和 小米。
iPhone 虽然是一个智能机,最大的缺点就是太贵,动不动就 6,7千。 当前都有人割腰子买iPhone的。 ? 而华为,小米的目标是:制作出高性价比,亲民的手机。(便宜,性能还好) 放到现在,估计就没有几个人回去嘎腰子了。 花个 2、3千 买个小米/华为,它不香吗?便宜,而且性能上不差。 而且小米 和 华为 还是有高端机,我们可以自己选择。 所以,留着自己腰子不好吗?
2012 年以后,这个时候,互联网行业迎来了第二波发展高峰(关于移动互联网)。 至于疯狂到什么程度? 疯狂到了 全民创业的程度。 当时 资本家 对于 互联网非常青睐,只要你能开发出 一个 APP,然后随便家教故事,就能拉倒巨额融资。
比如: 1、超级课程表:大学的朋友用的多,就是课程表。 2、河狸家:做美甲的一个APP。 这两个都是当年拿到非常高的投资的!尤其是 超级课程表的创始人,都被吹上天了。 现在热度就没那么高了。 程序员的工资,也是从这个使其开始起飞的!!! 这个时期,作为一个程序员,找工作贼容易,尤其是左 Android 和 iOS 开发的。 ? 美团也是这个时期发展起来的,大概是2014年的时候。 当时还有一个“百团大战”,有很多很多的团购网站,最后合纵连横,成为今天的美团。 包括滴滴什么的,也都是这个时期兴起的。 ? 但是,我们不难发现,在经历了一波高峰之后,活下来的公司寥寥无几。
? 网络发展史,就讲到这。 了解即可,面试不考。
?
局域网 / 广域网
局域网: 就是将 两台,甚至多台主机连接在一起。 这种就构成了一个局域网。 最典型的情况:拿一根网线,把两个主机一连。 最常使用的还是 交换机 和 路由器。 上述讨论的区别,局限于“传统” 的 交换机 和 路由器。 实际上,真实的 交换机和路由器 之间的界限,已经越来越模糊了!
就是说:路由器的很多功能,交换机也有。 交换机的很多功能,路由器也有。 ? 它们的功能越来越强大了,就不局限于传统的 数据转发,它们还可能有其它的很多功能。 这也是为什么它们之间的界限,越来越模糊的原因。 ? 如果面试问到了这里面的一些相关区别问题。 我们就可以简单认为:交换机只连接一个局域网,路由器是横跨两个不同的局域网。
? 通过路由器/交换机,组建起来的这些都叫做局域网。
两台设备插到一起,算是一个局域网。 N台设备插到一个交换机,也算是一个局域网。 甚至说通过一些路由器,将一些局域网连接起来,也还是一个局域网。 所以呢,这都是一个局域网。 哪怕说,你把一个城市的设备都连接起来,也是一个局域网。
广域网。 广域网其实和局域网之间,没有明确界限。 你可以认为比较大的局域网,就是一个“广域网”。
广域网没有明确的说,需要达到多大,才能算是一个广域网。 但一般我们就认为广域网就是一个比较大的网络。 就是很多个局域网组合在一起,构成了一个很大的网络。 比如: 一个国家的网络,就可以成为是一个广域网。 ? 全世界最大的广域网,叫做 Internet(因特网)。 只要你们电脑开通了宽带,都是可以访问因特网的。 其实我们的主机上网,就已经是连到广域网上了。 当然,这里的广域网也不是所有的网站都能访问,毕竟我们都知道有一个长城防火墙。因此我们只能访问其中一部分网站
?
IP地址 和 端口号
IP 地址:描述了网络上的一个主机的位置。 端口号:描述了一个主机上的某个应用程序。
这就好比: 买了一个东西,我们买了一个东西。我们就要写收件人地址,人家快递小哥就把快递送往我们指定的收件位置。 接下来,问题就来了! 我们填写的收货地址,一般都是范围,并不具体。 这就会导致,快递小哥到了地方,但是这个地方不只是有我们一个人。 还有其他人,所以快递小哥也无法确定那个才是你。 怎么办? 于是快递小哥就通过我们的手机号(端口号),给我们打一个电话,告诉我们到哪里去取我们的快递。
IP地址,就相当于是收货的地址。 端口号,就相当于 收件人的电话。 通过这两个东西,我们就能确定一台主机上唯一的应用程序。
?
IP地址
所谓的IP地址,本质上其实就是一个32位二进制数。但是由于 32位二进制数,并不方便人来读和记忆。 因此,我们一般常见的操作都是把这个 32 位二进制数,按照每个字节,分成 四个部分。 中间用点分割,这样的操作称为 “点分十进制” 前面我在MySQL 的 JDBC 编程 博文中,就使用到了一个经典IP地址。
?
端口号
端口号本质是一个 2个字节(16bit位)的无符号整数。 【取值范围:0~65535】 前面我在MySQL 的 JDBC 编程 博文中,就使用到了一个端口号 3306。
?
认识协议 - 重点
我们要想进行有效的通信。那么前提就是能够明确通信协议。 其实本质上就是约定,发出来的数据是什么样的格式。 接收方按照对应的格式来进行解析,
举个例子:相亲 家里的亲戚轮番上阵给你们介绍对象。 说什么时候,你们两个见一面?看看合不合适。 你说好,然后你也加了别人妹纸的微信。 你们约定好了,在哪个咖啡厅里见面。 但是问题就来了!咖啡厅里好看的妹纸非常多,到底哪个才是你们今天相亲的对象? 这时候,我们就需要想办法做出一个区分。 ? 有的朋友说看照片来区分? 我只能说,现在的照片欺骗性太大了,那个女生不会修点图? 再加上化妆邪术,化妆如换头,你能看照片找出相亲对象才有鬼。。 ? 最稳妥的方法,就是和妹纸做一个约定。 约定,妹子明天穿一个黑色连衣裙。 我们穿一件小西服,胸口查一朵玫瑰花, ? 你们进了咖啡厅的门,看到一个红色连衣裙的女孩,八成就是她了。 妹纸回头一看,小西服,外加胸口一朵玫瑰,就是他了。 这个时候,彼此差不多就可以认出对方了。 ? 接下里就可以就那些愉快的聊天了。
这样的约定是很重要的! 如果没有这个约定,就很容易认错人。 这种事,在相亲这回事上,发生的概率还是蛮大的。
那么,我们在网路通信的时候,本质上,传输的是 光信号 与 电信号。 通过 光信号 的频率(高频率/低频率) 和 电信号的电平(高/底 电平) 来表示 0 和 1。 那么,通过这种高低电平 就能把一串 0 1 给发过去。 此时,问题就来了: 这一串 0 1 代表的是什么意思? 我们需要明确出来 是 按照什么规则进行发送的,接收方才能 进行相应的处理。 ? 这个东西也就是我们协议要完成的工作。 所以,从本质上来说:协议就是一种 约定。
只要我们彼此之间,要想进行有效的通信,都需要有一个足够明确的协议。 就好比你们现在看到的这篇博客。 我现在用的是中文写的,至少你们是认识字的。 但如果我使用的是英文写的,你们估计就是爱看天书了。
也就是说:我们能够进行有效通信的前提是 发送 和 接收 协议的双方,它们之间的这个协议是一样的。是双方都能对上号的! 在这个前提上,两者才能进行有效通信。
进一步来说:在学习网络原理的时候,很多的时间都是研究各种协议。
其实这些协议里面,就是讨论我们在 网络传输中,可能会遇到的一些问题和情况。 把这里面的东西都了解了,其实对于这个网络呢,就有了更加深刻的认识。
?
协议分层
网络通信这个过程,其实很复杂,里面有很多很多细节。 如果我们就只通过一个协议,来约定所有的细节,这个协议就会非常庞大而复杂! 这就非常的不友好!!! 更好的办法,就是把这个庞大而复杂的协议,拆分成多个小的,更简单的协议。 每个协议负责一部分工作。
这个就跟写代码一样! 写一个复杂的程序的时候,不要指望着,一个文件把所有的代码都装进去。 而是将这个代码拆分成多个更小的,更简单的文件,每个文件负责一部分工作。 ? 写代码,我们不可能把所有代码都写在一起,我们需要拆成多个部分,多个模块,多个类和方法。 协议也是一样!你把这么复杂的一个东西,用一个协议去表达,不合适。 所以,需要它拆成多个协议, 这样我们就能更好的去维护,也可以更好的进行理解。 还可以灵活的来替换里面的部分内容。
?
网络分层
互联网中的分层具体是怎么分的? 其实这个分法还是有点复杂。来看下面。 注意!上述这种模型只是存在与教科书中。 在真实的网络中,一般没有这样去实现的,因为它太麻烦了。 ? 真实的情况是 OSI 的简化版本:TCP/IP 五层(四层)网络模型。 下面我们就来重点了解 这个 五层(四层)网络模型。 上述的这些,都只是站在一个比较简单,比较宏观的一个逻辑上,来看待这里的功能。我会在后面博文中,详细介绍每一层里面的一些关键协议,以及里面的核心功能。
?
网络设备所对应的分层
?
网络分层中的一组重要概念:封装 和 分用 - 重点
这一组概念,就描述了不同分层的协议之间,是如何相互配合的。 先来看一下发送信息的过程。 数据从上网往下,从上层协议,交给下层协议,由下层协议进行封装,构成该层协议的报文。依次类推,直到 物理层,才真正进行传输数据。 将一套操作,称为 “封装”。 ? 到了刚才的那一步,此时,我们的数据就已经离开了当前主机,前往了下一个设备。 下一个设备,可能是路由器/交换机/其他设备。 总之,A 和 B 之间 大概率不是相连的,中间会有很多个路由器和交换机来负责数据的转发。 中间过程暂且不谈! 主要先看 数据 到达 B 之后的表现!
下面,j就来看一下: 数据 到达 B 之后的表现 至此,我们就完成了一个消息的发送和接收的解析过程。 这个从上往下解析的过程,就称为“分用”。 分用,就是封装的逆过程。
封装,是从下往上,数据依次被加上了协议报头。(包快递) 分用,是从上往下,数据依次被去掉了协议报头。(拆快递)
? 这两个流程非常重要,一定要重点理解!
咱们上述讨论的知识 起点 和 终点 的 情况。 A 和 B 中间还有很多路由器 和 交换机呢!
|