计算机之间是相互独立的(独立模式),随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。
网络互连:将多台计算机连接在⼀起,完成数据共享。
数据共享本质是网络数据传输 ,即计算机之间通过网络来传输数据,也称为网络通信。
根据网络互连的规模不同,可以划分为局域网 和**⼴域网**。
1.局域网LAN
局域网,即 Local Area Network,简称LAN。Local 即标识了局域网是本地,局部组建的⼀种私有网络。
局域网内的主机之间 能方便的进行网络通信 ,又称为内网;局域网和局域网之间在没有连接的情况 下,是无法通信的。
局域网组建网络的方式有很多种:
- 基于网线直连:即两两主机之间通过网线直连
- 基于交换机(Switch)组建:许多台主机连接到一台交换机上
- 基于路由器(Router)和交换机组建

2.广域网WAN
⼴域网,即 Wide Area Network,简称WAN。
通过路由器,将多个局域网连接起来 ,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。
不同的局域网通过路由器连接起来,如果跨越了较广泛的地理区域,并且使用电信运营商提供的远程链路,那就构成了广域网。

全世界最大的广域网是 Internet(因特尔),互联网。
网络发展,经历了从 单机时代 -> 局域网时代 -> 广域网时代 -> 移动互联网时代
而组建这些网络的核心设备,就是路由器和交换机。
路由器的核心功能是连接两个不同的网络,最典型的就是你的局域网和互联网。而交换机可以视为是"对路由器的接口进行了扩展",不会进行组局域网的功能,可以把路由器的接口进行扩展,即如果某个电脑连接到交换机上,等价于连接到路由器上,如果交换机的接口不够用了,还可以接更多的交换机,引入更多插口。
3.网络通信基础
网络互连的目的是进行网络通信,即为网络数据传输,更具体⼀点,是网络主机中的不同进程间, 基于网络传输数据。
那么,在组建的网络中,如何判断到底是++从哪台主机,将数据传输到那台主机++呢?
------ 这就需要使用 IP地址来标识。
3.1 IP地址
IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址。
就像我们发送快递⼀样,需要知道对方的收货地址,快递员才能将包裹送到目的地。
格式:
IP地址是⼀个32位的二进制数,通常被分割为4个 "8位⼆进制数"(也就是4个字节),如: 01100100.00000100.00000101.00000110。
通常用 "点分十进制" 的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。 如:192.168.1.10
3.2 端口号
在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。 简单说:端口号用于定位主机中的进程。
类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)。
使用IP地址定位到目标主机之后,主机上会有多个进程/应用程序 同时使用网络,此时要进一步定位主机中的某一个进程,就需要通过端口号定位 / 区分主机中的进程。
格式:
端口号是 0~65535 范围的数字,在网络通信中,进程可以通过绑定⼀个端口号,来发送及接收网络数据。
问题:
有了IP地址和端口号,可以定位到网络中唯⼀的⼀个进程,但还存在⼀个问题,网络通信是基于二进制 0/1 数据来传输,如何告诉对方发送的数据是什么样的呢?
++网络通信传输的数据类型可能有多种++ :图片,视频,文本等。++同⼀个类型的数据,格式可能也不同++,
如 发送⼀个文本字符串"你好!":如何标识发送的数据是文本类型,及文本的编码格式呢,即程序已经收到数据了,程序如何理解数据的含义呢?
------ 基于网络数据传输,需要使用协议来规定双方的数据格式。
3.3 协议
协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的⼀组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。
协议(protocol)最终体现为在网络上传输的数据包的格式。
作用:为什么需要协议?
计算机之间的传输媒介是光信号和电信号。通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。

