在最开始没有网络的时候,人们想要将计算机上的信息进行传送时,会使用软盘拷贝数据然后到另外一个电脑进行读取。在后来,电脑之间就直接使用线进行连接,数据通过线进行传送,这就是局域网的雏形。
由于这个线在当时是所有主机共享的(因为是多台主机连接在一条总线上),主机数据进行传输的过程中就会发生冲突,比如你发送信息的同时其他人也在发送信息。主机越多,发生冲突的概率就越高。这也就意味着需要各种设施来解决这个问题。
而在讲怎么解决这个问题之前,需要先了解一下计算机网络里面重要的几个概念:
1、什么是网络协议,为什么要有这个网络协议
2、OSI七层模型是什么
3、网络传输的基本流程是什么
网络协议
协议通俗理解就是一种约定(数据层面上的约定)
两台计算机通过协议可以理解对方的消息,比如双方都知道1表示正常工作,2表示正常更新
其实协议就是通信双方都认识的结构化的数据类型
有了网络协议,就算制造计算机的厂商有很多,计算机操作系统有很多,计算机网络硬件设备有很多,这些由不同厂商制造出来的计算机仍然能够相互顺畅的通信。
这也是为什么需要有网络协议的原因
协议分为
1、硬件级别的协议(本篇不对此做过多讲解)
2、软件级别的协议
而我们之后要讲的OSI七层模型,就是通过协议分层进行对问题的分层解决 ,可以将协议分层类比软件分层(从代码到函数到类)
主要是因为协议本身也是软件,而软件的设计模式就是层状结构
网络传输中的问题
1、数据在两个相邻之间的设备怎么进行传递
2、目的地怎么进行定位,路径怎么选择
3、出现数据丢失怎么办(比如中间某个设备坏了)
4、传过去之后,主机B要如何处理这个数据
为什么会产生这些问题
计算机内部本身其实也是一个网络
但是由于计算机内部的网络结构 距离短,上述很多问题都不存在(里面照样有协议,但不是网络协议,因为网络里很多问题它不存在)
而对于计算机之间,物理距离变长了,就产生了上述的很多问题
为了要解决问题:就有了网络通信协议------TCP/IP协议
所以说网络通信协议本质是一种解决方案
为了解决问题,就有协议,为了更好的解决问题,协议就进行了分层
比如对于第一个问题(数据在两个相邻之间的设备怎么进行传递)属于网卡层需要解决的,第二个问题属于互联网层要解决的问题,第三个问题属于传输层的问题,第四个问题就属于应用层的问题
OSI七层模型
OSI(Open System Interconnection) 称为开放式系统互联参考模型,是一个逻辑上的定义和规范
它把网络从逻辑上分为七层,本质是一种框架性的设计方法
最大优点是将服务、接口和协议这三个概念明确地区分开来,通过七个层次化的结构模型使不同的系统不同的网络直接实现可靠的通讯。
协议:同一层之间使用的规定,利用这个规定来进行同层之间数据传输
接口:下层给上层提供的入口,上层不需要知道下层怎么干活
服务:下层给上层的承诺,定义下层可以给上层做什么

虽然OSI七层模型做的很好,但是由于它复杂又不实用,实际上使用的更多的是TCP/IP四层模型
分别是 网络接口层(物理层+数据链路层)、网络层、传输层、应用层

