两主机通信的过程,从发送者(以下简称A)到接收者(以下简称B),属于从7层(应用层)->1层(物理层)封装,然后传输到远端,再从1层(物理层)->7层(应用层)解封装的过程。
1、 当A打开了QQ这个软件,相当就到达应用层了;因为软件会根据你的操作调动机器底层的硬件工作了。
2、 当A往QQ这个软件的聊天窗口里面输入信息,发出后,QQ会将这个信息保存在本地聊天记录文件MSGEX.db(一般就保存在QQ目录下以你的QQ号码为文件夹里)。以某种格式编码/保存某种信息,这可以理解为表示层了。
3、 当A打开与B的聊天窗口,输入信息,按下“输入”按钮,用户的操作就完结了,剩下都是机器自己的操作了。实际传输之前QQ会先建立A与B的会话连接,才真正开始传输信息/数据(你可以理解借传输文件理解:你发送文件给对方,要等待对方按下接收,才算建立了会话,然后才开始传输。)这算会话层了。
4、 会话建立后,会将A发的信息斩件,如A发送“你吃了饭没有”?传输层将这句话斩成“你”“吃”“了”“饭”“没”“有”6个数据段,标记号使用的端口号,然后准备发出去。
5、 接上一层,信息还未发出去,这时候在网络层做路由选路,可以理解为,从A家出去,可以分别经“联通”“电信”“移动”3个网络中的一个再到B家。
网络层根据路由协议负责选路(根据链路质量、带宽、开销等方法论)。假设最后选了2条,可能就A->联通->B发送“你”“吃”“了”3个数据段,A->电信->B发送“饭”“没”“有”3个数据段。
选路后,这一层要标记IP包头,包头主要内容是源IP地址,目的IP地址,使用什么协议。其中源、目的IP相当于你寄信的时候的收发的地址与邮政编码,标记出发送者与接收者。而协议相当于这封信到底用什么语言书写。(只有保证2端使用同种语言,才能确保通信起来,否则你用英文写信给大妈,大妈怎么看得懂呢?)
6、 然后再到数据链路层,数据链路层主要是负责同一个子网内的通信的。例如A、B连接在同一台二层交换机,就属于同一个子网,那么数据帧的通信室是不需要通过网络层的(即三层交换机或者路由器),直接在这台二层交换机就过去了。这一层打的是MAC地址的帧头,对于上述通信过程来说,就是为数据帧打上A的机器的MAC与A的网关的MAC。这一层的工作就完成了。
7、 最后一层了,经过上述斩件、打完各层标签后的6个数据帧,物理层将他们翻译文6段0、1表示的比特流,然后通过光纤、铜缆进行传输。
8、 当比特流传输到了远端,接着B的机器按照上述的1~7的步骤反方向运行一次即可(即有物理层到应用层)。就是一层层读取标签,传输给标签标记着的相应对象,然后摘除标签,再读取上一层标签,直到最后B的应用程序能够读到A往应用程序输入的数据为止。
--------------------------------------------------------------------------------------------------------------------------------------------
对于题主的评论,补充2个图;
2个主机之间的通信,对于2台主机来说,肯定是都需要跨越7层的,而平常说的只需要去到2层或者3层,其实是对于中间系统而言的,就是说中间的交换机、路由器而言;
例如图1的假设两端的通信实体在一个局域网内,其实传输的数据包去到交换机时,交换机拆开二层帧头,再查自身的MAC地址表,发现表里面有对应的MAC地址,然后对应的对口是哪个,接着就把帧发送到该端口转发出去,它的任务就完成了。根本不需要到达网络层的意思是,根本都不需要拆卡3层的IP包头来读取里面的信息。
通过转发,最好到达B主机,然后从1层拆到7层,B用户的主机最终就读取到信息了。
对于图2,由于A、B两通信实体跨域广域网,所以光靠MAC地址表,肯定是查不到的,这时候路由器会把IP包头也拆开,读取目的IP地址,再查路由表,就知道往哪个端口发出去了。然后层层转发,就可以达到目的地了,接下来就和图1的一样了。
OSI参考模型
OSI,是英文Open System Interconnect的缩写,中文翻译开放系统互联,一个抽象七层模型,但其核心思想一点也不抽象,非常具体,其核心思想:
1) 通信两端的主机能够理解对方的语言
这是要求主机使用相同协议格式来发送数据
2) 希望通信系统模块化,每个模块提供标准接口
每个模块给和直接耦合的模块提供标准化的流程接口,每个模块内部无论怎样实现没有硬性规定,但外在的接口一定是标准件,这样耦合的模块可以无缝对接起来。
这样做的好处有:
(1) 由于使用标准接口,每个通信模块可以独立开发,增加自由度,提高生产效率
(2) 增加代码的重复利用率,由于通信模块的标准化的外在接口,应用程序可以直接使用现成的通信模块,而无需重新编码,这大大减轻了开发者的负担,间接地提供了生产效率。
以上的种种好处对于初学者,如云里雾里。
人类的学习有个特点,当遇到难以理解的抽象问题,总是希望在现实生活里找到可以类比的事物,咱们先来谈谈汽车产业的标准化。
最早美国的汽车生产商、如福特、通用,各自在自己的小作坊里生产,产量很低,轮胎尺寸也没有约束,自己生产多大的轮胎,就用多大的轮胎。
福特改进了汽车流水线,经过一个若干道工序,
1)冲床压制框架外壳 2)车体倒转焊接 3)除毛边 4)装配大梁、防震、引擎 5)内部装潢 6)加装散热器、油压系统 7)安装轮胎
一辆小汽车就诞生了,随着产业规模越来越大,产业分工越来越精细化,有了汽车零部件供应商,比如轮胎,如果汽车生产商对轮胎尺寸规格大相径庭,那无疑会增加供应商的成本,而采用标准化的轮胎尺寸,供应商只需生产几种标准尺寸的就可以了,无论哪家汽车厂商都可以使用,规模经济成本自然会下降,所以标准化是双赢,以上就是汽车产业的标准化。
计算机网络遵循着同样标准化的演进之路,众所周知,最早的计算机网络是美国人搭起来的,名字是ARPA网,ARPA是英文Advanced Research Projects Agency的缩写,中文是美国国防部高级研究计划署,ARPA网使用了TCP/IP作为计算机网络互联协议,在基于BSD操作系统里实现了这些协议,TCP/IP的流行引起了业界的关注,于是以TCP/IP为框架模型,国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合提出并制定了这个七层的OSI参考模型:
1)应用层 2)表示层 3)会话层 4)传输层 5)网络层 6)链路层 7)物理层
用户数据经过以上七道工序的流水线,一串0、1组成的二进制流诞生了,根据物理层是光纤、电缆、还是空气,二进制流转化为光信号、电信号、电磁波信号在物理介质(物理层)里传输,经过若干个中继交换机(链路层)的交换、经过若干个中继路由器(网络层)的转发,最终到达数据的终点。
我们来打个比方,假设A公司老总要寄文件给B公司的老总。
老板会喊他秘书过来,说把这玩意寄给B公司的老总。
秘书拿到快递后,首先选取了“倪丰快递”,并且查到了B公司的地址,把文件装到了快递信封里,填好快递单,就交给了快递小哥了。
而倪丰快递则是把近期收到的快递装成了一个集装箱,找到了某卡车司机,说,把这箱子运到 B 市的集散中心去。
然后这封快递送到了 B 公司的老总秘书那里去,秘书拆开快递,把文件递给了 B 公司老总。
纵观整个过程,我们发现,
1. 老总在把快递交给秘书时,他并不关心秘书是怎么打包的,也不关心秘书找了什么法子寄出去的,他只期待对方老总能收到即可;
2. 秘书则既不关心“倪丰快递”是如何具体用什么运输方式运到 B 市的,又不关心这份文件的内容,只期待这封快递能够被送达对方的公司地址;
3. “倪丰快递”则只关心装着快递的集装箱能够被司机运往 B 市集散中心,却不关心司机究竟走了什么路线,开了什么牌子的货车,也不关心这封快递信封里装了什么东西;
4. 司机只关心怎么把集装箱运到目的地,而不会关心集装箱里面装的是什么。
OSI 7 层模型则与之类似,都是下层为上层提供传输服务,不关心上层传输的内容,而上层也不关心下层传输的手段,只期望能将信息最终发到通信对端的相应层次上。
再补充一句,虽然设计上是下层和上层是服务和被服务的关系,互相不关心实现细节,实际上出于这样或那样的原因,多少还会有一些相关性,并不完全独立,但是层次结构还是明确的。