- 计算机生产厂商有很多;
- 计算机操作系统,也有很多;
- 计算机网络硬件设备,还是有很多;
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?
就需要有人站出来,约定⼀个共同的标准,大家都来遵守,这就是 网络协议。
即 网络协议是通信双方对于发送/接收 数据格式的约定,我的数据怎么发送的,你收到的就得怎么解析。网络通信中,网络协议非常重要,多个主机设备都能认同并遵守同一套协议,此时通信才是有意义的。
3.4 五元组
在TCP/IP协议中,用五元组来标识⼀个网络通信。
- 源IP:标识源主机
- 源端口号:标识源主机中该次通信发送数据的进程
- 目的IP:标识目的主机
- 目的端⼝号:标识目的主机中该次通信接收数据的进程
- 协议号:标识发送进程和接收进程双方约定的数据格式
进行一次网络通信,就涉及这5个非常关键的信息。

3.5 协议分层
对于网络协议来说,往往分成几个层次进行定义。
网络通信非常复杂,如果设计一个协议,完成网络通信中方方面面的问题,势必会使这个协议非常复杂,非常庞大,这是就可以将一个大的协议 拆分 ,拆分成若干个小的,功能单一的协议 ,然后把这些小的协议进行归类,也就是分层,规定:
- 只有相邻两层的协议之间可以进行交互
- 上层协议可以调用下层协议,下层协议可以给上层协议提供服务
- 协议之间的交互,不能 跨层/越级 进行
协议分层类似于打电话时,定义不同的层次的协议:
- 上层协议(语言层) 不需要了解下层协议(通信设备层) 的细节,即打电话的人,会说话就行了,不需要理解电话机的工作原理,也就是 封装。
- 分层之后,灵活的替换其中的某一层,对于整体的工作过程影响小,也就是 解耦 。
- 例如,如果通信设备层将电话机更换为无线电设备,那语言层不管它如何改变,还是照样可以打电话就行;而语言层如果切换语言协议,即变汉语为英语进行打电话,那对通信设备层也无影响,照样工作。

在这个例子中,我们的协议只有两层;但是实际的网络通信会更加复杂,需要分更多的层次。
3.5.1 分层的作用
分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接。 在代码中,类似于定义好⼀个接口,一方为接口的实现类(提供方,提供服务),⼀方为接口的使用类(使用方,使用服务):
- 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可
- 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。

3.5.2 OSI 七层协议

这一套体系太复杂了,实际真实的网络分层方式更简化,也就是 TCP/IP五层(四层) 协议模型。
3.5.3 TCP/IP 五层(四层)模型

TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,++每⼀层都呼叫它的下⼀层所提供的网络来完成自己的需求++。
- 物理层:负责光/电信号的传递方式。规定了网络通信中的一些硬件设施符合的要求,例如网线、WiFi、光猫等,物理 层的能力决定了最大传输速率、传输距离、抗干扰性等。
- 要想富先修路,物理层就是在修路的过程。
- 数据链路层:负责设备之间的数据帧的传送和识别。完成两个相邻的设备之间如何进行通信的。例如通过网线,把电脑连到相邻路由器/交换机上
- 数据链路层就是先考虑一小步怎么走,即相邻设备之间的通信,就像上课和同桌传纸条,是相邻的。
- 交换机(Switch)就工作在数据链路层,即交换机是二层设备。
- 网络层:负责地址管理和路由选择。完成两个任意设备之间的通信,这两个设备之间可能隔着很多的交换机和路由器。
- 网络层,它需要考虑通信的中间过程是怎样的,是要把纸条传到教室中不相邻的同学手上,要将纸条递给前排的同学,告诉他传给谁然后依次传递,最终到达那个同学手里,也就是说,网络层的传输,是基于数据链路层的。
- 路由器(Router)就是工作在网路层,即路由器是三层设备。
- 传输层:负责两台主机之间的数据传输,也是两台任意设备之间的通信,但是不需要考虑中间的过程,只考虑起点和终点。
- 应用层:负责应用程序间沟通,例如网络编程主要就是针对应用层。
示例:在购物软件上买一张床:
- 我只关心床到了之后如何使用 ------> 应用层
- 卖家只关心收件人信息 ------> 传输层
- 物流公司则关心包裹以怎样的路径传输的 ------> 网络层
- 快递员/货车司机考虑的是相邻节点 ------> 数据链路层
- 高速公路、船、飞机和集装箱卡车等 ------> 物理层
其中,应用程序就是工作在应用层的,而传输层和网络层是操作系统内核实现的,在写代码时最多就是调用传输层给应用层的接口,而数据链路层和物理层通过设备驱动和网络接口实现。
为何有些资料交四层模型,是因为 物理层和数据链路层是和硬件直接相关的,一方的改变可能会使得另一方也要改变,即耦合性高/不解耦。
网络设备所在分层
- 主机:它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层。通过应用程序满足网络通信的需求。
- 路由器:它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层。组建局域网,进行网络数据包的转发。
- 交换机:它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层。对路由器的接口的扩展,不需要考虑组网问题。
- 集线器:它只实现了物理层。
(真实情况,路由器和交换机功能更丰富更强大,现代的交换机很多都有路由器的功能,路由器也可以开启特殊的模式(mesh),就可以起到交换机的效果,例如,通过微信发一个数据,是属于应用层的,数据经过运营商的路由器,把内容解析出来了,此时路由器就相当于工作在应用层。
这里我们说的交换机和路由器都是传统意义上的设备,二层交换机和三层路由器)
3.6 网络数据通信的基本流程
封装和分用
网络传输的数据,本质上都是 "字符串" 或者 "二进制比特流"。(是0101 这样的数据)
1)发送消息 - 封装
我通过微信,发送 "hello" 给对方:
1. 应用程序获取到用户的输入,构造一个应用层的数据包,这个应用层数据包就会遵守应用层协议。
- 这个数据包往往是 "结构化数据",类似于C语言的结构体,有许多属性。
- 结构化数据,在发送数据的时候,把结构化数据 => 字符串/二进制bit流,也就是序列化;在接收数据的时候,把字符串/二进制bit流 => 结构化数据,也就是反序列化。
- 这个应用层协议,往往是开发这个程序的程序员定义的,假设协议格式是这样的:
- 发送者的微信号,接收者的微信号,消息的时间,消息的正文
示例数据:
2.应用程序调用传输层提供的接口(API,socket api),把数据交给传输层,传输层拿到数据后,构造出 "传输层数据包"。
- 这个传输层数据包,同样遵守传输层的协议,传输层的协议主要有两个:TCP、UDP

就像在购物软件买一件衣服,卖家发货,把衣服交给快递员,一定不是直接就把衣服交给快递员,而是带有包装的(数据包) ,有了包装之后,就可以贴标签(报头) ,这个标签也就是快递单,包含这次运输的关键信息(五元组)。
3.传输层构造好数据之后,继续调用网络层的API,把传输层的数据包交给网络层,网络层继续进行处理。
- 网络层最主要的协议是 IP协议,IP协议继续对TCP数据包进行加工,即拼上 IP报头

注意:协议本身不关心载荷中的内容是什么,例如IP协议不关心载荷内容,TCP协议也一样。协议的类型不只是一份数据,有很多层,其中 IP 报头里就会记录当前传输层使用的是哪个协议,而在传输层 TCP报头中,也会记录应用程使用哪个协议(准确的说,是数据提交给哪个应用程序),同样的,数据链路层报头中也会记录网络层使用的是哪个协议。
4.网络层构造好数据之后,继续调用数据链路层的API,把 IP 数据包交给数据链路层,数据链路层继续处理。
- 数据链路层中,核心协议是 Ethernet 以太网协议,在网络层数据包的基础上进一步加工
- 数据链层在对数据包进行进一步封装是,是有头和尾的,其他层的(如TCP,IP) 只有头,没有尾。
- 其他层的报头都是为下一跳的逻辑处理服务的,而以太网的++帧尾------也就是 FCS(帧校验序列)++,放在最后的原因只有一个:为了让硬件能在发送的同时直接计算校验码,不增加额外的存储负担。
- 谈到网络传输的基本数据单位,涉及到多种叫法/术语:
- 网络数据包/帧/报/段
- 段(segment)------ TCP使用 段
- 报(Datagram)------ UDP使用 报
- 包(packet)------ IP使用 包
- 帧(frame)------ 以太网使用 帧
- 在上述中我们都是统一叫作 报,也没有问题,日常工作中,确实不会明确区分这些概念