TCP/IP协议与操作系统的关系
TCP协议是传输层的,IP协议是网络层的
协议栈最重要的部分就是传输层和网络层,所以也将这一整个模型叫做TCP/IP五层(或四层)模型
1、物理层,也就是网卡就是底层硬件
2、数据链路层在驱动程序中
3、网络层和传输层两层被集成在内核中
4、应用层就在OS上层,由用户实现
传输层/网络层必须遵守TCP/IP,就代表即便操作系统不同,网络协议栈也是相同的
这也就是为什么不同操作系统的主机之间可以直接通信
网络传输基本流程
局域网通信
两台主机在同一个局域网,是能够直接通信的
在一个局域网内,一个主机向另一个主机发送信息时,其它在局域网内的主机也能收到信息,并且只允许只有一个主机发送消息(以太网)
用来标识自己的标记就是mac地址 (一个48比特位的地址),硬件固定,一张网卡 一个mac地址
局域网和以太网什么关系
网络最初只有局域网,不同实验室都会搞自己的局域网,一些局域网就保留了现在,比如以太网、令牌环网
以太网就是具体的一个局域网
数据碰撞
以太网的本质就是一整个碰撞域
到这里就可以解决开头的问题了,关于主机越多,发生冲突的概率越高的问题,在以太网内就是利用碰撞检测和碰撞避免的机制来解决的
任何主机都能进行碰撞检测
一旦检测到碰撞就需要执行碰撞避免算法,就是自己不再说话,其它主机,就可以趁空发送,然后过一段时间,主机再次发送
以太网通信,就是基于碰撞检测和碰撞避免的不断重试的过程
主机越多发生碰撞的概率越高(人越多网越卡)
以太网就是共享资源,碰撞检测就是为了维护以太网在任何时刻只能被一个主机使用(相当于保护临界区)
上面讲的是物理层和数据链路层在局域网的作用
主机a给主机b发送消息是用户触发的,是用户想发消息,数据往下传传到网卡

其中不管是收数据还是发数据都需要硬件来操作,这就代表只要用户想要发送消息,该数据就必须要贯穿协议栈,再由网卡收到信息往上给到用户
同时因为每层都有自己的协议,也就是结构体报头,所以信息每往下经过一层,都会有属于该层的报头拼接到信息前面
反过来也是如此,当到达接收方协议栈,每一层都会查看最前面的报头进行判断,然后剥离报头,给到上一层
这也就代表同层之间,都认为自己是在和对方同层协议在直接通信

对于每一层而言,自己增加的叫做报头,传进来的叫做有效载荷
整个封装的过程,会感觉就像是往一个盒子里不停的填东西
到了解包的过程,会感觉是从盒子里不停拿东西
能感觉到封装和解包的过程,就像是入栈和出栈的过程
所以将整个协议层叫做协议栈

对于接收方来讲
每一层都有两个问题
1、报头和有效载荷分离的问题
a、固定长度的报头(比如链路报头)
b、变长的报头(结构体本身有说明多长)
2、每一层其实有多种不同的协议,每一层协议的报头必须解决自己的有效载荷向上交付给哪一个协议的问题
每一层的报头都会包含有类型,类型就会决定是交给上层哪个协议
将报头和有效载荷分离就是解包
决定交给哪个协议就是分用的过程
那报头怎么知道是交给哪个协议呢,封装的时候通过将上一层使用的协议写进去知道的
封装的本质
1、协议,本质是一个结构体类型,报头就是结构体变量
报文内有缓冲区,要传输的数据和报头就会依次放进去
2、封装报头的本质:其实就是在报文头部,拷贝结构体变量
跨网络通信
两台主机可能不在一个局域网,需要经过路由器
首先要认识IP地址是什么
IP协议有两个版本,IPv4和IPv6
IP地址是在IP协议中,用来标识网络中不同主机的地址
对于IPv4,IP地址就是一个4字节,32位的整数,通常也使用点分十进制的字符串来表示IP地址,用点分隔的每个数字代表一个字节
IP 能解决 主机定位和路径选择问题
每一台主机都有两个地址,MAC和IP
MAC地址总是在变化
IP地址提供长远目标,是路径选择的依据
MAC地址是当下的地址,解决的是局域网转发的问题
如果两个主机要跨网络传输
将信息持续向下传输,传输到IP层时发现要跨网络,就会发送到路由器(底层会填写路由器的mac地址)
报文会先传输到路由器的数据链路层,路由器经过检查发现目的mac地址是自己之后,就会向上传输给到网络层,再解析目的IP分析要传给谁,然后增加链路层报头(就需要封装mac地址,原mac地址是路由器,目的mac地址就是目标IP主机的mac地址)给到给到目标主机
在网络层往下可以是不同标准,在网络层往上就是同一种网络:IP网络
底层差异被IP网络给屏蔽掉了
而mac地址跟硬件强相关,也就意味着它不能作为全球通信的地址
路由器可以替换最前面的报头,也就意味着不同局域网可以连在一起相互通信
mac地址只能在局域网内用,最主要的用途是在局域网内标识唯一性