简介
说到OSI参考模型,理解网络与网络之间的关系,不说太深入难以理解的东西,只求能最大程度上理解与使用。
参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。
概念性的东西,先知道这些就够了,我们先来聊一聊一个常见的一个模型。
局域网与互联网
互联网就是许许多多个局域网组成的,从我们最简单的一个局域网入手,开始理解
这里举例两个不同的局域网,计算机用网线接入交换机、交换机连接网关路由器,另一处
也是通过相同的方式进行连接。先来了解一下OSI参考模型是如何定义这七层的
OSI 参考模型
参考:https://blog.csdn.net/taotongning/article/details/81352985
这里定义的七层只是为了方便我们去理解,实际上是不存在的。
简单的了解一下这七层是如何定义的,具体的功能还是得举例子来理解说明。
从最上层的应用层开始说起:如何一步步的封装数据,到最后进行发送。
应用层
应用层是直接面向用户的最高层,但它却不是应用程序,它只是为引用程序提供服务的
就好比,我们用的电脑版微信吧!它就是一个实实在在的应用程序,假设要与一个远方的小姐姐进行聊天会话,这个时候呢,发送一个Hello给远方的小姐姐。
当你点击发送的时候,其实做了很多事情,我们就来梳理一下。
需要发送的数据就是:Hello ,当然,应用层首先给这个数据拼接一个AH,这里就是应用层的报头,就好比是微信的一个特有的数据,就这样先理解。
表示层
当然,我们总不能发送明文吧,将发送的文本数据进行编码,平常我们计算机使用的万国码UTF-8,肯定要进行一下加密吧
表示层更关心的是所传送数据的语法和语义,主要包括数据格式变化、数据加密与解密、数据压缩与解压等
会话层
字面意思,就可以理解出这一层表示的意思,建立一个会话,就好比使用Http访问web的时候,都会存在一个Session 作为标识
让服务器来区别访问的计算机。主要功能是负责维护两个节点之间的传输联接,确保点到点传输不中断,以及管理数据交换等功能。
会话层在应用进程中建立、管理和终止会话。会话层还可以通过对话控制来决定使用何种通信方式,全双工通信或半双工通信。会话层通过自身协议对请求与应答进行协调
传输层 端到端
传输层作为OSI参考模型中,最重要的一层,这里主要是以端口到端口来区分。这里涉及到两个特别重要的协议TCP 以及UDP
一太计算机上同时运行着QQ、微信、以及浏览器等。发送数据报,这个数据包到底是哪个程序发出去的呢?当然要从指定的一个端口发出去
计算机的端口范围 0-65535
0-1023 就是1024个端口为系统占用端口
了解到这些,就该先来说说UDP协议
UDP 协议
UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了。
参考:https://blog.51cto.com/lyhbwwk/2162568
一个UDP报文包含首部与数据部分,UDP首部占用8个字节,数据部分最长长度为65535B(字节) 即 64KB
UDP协议是无连接,不保证稳定传输的协议,但处理速度较快,通常的音频、视频在传送时候使用UDP较多。
我们这里的例子是微信,微信能保证数据百分百到达,所以我们采用TCP来具体说明数据的封装
TCP 协议
TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。为了保证传输的可靠性,TCP协议在UDP基础之上建立了三次对话的确认机制,即在正式收发数据前,必须和对方建立可靠的连接。TCP数据包和UDP一样,都是由首部和数据两部分组成,唯一不同的是,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割
参考:https://blog.51cto.com/lyhbwwk/2162568
这里只需要了解的是TCP的基本封装过程,这里只涉及到源端口以及目的端口,还未涉及到IP相关的内容。它和UDP协议一样。就好像是一个改进版的
UDP协议,它能保证数据的可靠传输,这个特点记住即可。这里模拟一下,我们数据的封装过程。假设微信使用的端口是6666,目标端口就是远方小姐姐微信
的端口,当然也是一样的。这里我为了理解只做简写
网络层
从上面几层来看,我们已经将微信的数据封装成来一个TCP数据报,里面包含来微信的端口 假设是6666,当然,就好比写信一样,我的信封
已经准备好勒,里面要发送的内容我也已经准备好了,接下来就是地址了。肯定要指定这个报文我要发送到哪里去。所以呢IP 网际协议,就诞生了。
IP 网际协议
网络层引入了IP协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。IP协议将这个32位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。如果两个IP地址在同一个子网内,则网络地址一定相同。为了判断IP地址中的网络地址,IP协议还引入了子网掩码,IP地址和子网掩码通过按位与运算后就可以得到网络地址
IP地址在这里我们就比较好理解了。我们平时的生活中都会涉及到。一个IP指向的就是互联网当中的一台机器或者就是一台路由器了。
我们来封装数据。再把上面的图拿下来,说明一下,我们要给E电脑的小姐姐发送消息。比如我是A电脑,小姐姐在另外一个网关下的E电脑
比较重要的两个参数:
源地址:192.168.0.120
目标地址:192.168.1.135
进行封装后的数据,这里将源地址,告诉路由器(邮局) 发件人 就是源地址,以及收件人 也就是目标地址
ARP 协议
这里暂时不细说这个ARP协议的内容。我们只需要知道 ARP协议是用来拿IP换MAC地址的,上面的IP协议也已经提过了,通过子网掩码和IP地址的换算,可以得到
网络号,网络号就可以区别这两个IP是否在同一个局域网内。 参考这个秒懂:https://zhidao.baidu.com/question/277650423.html
数据链路层
到这一层,就已经到网卡、网络设备(交换机)的范畴了。数据链路层最重要的协议是以太网协议,数据链路层最重要的一点就是数据成帧。
以太网协议
接入以太网的设备必须包含一块以太网网卡,也就是我们常用的网卡,一组电信号称作是一个数据帧 、或者叫做一个数据包
网卡都包含一个全球唯一的MAC地址,发送端的和接收端的地址便是指网卡的地址,即Mac地址。
每块网卡出厂时都被烧录上一个实际上唯一的Mac地址,长度为48位2进制,通常由12位16进制数表示,(前六位是厂商编码,后六位是流水线号)
进行数据链路层的封装,将本机的MAC(源MAC地址) 和目标MAC地址封装在头部,在尾部加入DT报尾,这样 一个数据帧算是封装完成了!
等等。我们好像还不知道小姐姐那边的目标MAC地址,这时候就需要用ARP协议了。我们知道ARP协议就是用来用IP来换MAC地址的。
ARP协议
上面已经简单的了解过了,我们要和在B局域网下的E电脑进行通信,但是我们不知道它的MAC地址,于是我们发送一个ARP请求,来获取目标的MAC地址
目标MAC 为FF:FF:FF:FF:FF:FF 表示的是广播地址,这个数据包发出去后,所有的子网机器都会收到,收到的机器判断目标MAC是否是自己,若不是,则直接丢弃
若是,收到报文的主机会通过单播的形式,将MAC地址回传给我们。
通过路由协议我们可以得知,若不在一个一个子网内,则会交给路由器
路由器返回的包里面,目标MAC就会变成路由器的MAC地址,我们拿路由器的MAC地址组装数据链路层报文即可。
物理层
经过以上的每一层的层层包装,这时候,我们已经包装好了一个以太网数据帧,包含源MAC,目标MAC,源IP,目标IP等等一系列数据。
物理层就是将这个数据通过电信号、光信号的方式传递过去的,物理层一般都是我么所说的光缆以及网线这些硬件设备。
不同子网间的通信
通过上面的知识,我们已经了解到如何封装成一个数据帧,以及一些协议的相关内容。那么这里就会有一个问题,同一子网、
不同子网、以及相隔很远的两个子网是如何进行通信的呢?以及我们拨号上网后,公网IP与内网IP是怎么一回事呢?
同一子网通信
我们先来看一个图,计算机A要与计算机B进行通信,这时候他们是同处于一个子网内的,这个时候就很简单了。
按照上面的七层进行封装数据,这里的具体参数需要说明一下:
源IP: 0.120(简写)
目标IP:0.113
源MAC : A电脑的MAC
目标MAC:B电脑MAC(这里若不知道就先发送ARP请求)
A将数据报发送出去后,交换机直接查询目标MAC所转发的端口,将这个数据报准确的推送到B电脑连接的那个端口即可。
不同子网通信
A电脑需要与E电脑进行通信,这时候发现A与E不在一个子网内,这时候呢,就需要路由器来协助了
源IP: A的IP
目标IP: E的IP
源MAC:A的 MAC
目标MAC: 路由器C的MAC
因为不在一个子网内,需要路由器来进行路由这个数据包,送至D路由器后,D路由器拿出数据报中目标的IP,发送ARP请求,
请求E的MAC地址,知道后,将数据报里面的目标MAC进行替换,然后发送给E即可。
公网IP与内网IP通信的方式理解
我们在使用路由器上网后,运营商就会给我们分配一个公网IP,按照图上的指示,C路由器在进行拨号后,就会给C路由器分配一个公网IP
我这里假设有这样两个。这时候需要封装数据,该如何封装呢,还是以A电脑与E电脑进行通信,大家肯定会很迷惑。
这里就需要了解一个协议:网路地址转换协议:https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2
以下简称NAT,NAT 在IPV4 之前起到很大的作用,我们现在也在用,因为IPV4 IP数量的限制,但接入互联网的电脑又那么多
该怎么办呢。就是给一个路由下分配一个公网IP,路由器下面的IP与公网IP进行一个转换,这里面说的转换就是:NAT
图中黑色的就是转换部分,通过端口的转换,将多个子网IP映射到公网的一个IP上面
网络地址端口转换(NAPT)
这种方式支持端口的映射,并允许多台主机共享一个公网IP地址。
支持端口转换的NAT又可以分为两类:源地址转换和目的地址转换。前一种情形下发起连接的计算机的IP地址将会被重写,使得内网主机发出的数据包能够到达外网主机。后一种情况下被连接计算机的IP地址将被重写,使得外网主机发出的数据包能够到达内网主机。实际上,以上两种方式通常会一起被使用以支持双向通信。
还是举例,这时候,我们的A电脑需要与E电脑进行通信,E电脑在广东省,他们拨号后,都会分配一个公网IP,并且已经在路由器里面完成了NAT映射,
源IP: A电脑IP
目标IP: E电脑映射后的公网IP
源MAC :A电脑MAC
目标MAC : 本地路由器MAC地址
封装完成后,将数据报送到C路由器,路由器通过映射表,将源IP进行一个替换
替换后,交给互联网上的路由器进行数据报的转发,这就好像发快递时候一样,经过一系列的中转站,到达目的路由。
到达D路由后,D路由将数据报中的目标地址也进行一个转换,这个地址是可以相互转的。现在就是公网映射转到本机IP
转换后就轻松了。按照ARP请求到E机器的MAC地址,然后发报即可。
小结
以上内容皆是自己查看一些博主的总结,通过学习后,能够加深自己对OIS模型、以及TCP、IP、ARP
这些非常重要的协议的一个认识。以及了解到不同层级下面。两台电脑如何完成一个通行。这里讲的比较浅,
互联网的奥妙不是那么容易就可以理解透的。还是那句,不要停止学习的脚步。就好
参考:
- ARP请求 https://baike.baidu.com/item/ARP/609343?fr=aladdin
- 不同子网内两台机器的通信方式 https://blog.csdn.net/qq_28657577/article/details/82258141
- OSI 参考模型 https://blog.csdn.net/taotongning/article/details/81390979
- 内网端口与外网端口的理解 https://blog.csdn.net/chendian_yue/article/details/79272181
- 网络地址转换协议:https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2