Linux:网络基础
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:网络基础》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 !
如果本篇文章对你有帮助,还请各位点点赞!!!
话不多说,开始正题:
文章目录
- 1. 初识协议
- 2. 协议分层
- 2.1 软件分层的好处
- 2.2 OSI七层模型
- 2.3 TCP/IP 五层(或四层)模型
- 3. 重谈协议
- 3.1 网络和操作系统的关系
- 3.2 到底什么是协议
- 4. 网络基本流程
- 4.1 局域网通信原理
- 4.1.1 问题1 ---- 为什么要做那么多的封装?
- 4.1.2 问题2 ---- 主机2是怎么知道网卡收到数据的?
- 5. 跨网络传输流程图
- 5.1 网络中的地址管理-认识IP 地址
- 5.2 MA vs IP?
- 5.3 为什么要交给路由器?
- 如果路由器也不认识这个IP地址怎么办?
- 5.4 网络里一切皆IP
1. 初识协议
协议就是约定,好比如摩斯密码,约定长短信号,不同组合形成不同信息,对于计算机,通过频率和强弱来表示0和1,要想传递不同的信息,就需要约定好双方的数据格式
每种计算机都不一样,你的网卡和我的网卡未必一样,你是大端机器,我是小端机器,你是以四字节对齐,我是以八字节对齐……等区别,都需要很多协议(约定)来消除差异化,消除硬件和软件上的差异化
所以协议不仅仅是网络协议,硬件上软件上都是有协议的,协议是需要不同的公司在各自的领域上制定,那世界上这么多硬件厂商,凭什么要听你的呢?所以,就必须要有人站出来指定标准,对于网络就是网络协议
抛开网络,计算机自己也有协议,磁盘和内存也存在协议,要怎么读取,读多少,读到什么位置,磁盘里的LBA地址都是需要底层的工程师来帮助我们做驱动程序,这些也是协议,所以协议在计算机里无处不在!
2. 协议分层
协议本质也是软件,在设计上为了更好的模块化、解耦合,也是被设计为层状结构
2.1 软件分层的好处
举个例子:我们在打电话的时候,对于不同的视角,认为的通信方式是不一样的:
- 小白视角:我们两在直接通信,同层协议直接通信
- 工程师视角:我们两并没有直接通信,同层协议并没有直接通信,是各自使用下层提供的结构能力(电话),完成通信
所以我们往往会忽略掉下层提供的结构,这就是分层的作用,解耦合的最佳方式!
为什么一定要解耦合?是为了可维护性,我在下层进行更新修改,并不会直接影响其他层,可维护性大大提高!
2.2 OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了 7 层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来讲解
- 其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议。
2.3 TCP/IP 五层(或四层)模型
TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇
TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准交换机(Switch)工作在数据链路层
- 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层
为什么要有TCP/IP协议?
先讲讲我们计算机内部,实际上也是网络,你的键盘、显示器、内存、CPU……交互也是有协议的,但是这些硬件也就几十厘米及厘米的距离,一条线的事情,所以问题就不大,但是我的主机和你的主机进行交互,比如我在广东,你在上海,这个距离就很远了,就会引发新的问题,就好比本来在一个学校谈恋爱的情侣,因为某种原因变成了异地恋,必然会引入新的问题,所以要解决问题就要引入新的协议
TCP/IP协议也就是问题的解决方案
- 可是目标主机和我距离太远了,我要发数据给主机,得先发到路由器吧?怎么办? ---- 物理层问题 ---- 链路层问题
- 网上这么多主机,怎么定位并找到主机呢?怎么办? ---- 网络层问题
- 如果我的数据发出去,丢失了?怎么办? ---- 传输层问题
- 发送数据并不是目的,处理和使用数据才是目的,怎么办? ---- 应用层问题
所以这些不同性质的问题,就要引入不同的解决方案,所以协议就天然是分层的
3. 重谈协议
3.1 网络和操作系统的关系
操作系统可以不同,但是他们实现的网络协议栈必须是服从TCP/IP
协议的,如上图,网卡对应底层硬件,数据链路层对应驱动程序,传输层和网络层对应操作系统内核,应用层对应用户接口操作(传输层往上一律称为应用层)
所有的主机上面安装的操作系统可以不同,事实也就是不同但是所有的主机上面的协议栈必须按照标准进行相同的实现,这就是为什么不同的主机,可以互相通信的秘密!
对于网络协议栈,最核心的就是传输层和网络层,这两层最典型的协议就是TCP/IP协议
,所以整个网络协议栈统称叫做TCP/IP协议
可以看出来,整个协议栈,即涉及到硬件,又涉及到驱动,又涉及到OS,甚至用户,所以,这个协议一定是需要IT各行各业都要进行支持和配合
3.2 到底什么是协议
对于整个操作系统,肯定包含很多种不同的协议,那必须是要管理起来的,怎么管理呢?---- 先描述再组织!
首先我们要明白,不论是什么操作系统,底层的代码都是通过C语言实现的,所以TCP/IP协议
也是C语言写的
假设Windows有这样一层网络代码:
struct protocol
{int a;int b;int c;
};
struct protocol data = {10,20, 30};
Windows要向Linux传输struct protocol data = {10,20, 30};
这么一段数据,Linux要想得到最终结果10,20,30
,是不是也要有上述代码一样的结构体类型
现在说白了TCP/IP协议
就是结构体,但是怎么实现的结构后续再说,所以Windows和Linux的网络代码就是一样的,这就是约定!!
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型
所以将来我们要写协议实际上大部分时间就是写结构体或者类
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议,举个例子:快递
在发快递给别人的时候一般都要填一个单子,这个单子一般要写收货人和收货地址等信息,快递员会通过单子将快递送到对应的人手中,收货人会根据单子确认是否是自己的快递,所以这张单子就是约定好的结构体类型,发送方认识,接收方认识,单子也就是网络通信里的协议报头,快递内容就是报文,接收方会根据协议报头判断是什么内容然后对报文进行解包,当然了解包都是后话了
4. 网络基本流程
4.1 局域网通信原理
在同一个局域网内两台主机是能够直接通信的,是怎么做到的呢?举个例子:
在课堂上老师说:“张三,你的作业怎么没做,你给我站起来?”全班同学都听到了,但是只有一位同学站了起来,那同学就是张三,明明全班同学都听到了,为什么只有张三站了起来,这不废话吗,因为老师叫的是张三,其他同学不是张三,所以不站起来。张三回复老师:“老师,我做作业了,只是你没看,你去看看吧。”老师就把作业拿出来看,全班同学都听到了,为什么其他同学不去看呢?那是因为张三叫的是老师,其他同学并不是老师。
局域网通信实际上所有在局域网的主机都收到信息,但是局域网内每台主机都有唯一标识来标识自己唯一性的MAC地址
,大家会通过MAC地址
判断这个信息的报头是否和自己的一样,不一样就丢弃掉
如图是在Linux下我的MAC地址
- MAC 地址用来识别数据链路层中相连的节点
- 长度为 48 比特位,及6 个字节.一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了,不能修改.mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址,可能会冲突;也有些网卡支持用户配置 mac 地址)
如上图主机a发信息给主机e,实际上就是将蓝色的报文扔到以太网里让各个主机去认领,也就和我上述举的例子:课堂上老师叫张三站起来一样,局域网内所有主机都收到了信息,但是大家在比对MAC地址
的时候发现并不是发给自己的,直接丢弃掉,(是在数据链路层进行判断的,也就是硬件上网卡是收到信息的),由于数据链路层丢弃了,所以上层并不知道收到了信息,用户层就没有感觉
但是整个以太网中只能有一份报文,就像课室里如果大家都在相互通信,那么可是就会变得乱糟糟的,谁也听不见谁说什么,在局域网里就是数据发生了碰撞,所以主机在发送数据会进行碰撞检测和碰撞避免,如果检测到发生碰撞了就会自动休眠一会再发送
这些操作实际上就是保证只有一台主机能够在以太网里进行发送消息,那么我们换个理解,以太网就是临界资源!!!
上图左侧用户A想要发送消息你好
,就要经过应用层、传输层、网络层、数据链路层
进行封装报头,每一层的报头不就是每一层的协议所约定的数据类型吗?我们上述所讲的MAC地址
的判别就是在链路报头判断的,封装完成后就通过网卡发送到局域网内(以太网),主机2的网卡就收到信息,然后向上进行解包分用,最终用户B就收到了你好
信息
认识新定义:报文 = 报头 + 有效载荷
如:传输层报文 = 传输层报头 + 传输层有效载荷、网络报文 = 网络报头 + 网络有效载荷
同层协议是能够相互识别的,所以主机2收到消息第一件事就是报头和有效载荷进行分离,这个操作就是解包
报头内部,必须包含一个字段,叫做交给上层的谁的字段 ---- 分用(即未来要将自己的有效载荷交付给谁)
同层之间都认为在直接跟对方通信
4.1.1 问题1 ---- 为什么要做那么多的封装?
因为我们要将信息交给网卡,让网卡把信息扔到以太网中,网卡是硬件,而操作系统是硬件的管理者,所以就要调用系统接口,也就必然要贯穿整个操作系统
4.1.2 问题2 ---- 主机2是怎么知道网卡收到数据的?
答案:中断
发送中断后就自然要进行解包分用!
5. 跨网络传输流程图
5.1 网络中的地址管理-认识IP 地址
IP 协议有两个版本,IPv4 和 IPv6 ---- 本文章,凡是提到 IP 协议,没有特殊说明的,默认都是指IPv4
- IP 地址是在 IP 协议中,用来标识网络中不同主机的地址;
- 对于 IPv4 来说,IP 地址是一个4 字节,32 位的整数;
- 我们通常也使用点分十进制的字符串表示 IP 地址,例如 192.168.0.1;
- 用点分割的每一个数字表示一个字节,范围是 0-255;
5.2 MA vs IP?
假设小明要从城市A到达城市E,途中要经过B、C、D城市,那么小明到达城市B就问人,我从城市A来,要去城市E,该怎么走,人就回答说:“你下一站是去城市C。”以此类推最终到达城市E,如下图:
每一座城市就相当于一个路由器,下一座城市是哪里就根据路由器的算法决定,如何路由就根据目的IP地址进行的!
城市A和城市B在同一个局域网,所以能够将信息传给城市B,城市B和城市C在同一个局域网,所以能够将信息传给城市C,以此类推,最终能够将城市A的信息传给城市E,那能不能这么理解,相当于有很多个局域网连在一起,然后相互通信?
这样理解并不对,因为我们后面还要涉及广域网和运营商是如何让我们通信的,但是我们目前就这么理解就好了
竟然要在同一个局域网内通信,那必然少不了MAC地址
小明到达城市C的时候,城市C会不会关心小明上一站是在哪里呢?并不关心,城市C只关心你最重要去哪里,也就是关心小明的目的IP地址,所以,一般而言,MAC地址只在局域网中有效! 一般而言,IP地址是不会发生变化的!
跨网段的主机的数据传输,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
令牌环协议简单来讲就是在网络中谁拥有令牌环谁才能讲话,就和我们的锁一个道理
如图,左侧为主机A,右侧为主机B,主机A和路由器在同一个局域网,主机B也和路由器在同一个局域网,但是两个主机的网络协议并不一样,所以路由器要同时拥有两种驱动程序,并且因为要在两个局域网内,所以路由器要拥有两张网卡
5.3 为什么要交给路由器?
主机A在局域网内这么多主机,怎么知道要交给路由器?别忘了主机A自己也有网络层,也有路由功能,在子网内有自己的IP地址
在同一个局域网内,IP地址的前缀是一样的!
所以,主机A拿着自己的IP地址和目的IP地址进行比对,发现根本就不相似,所以就交给路由器
主机A是怎么找到路由器的?当我们想要上网的时候,首先第一步就是连接路由器,然后才能上网,所以实际上就是路由器给你上网,你在局域网内的IP地址实际就是路由器给你分配的,是路由器给你搭建的子网,这给我们后续文章子网划分会讲解!
所以你在首次链接路由器的时候会记录下路由器的MAC地址,自然就能够找到路由器
路由器也是一台主机,所以路由器也要对收到的信息进行解包分用
所以,主机A对数据进行封装完毕之后就把信息发送给路由器了,那么路由器得到主机A发送的信息,解包分用后在网络层决定下一跳去往哪里,然后在数据链路层再一次对数据进行封装,再发送给目的IP地址的主机B
网络层,全网同一层拿到的报文是一样的!是统一的!
如果路由器也不认识这个IP地址怎么办?
那就交付给路由器连接的路由器,也就是往更上一层的路由器交付
5.4 网络里一切皆IP
在很久以前,世界上有很多子网,但是每个子网的底层实现都不一样,由于时代需要各个子网能够相互通信,所以新加一层软件来屏蔽底层实现差异,也就是网络层,网络层通过IP进行下一跳,所以能不能这么理解,网络里一切皆IP,IP之下各有差异,IP之上没有差异!
所以为什么要有MAC地址又有IP地址?这是因为历史的发展,实际上我们能够实现直接根据IP来进行跨网络通信,但是要尊重历史,而且没必要,一改就要花费很大功夫,而且没有什么收益
你学会了吗?
好啦,本章对于《Linux:网络基础》的学习就先到这里,如果有什么问题,还请指教指教,希望本篇文章能够对你有所帮助,我们下一篇见!!!
如你喜欢,点点赞就是对我的支持,感谢感谢!!!