回顾一下前面几篇,Java基础、多线程、IO都介绍了一轮,现在终于轮到计算机网络这个老朋友了(绝对不是因为我马上要考计网借此复习的)
其实一开始我对计网这门课或者说这一系列知识的态度是,这玩意不就是应付考试的,,,背会了不就好了
但是当我真正开始做项目写程序,修bug部署服务器的时候发现,大意了,,,这玩意真得好好学一下的
所以我新开了这一系列博客,打算从头开始,一点一点把计网这套东西搞清除
一、网络发展历程
要知道,网络并不是一开始就长成这样可以"随时随地刷视频"的,简单来说,可以分成以下几个阶段:
单机时代->局域网时代->广域网时代->移动互联网时代
最早的时候,计算机是完全孤立的,一台计算机就像一座小岛,所有的程序和数据都在本地运行。用户想要计算机做什么,只需要面对这一台机器即可
这就是所谓的单机时代
但是很快,人们发现了一个问题,我的数据和程序只能在自己电脑上玩,别人的数据我看不到,我的数据别人也看不到,倘若几台计算机之间能够共享数据,效率岂不是会高很多?
于是,局域网出现了
在一个物理范围很小的区域内,通过网线或者交换机把多台计算机连在一起,这样大家就可以在这样一个小圈子里通信、共享资源
Arpanet:一种早期的计算机网络,是美国国防部高级研究计划局(ARPA)于1960年代末至1970年代初开发的。它是第一个实现分组交换数据的网络,也是互联网的前身
再往后,局域网已经不能满足大家的需求,我不光想和同一个办公室的人通信,我还想和外地、甚至外国的计算机通信
于是就有了广域网
广域网的本质其实就是把一个又一个的局域网连接起来,而当全球范围内的广域网逐渐连接成一个整体,就诞生了今天我们所熟知的Internet(因特网)
二、核心硬件设备
网络之所以能运转起来,离不开一些非常核心的硬件设备,其中最重要的几个就是:路由器 、交换机 、中继器
2.1 路由器
路由器最核心的工作其实只有一件事:转发数据包,并决定数据往哪条路走
在家里,路由器负责帮你组建一个小型局域网;在更大的网络中,路由器负责把不同的网络连接起来
换句话说,它更像是网络中的"导航"
2.2 交换机
相比之下,交换机的角色要简单得多
交换机可以理解为给网络扩接口的设备,交换机本身并不负责网络规划,也不关心数据最终要去哪里,它只是负责在同一个网络中让更多设备能够互相通信
而且,交换机还可以套娃使用,一个不用再接一个
2.3 中继器
计算机网络是由一个个节点组成的,不同节点之间使用光纤、电缆等介质传输信号,但是长距离的传输会导致信号失真。
此时就需要使用到中继器,它是一种信号增强装置,它能接收、放大并重传信号,多段由中继器连接起来的电缆段与一根单独的电缆没有什么区别(当然,存在使用中继器引入的部分延迟)
当然,网络中并不只有这三种设备,像防火墙、网桥、网关之类的也都各司其职,只不过在我们后续学习和编程过程中,真正经常会"打交道"的,还是路由器和交换机这两位老朋友,其他设备先混个脸熟即可,没必要一上来就钻太深
三、网络通信的基本要素
当我们真正开始讨论"通信"时,有三个概念是必须要明确的:IP地址、端口号、网络协议
3.1 IP地址
IP地址的作用非常直接,用来标识网络中一台设备的位置,它相当于网络世界中的"住址"
当数据在网络中传输时,至少要知道两件事
- 数据从哪里来
- 数据要到哪里去
这两个信息,就是通过IP地址来确定的
3.2 端口号
但仅有IP地址还不行,因为一台计算机上,往往还同时运行着多个程序,如果数据只知道"到这台机器",那么问题来了,到底该交给哪个程序?
这个时,端口号就派上用场了
IP地址负责定位到机器,端口号负责定位到程序
所以在网络编程中,我们可以通过IP+端口号来确定唯一一个网络通信的端点
3.3 网络协议
再进一步,我们会想到一个问题,就算数据送对了地方,程序是怎么知道这些数据是什么意思?
倘若AB两台机器通信,A说你给我发个1,B说I`m fine, thank you,这不就乱套了
所以,通信双方必须提前约定好规则,这个规则就是网络协议
网络协议本质上是通信双方对于"数据格式"和"解析方式"的约定
只要双方遵守同一套协议,就可以正确地理解彼此发送的数据
四、协议分层
我们在学习计网之前一定或多或少的都听说过"OSI"、"TCP/IP"之类的多层网络模型,那么协议为什么要分层呢?
这是因为网络通信涉及的事情非常多,从最底层的信号传输,到最上层的数据使用,每一层关注的问题都完全不同
如果把所有事情都塞进一个协议里,那结果只有一个:复杂、难维护、不可扩展。换言之,shi山
于是就有了一个非常经典的设计思想:分层
4.1 分层的本质思想
分层的核心目标是把复杂问题拆小,每一层只关注自己的职责;并且约定,上层只能调用下层提供的服务,不能跨层直接交互
这样一来,修改某一层的实现,不容易影响其他层,各层可以独立演进
总之,非常好!!
五、OSI七层网络模型
前面提到了网络分层模型,这时候就绕不开一个在计网课本中"出镜率极高"的老朋友------OSI 七层模型

但是这个模型本身设计存在缺陷,需要先说明一点,这里说 OSI 有问题,并不是在否定它的历史意义,而是站在今天回头看,它确实更像一个"理想化的分层模型",而不是一个真正被工程实践验证过的方案
这个模型诞生的时候,互联网还远没有今天这么成熟,它的设计思路本身偏向于:先把网络通信这件事在逻辑上拆清楚,再尝试推动大家按照这个模型去实现
听起来没什么问题,但现实是,当OSI还在制定标准、反复讨论每一层该干什么时,TCP/IP已经在真实网络中跑起来了,而且还跑的不错
这就导致一个非常现实的结果:OSI模型在理论上非常完美,但在实践中严重缺乏落地土壤。正因为如此,几乎找不到一个严格按照OSI七层完整实现的网络系统,它更多是被用来"解释网络是怎么回事",而不是"指导网络该怎么实现"
六、TCP/IP网络模型
和 OSI 七层相比,TCP/IP 模型显得"朴素"得多,它并不追求把每一件事都拆得非常细,而是更关注一件事:这套东西,能不能在真实网络里稳定地跑起来?
答案显然是肯定的,不然今天我也写不了这篇博客了【狗头】
下文提到的具体协议这里先进行一个简要介绍,后续有机会另开一篇详细介绍一下,嘿嘿
6.1 TCP/IP的四层结构
TCP/IP 模型一共分为四层(有些教材会叫五层,本质一致):
- 应用层
- 传输层
- 网络层
- 网络接口层(或物理层+数据链路层)
第一眼看上去,层数少了很多,但实际上并不是"功能减少了",而是把OSI中那些存在感不强、边界模糊的层合并了
这点,反而非常符合工程直觉
6.2 应用层
如果你写过Java网络程序,那你对TCP/IP的第一感知,一定是从应用层开始的
HTTP、HTTPS、SMTP、DNS......包括你自己定义的各种私有协议,都属于应用层协议哦
这一层要做的事情也很直接,规定应用之间如何通信、数据长什么样、怎样解析
比如 HTTP 中会定义请求行、请求头、请求体等数据格式
这些东西,和底层怎么发包、怎么重传,其实没什么关系,但对程序来说却是核心
这一层对应的就是OSI模型中的应用层+表示层+会话层
6.3 传输层
这一层的核心任务只有一个:在两台主机的进程之间,提供端到端的数据传输服务
你熟悉的两个老朋友就在这里,TCP和UDP
TCP提供一种"我尽量保证你能收到"的通信方式,通过连接、确认、重传、流量控制、拥塞控制等机制实现
UDP则是比较直接,只负责发,不保证对端能否接受
也正是在这一层,端口号开始真正发挥作用,也就是使用IP+端口定位一个通信端点
6.4 网络层
再往下一层,就是网络层
这一层关心的问题只有一个:数据包该如何从一台主机送到另一台主机
网络层不关心数据内容是什么,是不是完整,有没有顺序,而是尽最大努力把数据包送到目标IP所在的网络
至于中间走哪条路、经过多少个路由器、会不会丢包,都是网络层要操心的事情
也正是在这里,"路由"这个概念才真正出现
6.5 网络接口层
最底层的网络接口层,这一层负责主要负责:
- 数据如何在链路上传输
- 使用什么介质传输(网线、光纤、无线)
- MAC地址
- 帧的封装与拆解
你可以把它理解为,把上层交下来的数据,真正变成电信号、光信号、无线信号发出去
OSI模型中的物理层和数据链路层就是在这里被合并的
FINISH!下篇我们来介绍一下一个数据包在网络中是如何被"层层封装"的