你的问题
在这个宁肯不吃一顿饭,不可断一小时网的时代里,我们对网络的依赖已经达到了无以复加的地步,虽然我们每天在使用网络,却并不清楚网络通讯到底是如何进行的?
比如,你在微信里给苦追了好久的姑娘发送了一条约会消息,她收到了,并且在微信上回复给你“不好意思,我今晚有约了”,但是这可能是个误会,你发送的消息为什么可以成功到达她的手机上,而不是被远在大洋彼岸的川普收到呢?她在手机上看到这条消息后,回复给你一条拒绝的消息,这条消息也准确无误的被你所接收,本来打算和姑娘一块看电影的计划泡汤了,虽然你这时候心情很糟,但你也无事可做,所以打算研究研究这该死的网络通讯协议。看看为什么你发给妹子的消息没有发到川普的手机上。
简单分析
我们先来看看你给姑娘发送消息这一过程,它的背后到底发生了什么。首先,你编辑了一条消息,点击了发送按钮,这时这条消息会被经过包装,然后发送至腾讯的服务器上,包装的过程中,会把发送人、接收人、消息内容等等信息整合在一起,腾讯的服务器接收的这条信息之后,对应的程序就会对这条消息进行处理计算,从而得知要把什么内容发送给什么人,然后服务器也将这一信息进行包装处理,发送出去,之后姑娘收到消息。这只是一个简单的消息传递流程,要想真正搞清楚消息是怎么发送的,还需要了解互联网通讯的原理。
协议
首先我们要知道协议是什么?其实很简单,协议其实就是一种规则。比如在社会中,我们有法律来约束每个人的行为,法律就可以看做是一种面向公民的“协议”。在互联网上我们同样需要一些规则来约束各个主机设备或程序的行为,那么这个规则就是互联网协议。接下来我们会介绍互联网分层模型,互联网的每一层都有其特定的功能,要实现这特定的功能就要有对应的协议。
互联网分层模型
为了便于理解,我们一般可以将互联网通讯模型分为五层,每个层都有它自己的功能。物理层是最底层,应用层是最高层,中间分别是链路层、网络层和传输层,其每一层都是建立在上一层的基础上的。
(一)物理层
你想给姑娘发送一条消息,首先你得有个手机(这TM不是废话),其次,你的手机得连上网(这TM也是废话),或许你这条消息是用电脑版的微信发送的,那无论你是插网线还是连WIFI,都需要你成功接入互联网。
这些连接线路就是互联网的物理层,物理层主要功能是提供了数据传输的介质,使得电信号可以在设备之间传播,这里的电信号也可以简单的理解为0或1。
(二)链路层
物理层为我们提供了在两台设备之间传输0和1的可能,但是只是单纯的传输0和1是没有意义的。链路层的作用是将这些01信号序列化,转化为有意义的数据帧。
那么链路层是怎么工作的呢?它工作过程大概可以理解为三个部分,发送什么数据?发送给谁?怎么发送?
首先需要有一个规则来定义这些01电信号,使得这些电信号变得有意义,这个规则就是以太网协议(Ethernet),它规定了一组电信号为一个数据包,每个数据包都分标头(head)和数据(data)。标头用来存储发送人、接收人、数据类型等等,数据部分就是消息内容。这就解决了发送什么消息的问题。
定义好了数据,我们就该考虑发送给谁的问题了,每台设备都有自己的一个地址,叫做MAC地址。MAC地址在设备出厂时就已经固定了,这个地址在全世界是独一无二的,这样我们就可以通过这个地址去向目标设备发送数据。
虽然我们知道了目标设备的MAC地址,但是怎么才能把把消息准确的发送给目标设备呢?其实解决方法很简单,发送数据时,将向网络中所有设备都发送这个消息,然后每一台设备自己来判断数据标头中包含的MAC地址是否和自己的MAC地址一致,如果一致就接收这个消息,如果不一致就不接收。这种发送数据的方式叫做“广播”。通过“广播”的方式就可以把一条数据发送到指定设备上了。
好了,让我们再来看看发送数据这个过程,如我们上面所说,你想给姑娘发送一条消息,得通过通讯线缆传输0或1这种信号,然后有一种叫以太网协议的东西可以帮你把01信号转化为有意义的数据,之后你的手机向网络中所有设备发出这条消息,姑娘的手机发现这条数据是发给她的,便接受了这条数据,其他人的设备发现数据中包含的MAC地址和自己的MAC地址不符合,说明这条数据是发送给其他人的,便不接收这条数据。这样便达到了发送给姑娘消息的效果。
(三)网络层
我们知道全球的可联网设备都在一个巨型网络下,按我们上面所说,你的消息会发送给网络内所有设备,这么说来你的这条消息还是发给川普了嘛,只是人家没有接收而已。其实,并非如此,如果每发送一条消息都会发送给互联网上的所有人,那以互联网这么大的体量,早就瘫痪了。
实际上,“广播”的方式只能在同一子网络内发送数据,互联网是由非常多的子网络组成的巨型网络,所以你发给姑娘的消息川普是绝对收不到的。
看到这里你肯定已经明白了,网络层的作用是可以让数据在不同子网络之间也可以传递。最常见的网路层通讯协议就是IP协议。
3.1 IP地址
虽然每台设备都有自己独有的MAC地址,但是通过MAC地址我们是无法判断该设备是属于那个子网络的,所以我们引入了一种其他的地址,叫做IP地址,也称为“网址”。目前最常使用的是IPv4,是IP协议的第四版。IPv4规定网址是由32位二进制数组成,通常以四段10进制数表示,从0.0.0.0到255.255.255.255,例如:192.168.1.1就是一个IPv4地址。
3.2 子网掩码
有了两台设备的IP地址,我们该如何判断两台设备是不是处在同一子网络下呢?这时候就需要另外一种叫做“子网掩码”的参数了,“子网掩码”同IP地址十分类似,也是由32位二进制数组成,不过它的网络部分全部为1,主机部分全部为0,那么什么是网络部分?什么是主机部分呢?
举例来说,IP地址为192.168.1.1,子网掩码为“255.255.255.0”,就表示此IP的前24位为网络部分,后8位为主机部分。也就是说通过“子网掩码”可以确定一个IP地址的网络部分和主机部分。那么问题就变得简单了,如果两台设备的IP地址网络部分是相同的,那么他们就处在同一子网络。
例如:A设备的IP地址为172.12.214.3,子网掩码为255.255.0.0,B设备的IP地址为172.12.213.1,子网掩码同为255.255.0.0,则可以判断出A设备与B设备处在同一子网络下。
3.3 相同子网络间的数据传输
好了,看起来费了好大的劲来判断两台设备是不是处于同一网络下,但是相信我,费这么大功夫是绝对值得的。我们马上就可以在互联网上任意两台设备间发送数据了。首先我们要了解,我们想要发送数据,就必须知道目标设备的IP地址和MAC地址。
通过IP协议,我们可以判断出要传输数据的两台设备是否是在同一子网络,那现在就会有两种情况,第一种情况是,两台设备处在同一子网络下,那我们就可以利用“广播”方式去发送数据了,但是问题来了,知道目标设备的IP地址,如何获得目标的MAC地址呢?这时候ARP协议就登场了。
ARP协议的作用可以简单的认为是通过IP地址来获取同一子网络中设备的MAC地址,那它是如何工作的,其实也很简单,它也是通过“广播”的方式向子网络内所有设备发送一条数据包,数据包中的MAC地址填写为:FF:FF:FF:FF:FF:FF,这样当其他设备收到这条数据的时候,就会对比自身的IP与数据包中的IP是否一致,若不一致就丢弃这条数据,若一致就接收这一条数据,并汇报自己的MAC地址,这样就可以通过IP地址获取到MAC地址了。
现在我们就可以在两台设备(同一子网络)间通讯了。
3.4 不同子网络间的数据传输
第二种情况是,要传输数据的两台设备,不在同一子网络下,我们知道,要想把数据准确发送到目标设备中,就必须知道两个地址
- 目标设备的IP地址
- 目标设备的MAC地址
但是,不同子网络间的两台设备,是无法获取到对方的MAC地址的,这时候只能将数据包发送给网关,网关通过路由协议再将数据发送到目标设备上。所以这时候需要知道的地址就变成了
- 目标设备的IP地址
- 网关的MAC地址
如图,主机2想向主机4发送一条数据,必须先将数据发送至网关A,由网关A通过路由协议查询到主机4处于子网络B,网关A会将数据发送给网关B,网关B再将数据发送给主机4,这样便完成了主机2到主机4之间的通讯。
至此,我们应该清楚了,在两台设备间通讯所必须的条件,首先我们需要判断两台设备是否处在同一子网络中,若在同一子网络,就可以利用ARP协议来获取MAC地址,得到目标IP和MAC地址,就可以发送数据。若不在同一子网络,则需要获取网关的MAC地址,将数据发送到网关,让网关来转发。现在我们就可以在互联网上任意两台设备间通讯了。
(四)传输层
通过上面的介绍,我们已经知道了两台设备之间是如何通讯的了,但是,当你收到姑娘回给你微信消息的同时,你的手机还在线播放着久石让的《summer》,那么问题又来了,你的手机同时接收着两种数据,那系统为什么不会把微信的数据和网易云音乐的数据搞混呢?
不同的应用程序在主机上发送或接收数据,都要通过不同的端口(port),以此来确定数据包是归那个应用程序所有。
传输层的作用就是定义了端口到端口之间的通讯,最常用的协议是TCP协议。这个协议比较复杂,它可以保证数据不会丢失。常说的“三次握手”和“四次挥手”就是指TCP协议的建立和断开,有时间的朋友可以更加深入的了解了解TCP协议。
(五)应用层
虽然各个应用程序都能拿到自己对应的数据,但是如果不对这些数据进行规范,应用程序也无法解读。所以在应用层出现很多协议,用来为应用程序提供特定的数据服务接口,这些服务包括文件传输、文件管理以及电子邮件的信息处理等。例如浏览网页需要HTTP协议、下载文件需要FTP协议,读取邮件需要POP3协议等等。
最后,我们在来看一张图,想一下互联网每一层都主要做了什么
数据形式
在这个五层模型中,每一层都有其对应的数据,物理层的数据就是0和1,链路层将0和1序列化定义为“帧”,“帧”分为标头和数据两部分。网络层的数据为IP数据包,它也有头部和数据两部分,IP数据包是放在帧的数据部分中的。传输层中的TCP数据包也分为头部和数据两部分,它放在IP数据包的数据部分。应用层的数据直接放在TCP数据包的数据部分。所以最终的数据形式就变成了以下形式
分层来看的话如下
总结
这片文章只是从基础的角度简单的介绍了互联网通讯的大概原理,其中简化了很多部分,实际通讯过程要比文章所写复杂的多,要想弄清楚详细的互联网通讯过程,还需要对各个协议做更加深入的学习。文章参考了阮一峰老师的互联网协议入门,阮老师这两篇文章写的都是通俗易懂,是互联网协议入门的不二之选,本文若有描述不清楚的地方,大家可去阅读阮老师的互联网协议入门。本文是在初步学习了互联网协议之后,自己做的一些总结,文中若有不对之处,欢迎指正。