文章目录
一、计算机网络背景
1.1网络发展
在计算机发展初期,计算机之间相互独立,每个终端各自持有数据,这明显对于数据的共享很不友好,为了高效的数据传输和共享,世界各地的科学家、实验室就开始想办法提出自己的解决方案用来解决多设备数据共享的问题,所以在这一阶段形成了网络互联的概念,在这一阶段,不同设备之间可以进行数据共享,那么随着设备的增多,技术的发展,就产生了局域网,广域网这样的技术概念,那么具体的内容我们我们慢慢抽丝剥茧学习,这部分只是有一个网络发展的概念就行。
1.2认识“协议”
我们之前说为了解决多设备之间数据共享的问题,世界各地的实验室、科学家们提出了诸多解决方案,而这个数据通信的解决方案其实就是协议。
协议可以理解成一种约定,即通信双方提前约定好通信的数据格式,在通信过程中双方基于该数据格式进行通信,站在语言角度理解协议就是通信双方都能识别的结构体数据类型。
但是这时就存在一个问题,计算机的生产厂商有很多,操作系统也有很多,衍生的网络硬件设备也有很多,那么如何让这些不同厂商之间生产的计算机都能相互顺畅的通信呢,所以这时就需要标准的存在,而这个统一的标准就是网络协议。
当今的网络协议是OSI(Open System Interconnection)提出的OSI七层模型。
为什么网络协议要分层?
联想到我们之前对于分层的理解,分层一般是为了可以松耦合,层与层之间不会有太多的联系,方便后期维护。
比如:当物理层发生变化时,我们只需要改动物理层的代码,其他层次的代码无需改动。
为什么存在网络协议?
首先客观事实是,通信距离变远,必定会引发新的问题:
- 如何使用数据的问题;
- 可靠性问题;
- 主机定位问题;
- 数据报局域网转发问题。
那么以上这些问题我们都会在后面的学习中有所体现,简言之网络协议的不同层次可以分别解决上述的问题。
二、网络协议初识
2.1OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是,它既复杂又不实用,所以我们按照TCP/IP四层模型来讲解。
分层名称 | 功能 | 每层功能概述 |
---|---|---|
应用层 | 针对特定应用的协议 | |
表示层 | 设备固有数据格式和网络标准数据格式的转换 | |
会话层 | 通信管理、负责建立和断开通信连接(数据流动的逻辑通路)、管理传输层以下的分层 | |
传输层(TCP) | 管理两个节点之间的数据传输、负责可靠性传输(确保数据被可靠地传送到目标地址,即数据传输可靠性) | |
网络层(IP) | 地址管理与路由选择(路由器) | |
数据链路层 | 互联设备之间传送和识别数据帧(交换机) | |
物理层 | 以0/1代表电压的高低以及灯光的闪灭、界定连接器和网线的规格(集线器、调制解调器) |
为什么上面我们说是TCP/IP四层模型呢?
OSI七层模型是非常优秀的网络协议,但是对于应用层、表示层和会话层,一般这三个层次被统一称为应用层,原因大概是因为这三个层次如果分开实现会引发其他问题导致问题复杂,这三层一般是由用户实现。
对于物理层我们一般不关心,所以在软件的角度考量,我们认为是OSI四层模型就可以,或者带上物理层称为OSI五层模型。
2.2OSI五层模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层。
- 数据链路层: 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。 有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
- 网络层: 负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 传输层: 负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层
数据链路层解决数据报局域网转发问题,该层一般集成在网卡驱动程序中实现。
网络层解决主机定位问题。
传输层解决可靠性问题。
应用层解决如何使用数据的问题。
网络层和传输层集成在OS内部实现。
即操作系统源码中包含有实现网络层(IP协议)和传输层(TCP协议)的代码。
这两个层次合起来也称为TCP/IP协议栈。
所有的操作系统只要入网,就必须遵守TCP/IP协议栈,保证不同主机之间的数据通信。
虽然操作系统千千万,但是操作系统中TCP/IP协议栈的内容一定是一样的,这也就是为什么不同设备间可以进行通信的缘由。
所以你知道了网络也是OS源码的一部分,所以应用层想要使用网络,就必须存在有系统调用接口,而将这些系统调用进行封装就形成了网络库。
三、网络传输基本流程
3.1局域网通信
场景:A设备给C设备发送数据。
实际上,B设备也受到了A设备的数据,但是B设备查看时发现不是发给自己的消息就忽略了,而C设备收到分析后发现是发送给自己的数据。
即局域网中所有主机都受到了消息,经过对比Mac地址后确定通信双方。
区分不同设备的依据是Mac地址,不同设备有不同的Mac地址。
MAC地址(Media Access Control Address),也称为物理地址或硬件地址,是一个用来确认网络设备位置的地址。在OSI模型中,MAC地址位于数据链路层,它使得数据可以从源网络介质发送至目标网络介质,从而进行可靠的数据传输。
MAC地址具有以下特点:
- 唯一性:MAC地址是全球唯一的,每个网络设备(如网卡、路由器、交换机等)都有一个唯一的MAC地址。
- 固定性:MAC地址是写在网卡上的,一般来说是固化在网卡上的EEPROM(电可擦写可编程只读存储器)中,可通过网卡驱动程序进行配置。
- 层次化:MAC地址由六组两个十六进制数(共六个字节)组成,用冒号(:)或者连字符(-)分隔。前三个字节称为组织唯一标识符(OUI),用来标识厂商或组织;后三个字节由厂商自行分配,标识网络设备。
在发送数据和接收数据的过程中,可能会发生数据碰撞(一个局域网就是一个碰撞域),这是因为局域网可以被视为一种临界资源,在任何一个时刻,仅允许一个设备向局域网中发送数据。
- 如果数据链路层是以太网的标准,那么以太网通信标准中(碰撞检测与避免),当设备A发送数据发生数据碰撞后,设备A就停止发送,让出局域网这个临界资源供其他设备使用,其他设备皆是如此,所以以太网的处理方式可以认为是一种乐观的处理机制,因为同一时间有两个设备同时发送数据的概率并不高。
- 如果数据链路层是令牌环网的标准,那么局域网中会存在一个令牌,谁持有令牌谁可以发送数据,有点类似持有锁。
所以思考下:局域网中,主机越多越好还是越少越好?
当然是越少越好,越少就意味着更小的数据碰撞可能性,当主机数目变多后,会存在有交换机这样的设备来解决处理。
如果要黑掉一个局域网,就不断地向该局域网中发送垃圾数据🤐。
3.2网络传输流程
不跨子网的网络传输
当设备A向设备B发送数据时,报文并不是直接发送过去的,而是需要自顶向下进行封装,即添加每一层的协议报头,然后到达链路层后将封装后的数据报文发送给以太网。
报文=协议报头(快递单)+有效载荷(快递)。
报文不断被自顶向下进行交付的过程,需要添加每一层的协议报头,叫做封装。
而当报文经过以太网传输到设备B时,需要解析报文,解析报文需要两个步骤:
- 将报头和有效载荷分离;
- 判断将有效载荷交付给上层的哪一个协议(每层可能存在有不同的协议,比如传输层可能存在有TCP协议和UDP协议)。
这两个步骤被称为:解包与分用。
协议报头中包含了类似报头有多长,载荷有多长,上层协议是什么等信息。
通过上述数据传输流程,逻辑上:同层协议都可以认为自己在和对方直接通信。
不同协议层对数据包有不同的称谓:
- 应用层:request/response;
- 传输层:数据段;
- 网络层:数据报;
- 链路层:数据帧。
跨子网的网络传输
当网络传输跨子网时,我们需要路由器来进行转发。
路由器一般至少要横跨两个子网,这句话表明路由器要有两张网卡,有两个mac地址。
报文一般会存在有两套地址:
- src(源IP地址)、dst(目的IP地址);
- 上一站从哪来(源mac地址)、下一站到哪去(目标mac地址)。
很明显第一套地址基本是不变的,因为数据传输一定有明确的通信双方,这个不变的地址也是路径规划的依据。
存在一些特殊情况,比如在数据传输过程中使用NET技术,其源IP地址会发生变化,但至少目的IP地址是不会变化的。
而第二套地址即mac地址在跨子网的情况下是会变化的,当数据跨网络到达另一个局域网时,其源mac地址和目的mac地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉**(解包),然后再重新封装一个报头(重新封装)**,此时该数据的源mac地址和目的mac地址就发生了变化。
而这个过程最重要的是:通过IP协议,我们能够在不同子网间进行通信,无需关注底层的MAC地址变化。IP地址是网络通信的关键,它确保了数据能够准确地从源地址传输到目的地址。
3.3网络中的地址管理
IP地址
- IP协议有两个版本,IPv4和IPv6。
- IP地址是在IP协议中,用来标识网络中不同主机的地址;对于IPv4来说,IP地址是一个4字节,32位的整数;
- 我们通常也使用"点分十进制"的字符串表示IP地址,例如192.168.0.1。用点分割的每一个数字表示一个字节,范围是0 - 255;
MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)。
在linux操作系统中,我们可以采用ifconfig -a
指令来查看mac地址:
ether的意思:以太,证明我的云服务器数据链路层采用的是以太网标准。
幸福从来不曾远离我们,只是有时候它会用试探的方式,看我们还在不在意。 —朱德庸