目录
0.前言
1.TCP/IP四层协议模型的认识
2.数据传输的大致流程
3.局域网通信的原理
4.同一网段下两台主机之间的通信
5.不同网段下两台主机之间的通信
0.前言
不知道你有没有这样的疑问,为什么不同的设备之间能够进行数据的发送和接收?不同的通信设备之间到底是如何进行数据的发送和接收的?这似乎是一个很神奇不可思议的过程,但我相信,在这篇文章中,你会找到答案。
1.TCP/IP四层协议模型的认识
想要明白数据是如何从一台设备发送到另一台设备的,我们首先要弄清楚TCP/IP通信协议。世界上所有的要用于通信的设备,不管它内部是Linux操作系统,还是Windows操作系统,还是其他的任何操作系统,要想实现通信,必须遵守相同的通信协议,只有通信双方都遵守相同的通信协议,你发送的数据我才能认识,我发送的数据你也能认识。所以,早在网络发展之初,国际标准委员会(ISO)就制定了网络通信的标准模型 —— OSI七层网络模型;ISO只是负责制定标准,并不负责实现标准,而是由各个平台的开发人员来实现。开发人员在实现OSI七层模型的时候发现,OSI七层模型的上三层可以合并为一层,而且这样更实用,于是,便有了TCP/IP五层网络协议模型,但最下层的物理层我们一般不谈,所以便有了TCP/IP四层网络协议模型。
并且优化之后的网络协议模型可以和计算机的层次结构对应起来,网络协议的每一层都可以在计算机计算机中对应的层次实现。
物理层:物理层在计算机的底层硬件中实现,网络通信中具有代表性的硬件 —— 网卡,就是在这一层实现的,主要负责光电信号的传递。
数据链路层:数据链路层在驱动程序这一层中实现,网卡是硬件,硬件需要驱动程序来驱动。
网络层和传输层:我们可以看出这两层是在操作系统呢内部实现的,所以,操作系统中还有对应的网络管理。
应用层:应用层属于用户空间,由用户自己来实现。
需要注意的是:网络层和传输层在操作系统内部实现,是属于操作系统内核源代码的一部分,用户不能直接使用操作系统内部的程序,所以操作系统需要对外提供网络的系统调用接口给用户使用,但是系统调用接口不方便使用,于是,有人对网络的系统调用接口做封装,便有了网络库,开发人员就可以基于网络库和系统调用接口进行网络程序开发了。
2.数据传输的大致流程
假如有两台主机,分别是A主机和B主机,A主机给B主机发送数据,发送的数据不能直接传给B主机应用层的用户,而是需要通过TCP/IP五层协议栈进行传输,需要自顶向下,贯穿整个TCP/IP协议栈,到达物理层,物理层用于网络通信的硬件通过数据传输介质,将数据传输到B主机物理层的用于网络通信的底层硬件上,此时,B主机已经拿到了A主机发送的数据,但是用户还看不到,因为用户在应用层,所以还需要将数据自底向上,贯穿整个协议栈,将数据交付到用户空间,也就是应用层,此时,使用B主机的用户就能看到使用A主机的用户给他发送的数据了。
举个例子,小a住在五楼,小b也住在五楼,小a要给小b送一个东西,小a不可能说飞过去吧,他必须先下楼,到达物理的介质(地面),然后走到小b所住的楼栋,再上楼,到达小b家门口,然后将东西交给小b。
我们可以看到,不同主机之间进行通信的整个过程都是基于TCP/IP协议栈进行运转的。
看到这里,我们已经了解了网络传输的大致流程,但是还不够,在更细致的介绍网络传输之前,我还想介绍一下局域网通信的原理,这对于理解网络传输是有帮助的。
3.局域网通信的原理
铺垫:什么是mac地址?mac地址是一种硬件地址,是集成在网卡内部的,用于唯一标识一个网卡。(对于mac地址作用的理解,需要到 第五小节 —— 不同网段下两台主机之间的通信才能介绍清楚)
首先我们需要明确的一点是,同一个局域网的主机之间是可以直接通信的。那这是如何做到的呢?
比如主机A要和主机E通信,主机A会向整个局域网中广播数据,大家都看得见,但是只有主机E会做出处理,因为主机A广播数据的时候,会带上自己的源mac地址,和目的mac地址(mac地址是网络通信中,物理层的网络设备之间的寻址),网络中的其他主机一看,这是主机A发送给主机E的数据,与我无关,忽略。主机E一看,这是主机A发送给我的数据,于是接收数据,主机A上的数据就发送给了主机E。
但是在一个局域网中,不仅仅只有主机A给主机E发送消息,可能有多台主机都要发送消息,但是网络只有一个,并且还是公共的;多台主机都向局域网中发送数据,这个时候就会造成数据的碰撞,数据一旦产生碰撞,数据的可靠性就难以保证,于是,便产生了一种机制,数据碰撞的检测和避免;也就是说,局域网中的主机向局域网中发送数据的时候,会先检测是否有主机在通信,有的话,就等一等,没有主机发送数据我再发,这样就能避免数据碰撞了;这个时候,大家都选择退一步,海阔天空。
以上介绍的是以太网通信的原理,以太网是一种局域网。当然,还有其他的局域网,比如令牌环网,令牌环网的通信原理就相当于,有一个令牌,谁拿到令牌谁就可以发送数据,发送完之后,将令牌交给下一台主机,该令牌在整个局域网中循环传递。
不管是那种局域网通信,本质是任何时刻只允许有一台主机在局域网中发送数据,这就是局域网通信的原理。
4.同一网段下两台主机之间的通信
前面我们已经粗略地介绍过了不同的两台主机之间是如何实现通信的以及局域网通信的原理,建立了网络通信的基本认识,下面我们更深入的研究一下。
铺垫:
什么是IP地址?IP是分配给网络上的每个设备(如计算机、打印机、智能手机等)的数字标签。这些标签是唯一的,用于在网络上标识设备。
区分:
IP地址是用来标识主机的,mac地址是用来标识网卡的。
前面我们说过,不同的主机之间进行通信,是基于TCP/IP协议栈进行运转的,发送方的数据需要从发送方的应用层自顶向下传输到物理层,通过物理的介质,传输到接收方的物理层,然后再自底向上传输到接收方的物理层,那么这个自定向下和自底向上的过程是如何实现的呢?
假如用户A想给用户B发送一个hi,用户A将输入的数据交给应用层,应用层需要在接受到的数据前面添加应用层的协议报头,然后将数据传递给它的下一层传输层,传输层接收到数据之后,也要在接收到的数据前面添加自己的协议报头,然后向下交付给网络层,网络层接收到数据之后,在数据前面添加自己的协议报头,然后交给数据链路层,数据链路层再在接收到的数据见面添加自己的协议报头,然后把数据交给物理层;这个过程叫做数据的封装。
明确一点:用户A在向用户B发送数据的时候,需要知道,也必须知道用户B的IP地址,这样才知道数据要发送给谁,才能在网络中有目的地进行数据的传输。同时,也需要知道数据应该发送到哪个网卡上,所以需要知道网卡的mac地址。如果两台主机在同一个局域网内,就可以直接发送给对方的网卡,如果两台主机不在同一个局域网内,就需要将数据发送给路由器的网卡,由路由器根据IP地址将数据进行路由转发,并跟新源mac地址和目的mac地址。
物理层再将封装好的数据添加自己的mac地址和源mac地址,发送到网络中,然后对应的主机就会通过物理层的物理设备接收数据,然后将接收到的数据交给它的上层——数据链路层,数据链路层会剥离掉自己这一层的协议报头,然后将剩下的数据交给它的上层,每一层都是如此,直到将用户A要发送的数据交给用户B;这个过程叫做数据的解包和分用。
我们需要明确的一点是,每一层中的协议都不止一个。接收方的物理层接收到的数据如何能够正确地进行解包和向上交付呢?
在发送方发送的数据自顶向下添加协议报头的时候,会包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息,等到接收方接收到数据之后,就能根据自己这一层的协议报头中的首部长度 正确地将数据进行解包,并将自己这一层的报头剥离下来,然后根据上层协议是什么的信息将剩下的数据交付给上层中对应的协议,这样,就能正确地完成数据的解包和分用了。
5.不同网段下两台主机之间的通信
铺垫:不同网段下两台主机之间的通信,数据从一台计算机传输到另一台计算机传输过程中要经过一个或多个路由器。
不同网段下两台主机之间的通信 和 同一网段下两台主机之间的通信 有相同点,也有不同点。相同点是,发送方的数据同样需要自顶向下进行分装发送到网络中,接收方同样要将从网络中接收到的数据自底向上进行解包和分用;不同的点在于 如何找到目标主机?
假如主机A要和主机B发送数据,发送的数据中带有主机A的IP地址 —— 源IP,也带有主机B的IP地址 —— 目的IP。一开始,发送的数据达到主机A物理层的设备,我们可以理解为网卡,这个时候,就会在传输的数据中添加源mac地址和目的mac地址,但是这两台通信的主机并不在同一局域网内,所以不知道主机B的mac地址,好在我们有路由器,此时的目的mac地址就可以填路由器的mac地址,从而将数据传输给路由器,路由器收到数据之后,将自己的mac地址填写为源mac地址,通过查看数据中的IP地址,从而将数据发送到主机B所在的局域网中,此时还是不知道主机B的mac地址,这种情况需要通过ARP协议解决(读者请自行了解),从而获得目的mac地址,从而将主机A要发送的数据传输到主机B的网卡上,然后自底向上进行解包和分用,最后将数据交给主机B的用户。
这样一来就实现了不同网段下主机之间的同行了。
在这个过程中源IP地址和目的IP地址始终是不变的,因为通信的主机没有变化,源IP地址和目的IP地址表明数据从哪台主机来,要发送到哪台主机上去;但是源mac地址和目的mac地址是会发生变化的,因为在通信的过程中,可能需要经过一个或多个路由器,路由器也是有网卡的,所以会改变源mac地址和目的mac地址。