5.数据链路层构造好数据之后,将数据交给物理层的硬件设备(网卡),网卡会把这一串的二进制数据,最终以 光信号/电信号/电磁波信息 传播出去。
- 到这一步,数据终于发送出去了(出门了),而不是还在当前主机上转悠

以上就是发送一条消息给另一台设备所要经历的大致流程。
从上层到下层,数据都要进一步加工(添加报头),即封装。而接收消息的一方,要做的就是将二进制数据/消息 从下层到上层一次解析,也就是分用,即封装的逆过程。
2)接收消息 - 分用
接收方在收到我发的消息 "hello" 之前,需要进行解析。
注意:两台主机之间大概率不是通过一根网线直连的,中间会有许多路由器和交换机。经过路由器时,会重复经历分用和重新封装;经过交换机时则只做帧的转发,不分用也不封装。而我们现在讨论的解析过程,特指最终接收方主机从物理层一直解析到应用层的过程,不考虑中间设备的处理。
1.数据达到接收方的物理层的网卡,网卡把光信号还原为二进制0101,然后把二进制数据交给上层数据链路层。
- 物理层数据信号,和数据链路层直接相关。例如,网线/光纤来的数据 => 以太网;WiFi来的数据 => 802.11协议。

2.数据链路层按照以太网协议进行解析,把报头和报尾取出来,剩下的载荷,往上传递给网络层。
- 数据链路层数据包中,以太网报头会有专门的属性,描述网络层使用了哪个协议(IP)

3.网络层拿到数据包后,按照IP协议的格式解析,再把载荷数据交给上层传输层。
- 网络层数据包中,IP报头会有专门的属性,描述传输层使用了哪个协议(TCP)

4.传输层拿到数据后,按照TCP协议解析,取出载荷交给上层应用层。
- 传输层数据包中,TCP报头中,通过目的端口号,告知要将数据交给哪个应用程序

5.微信应用程序,解析应用层数据包,拿到关键信息,展示到界面上,并给出提示音。
- 不同的应用程序,会使用不同应用层协议来解析。
到这一步,接收方接收到了我发的 "hello",也会显示我发送的时间
虽然上述的发送接收信息过程看起来很复杂,对于计算机来说,是极快的过程。
以上封装和分用的过程说明过,不涉及中间过程,只是发送和接收方主机上的过程。现在讨论一下中间过程,也是涉及到封装和分用的。
- 交换机只需要封装到数据链路层即可,即交换机是工作在数据链路层的(二层转发) 。而路由器只需要封装到网络层即可,即路由器是工作在网络层的(三层转发)。
- 主机的数据 ------> 交换机
- 交换机接收之后,物理层解析,数据链路层解析,之后就结束了,然后原封不动将数据链路层数据包 / 以太网数据包,通过物理层转发给下一个设备(路由器/交换机)。
- 解析到数据链路层时,其中数据链路层中,解析得到的以太网数据帧的帧头,信息足以支持交换机进行下一步工作。
- 主机的数据 ------> 路由器
- 路由器接收之后,物理层、数据链路层、网络层解析,就结束了,保持网络层数据包 / IP数据包不变,接着重新构造出新的数据链路层数据包 / 以太网数据包,构造出二进制数据,最后通过物理层进行转发。