文章目录
计算机网络背景
网络发展
现有计算机再有OS,原来没有OS之前使用计算机的成本是很高的,只有科学家才可以使用,在有了OS之后,计算机的使用成本就降低了,之后计算机进入到高校里面,
在有了OS之后再有网络
我们做实验产生了数据,这个时候数据需要交给别人
当企业里面有3个人A,B,C。
A处理完数据后把数据传送给B,B在A处理完之前都在等待
B处理完数据之后把数据传给C,C在AB都处理完之前在等待
数据在来回传导
高校内部有数据研究和沟通的需求,就需要产生网络(就是为了提高效率)
如以前没有网络,我们想给一个人传递消息,就需要骑马到他那边告诉他
局域网(LAN):在同一个网段里面,这一个一个小的模块就是局域网,局域网和局域网之间可以用路由器来连接,实现跨网络传送
广域网(WAN):局域网多了就变成了广域网,但是广域网没有一个清晰的概念,一般只要存在路由器的,就是广域网或者城域网,
网络在哪里
这里的网络,指的是网络协议栈,他是一个软件,贯穿体系结构的,尤其TCP/IP他就是OS的一部分,
认识“协议”
协议:
假如说我上学在外,电话费很贵
我就和父亲做了一个约定1.我给家里打电话,响了一声,就挂掉,说明我是平安的
2. 我给家里打电话,响了两声,就挂掉,说明我没钱了
3. 我给家里打电话,响了三声,就挂掉,说明我想要和他们聊天
而这个约定其实就是协议
所谓的计算机协议,本质就是约定,而这个约定是由编码的程序员自己根据标准的文档,或者自己的喜好定义的协议
如我们在计算机中发送不同的东西,则计算机就根据这些东西由协议规定,做出特定的响应
但是两台主机之间,约定好协议就可以了吗
世界上的计算机生产商特别多,OS类型也很多,计算机的硬件也由很多
虽然都遵守了协议,但是没有办法,
所以我们就需要一个共同的标准,这就是网络协议
协议分层
举个例子:
在语言层上有两个人用汉语交流,通过通信设备层的电话机来进行交互,现在下层的逻辑不变,上层变成了说英文,但是不影响交流,仅在语言层发生了变更,但是如果底层使用的是手机,同样也可以实现相同的内容
软件分层的好处:
可以通过分层完成了一个解耦的操作,一旦解耦之后,任何一层,我们想要进行替换,就可以直接进行替换,而不会影响另一层,即便有一层当中有bug,我们只需要把问题聚焦在这一层就可以,而不影响其他层
软件分层,
无外乎就是
[代码(逻辑层面的分层)和数据(数据层面的分层,数据在不同层上面流动)]
例如:
1.一切皆文件,在linux系统管理对象的时候,肯定是先描述再组织,里面的东西都被当作文件对待了,所有的文件公共的方法,
2. 如果我又想把所有的东西都当作文件来看,所以要抽象出一个文件结构,这个文件结构的结构就是文件的结构,方法就是包含了一堆的函数指针,这个函数指针里面指向的是具体的底层的对应的方法,这取决于我们底层是什么样子,这个就是一切皆文件的软件结构
分层最大的好处在于“封装”,面向对象例子
OSI七层模型与TCP/IP四层模型
- OSI(开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范。
(逻辑上就是没有真实存在,而是用代码或者其他的方式抽象模拟出来的,例如进程的虚拟地址空间,在进程角度,它认为它拥有这么多的空间,而实际上是操作系统模拟出来的)
这个实际上就是:硬件上不实现,通过软件上来实现,软件上实现,就是增加一些软件层,来实现,mm_struct (虚拟地址空间),一切皆文件里面的很多函数调用方法,它实际上也是软件层面上的实现
- 物理层:负责光电信号,
(计算机软件怎么通信,设计的再怎么绚丽,我们都要在现实当中跑的,例如我们打游戏的时候,一些英雄人物技能多么的酷,这在底层实际上都是一些2进制数据,要么传输,要么展示,要么计算,反正都是2进制数据,在硬件层面上,我根本就不知道这些0,1序列是什么意思,你只需要告诉我,要传多少的光电信号,好比我今天进到公司里面,你帮我把这个功能实现一下,可是我不知道这个函数这个功能在公司整个业务层面上代表了什么呢,我也不关心,在公司方面,每个人结构就是层状结构,)
传多少光电信号,什么时候传,我只需要照做就可以了,不需要多问,光电信号传的距离够不够远呀,信号够不够呀,就是纯硬件的,2进制序列是以什么样的形式传过去,是以模拟信号还是数字信号,无线wifi,波形,区段,频率应该选择什么样子的,那么这个就是物理层:
决定的就是通信过程中的一些物理层面的东西,比如最大传播速率,传输距离,信号抗干扰性,
集线器(Hub)【光电信号开始的时候有自己的初始能量,传输距离有限,能量会衰减,相隔千里之外也能听清楚,把信号衰减又把他放大,这叫做集线器】
- 数据链路层:就是特定硬件匹配的驱动模块,设备和设备之间的识别:
例如网卡的设备驱动,帧同步(从网线上检测到什么信号算作新帧的开始),冲突检测(如果检测到冲突就重发),数据的校验;有以太网,令牌环网,无线LAN,交换机(switch)工作在链路层,软件工作(和硬件强相关)- 网络层:负责地址管理和网络管理和路由选择的,IP协议中,通过路由表的方式规划处两台主机之间的数据传输线路(路由),路由器(router)
- 传输层:负责两台主机之间数据的传输,TCP,UDP
- 应用层:负责应用程序之间的沟通(http,ftp)
一般而言:
- 对于一台主机,其操作系统的内核实现了从传输层到物理层之间的内容
- 对于一台路由器,它实现了从网络层到物理层之间的内容
- 对于一台交换机,它实现了从数据链路层到物理层之间的内容
- 对于一台集线器,它实现了物理层的内容
越上层的应用它所包含的层就越复杂,越多
我们从实际角度上介绍一下TCP/IP模型每一层都做些什么
例如我们在网购买东西,下单之后,卖家下楼把货物进行包装(这个就是封装),再之后,就填写快递单号(相当于给数据添加报头),这发送出去之后,这个快递卖家就不管了(每一个层只需要处理自己的事情,不需要去处理别的层做的事情),之后就都是快递公司的事情了,快递一个一个发送给下一个(数据链路层决定的,数据链路层决定下一跳要去哪里),走山东云南,福建(这个就是网络层决定的,路径规划)。快递丢了的话,我们就重新给你发一封(传输层,保证可靠性,传输控制),
有一个误区:数据传送给对端,事情就结束了,但是对于数据的使用,才是最终的目的,如何分析和使用传输过来的数据,下三层是处理怎么拿到数据,应用层是处理怎么处理这些数据,
局域网
每一层都认为自己发送的数据都是对端层直接收到的
这个图重点讨论的是局域网通信的TCP/IP属于OS,链路层是在网卡驱动层面上的,下三层解决通信细节,用户并不关心这些东西,应用层主要处理应用程序的细节,(如我是应用层,我收到了快递盒子,用小刀把快递盒子切开,我们里面的洗面奶一次用多少,这是我对洗面奶这个应用处理的细节)
局域网中的两台主机能直接通信吗?
在局域网中数据必须贯彻四层,到最底层的以太网,通过以太网驱动程序,以太网协议到达对端的数据链路层,从以太网里面回到服务器上面
而对于同等的层,它会得到同样的报头加报文,所以在每一层看来,每一层都认为,我发什么数据对方就收什么数据,这个就是左侧封装的过程,右边叫做解耦的过程,这也是一种逻辑上的概念,这叫做在应用层是同等层,只要我们有网络,我们都是直接沟通,技术上就是封装
报头
如何理解报头:
(什么是报头,为什么要有报头)
所有的快递盒子上面都有快递单,这个是贴在盒子上的,发货人谁,收货人是谁,重要的是格式和数据,单子类似于快递的报头,因为如果没有的话,就不知道谁发的,也不知到发给谁,无法得知该快递该如何派发,指导我们来进行派发
需要报头中的数据来指导当前层进行我们的某种协议决策,如何处理这些报文,传输层报头指导如何进行数据传输,网络层指导如何进行下一个路径,链路层报头指导如何进行下一跳,实际上我们根本不需要这些快递单,我只需要物件,这叫做解包的过程,我发货物,填上单子,指导我们进行某种协议决策的,
在OS中如何理解报头和数据呢
如何理解报头和有效载荷
- 在当前层中,报头叫报头,报头的后面叫做这个报文的有效载荷,
- 报头是数据吗,是一种结构化的数据,既然大家都是数据呢
- centos OS 如何理解封装和解封,linux OS是C写的,站在语言角度,如何理解封装和解包呢?
我们随便定义一个报头
这就叫做位段,网络里面就是位段类型struct my_hdr { unsigned int src:16;//占16个比特位 unsigned int dst:16;//目的地址 unsigned int type:8;//报文的类型 unsigned int len:24;//报头的长度 } struct my_hdr my;//定义一个位段变量,定义了一个报头,要开空间,结构化的数据 my.src=0x1; my.dst=0x2; my.type=0x3; my.len=0x4;
添加报头,这些位段都写好了之后,我们有一个数据(你好,把这个位段拷贝到你好这个空间的前面就可以了,把一个位段拷贝进一个缓冲区,可以采用memcpy或者memmove2进制拷贝,把一个变量拷贝进一个数据当中,这就是报文,其他报头也是类似的,这就是封装的过程)
4. 如何理解解包
我们可以定义一个指针指向这个报头的头部,例如void* ptr,我们要拿这个报头,只要把这个 ptr强转成(struct my_hdr*),即可,就能够访问里面的内容数据了,((struct my_hdr*)ptr)++,就能够去掉报头了,后面就是有效载荷
- 几乎每一层协议的包头中,都要包含两种字段:
- 当前报头的有效载荷要交付给上层的哪一个协议(分用的过程,解包分用)
- 几乎每个报头都要有一个属性,明确报头和有效载荷的边界,解包的时候,不能多解和少解,是我们学习所有的协议的共性,
跨网络
以太网
左右两个主机因为是经过路由器连接,所以两个主机并不在同一个局域网,并不在同一个网段,但是主机A和路由器,主机B和路由器,彼此之间是在一个网段的,就相当于中间的话事人,这样就能让A和B进行沟通,
局域网(以太网)基于碰撞检测的方式
同一个局域网之间为什么能通信:
原理类似于上课,局域网中的网络资源被大家共享的,发送的消息所有人都能收到,但是里面有地址,mac地址,标识对应 的人物,对比的时候发现不是我的,就直接舍弃,只有接收者收到这个信息在,这就像发数据的过程,
如果同时发送,可能发生数据碰撞的问题,这样的话就同时往公共资源里面发消息,只能说的是判断有没有发生碰撞,每台主机都要有碰撞检测的能力,还要能够正常通信,每台主机都要有碰撞避免算法,等一等,动态调整,这样就可以几乎只有一个主机发送,这里面都在数据链路层帮我们做:局域网中任何一个时刻都只能有一台主机发送消息
可以将网络资源理解为临界资源,网络系统也是有互斥的机制的
如果我想攻击这个网络,就一直往局域网发送数据,占用临界资源,造成了其他主机的饥饿问题
令牌环
相当于每个主机要进行传导数据,只有传导数据的人才可以获得令牌,发完之后,再把令牌给下一个人,这就相当于互斥锁里面的锁
mac地址
全球内唯一的网卡中的序列号,48位的mac地址更多做局域网标识,
每台主机都有其Mac地址,路由器也是一个主机,也有Mac地址
如何理解IP:
- 从哪里来到哪里去(几乎一直不会变化的地址):IP地址
- 上一站从哪里来,下一站要去哪里(一直在变化的地址):Mac地址
所以我们在传输数据的时候,目的IP一直不变的,而Mac地址一直都在变化,在数据链路层,经过路由器,一直在进行解包和重新封装,
inet是内网地址
我们站在IP网的角度,发送的有效载荷都是一样的 因为有ip网络,所以它帮我们屏蔽了底层网络的差异(因为有路由器的存在,看不到底层路由器的差异),IP就是局域网中的一个虚拟化技术,跨网络传送的技术,
网络中的地址管理
认识IP地址
IP协议中有两个版本,IPV4和ipv6,我们现在所提到的IP协议,没有特殊说名的都是ipv4
- ip地址是在ip协议中,用来标识网络中不同主机的地址
- 对于IPV4来说,IP地址是一个4字节,32位的整数
- 我们通常也是用“点分十进制的方式”来表示IP地址,如192.168.0.122,每一个点都是分割一个字节,范围在0-255之间
认识MAC地址
- MAC地址用来识别数据链路层中的相连的节点
- 长度是48个字节,6个字节,一般用16进制加上冒号形式表示(08:00:27:35:11:12)
- 网卡在出厂的时候就已经确定了,不能修改,mac地址是唯一的(虚拟机里面 的mac地址就不是真实的了)
理解
可以这么理解假如说主机A 是一个学生要去找主机B是另一个学生都住在4楼,它要给b寄送东西,路由器相当于另一个楼,2楼里面有保安,A要送东西,要下楼,找到路由器1,上楼2楼,找保安,保安称不知道,又下楼,继续找路由器2,上楼下楼,最后到路由器3保安才知道b的地址,我继续下楼,到b的地方,上楼到4楼,把东西给它