网络协议漫谈

1,566 阅读7分钟

一、什么是网络协议?

想象一下,我们有一封信,要送给隔壁市的好基友,要怎么做呢?

  • 把信装信封
  • 把信投递到邮筒
  • 邮递员送信
  • 好基友取信

写信得知道对方的地址,并且把地址写在信封上。这样邮递员才知道信送到哪里。

另外,送信并不是由一个邮递员完成的,中间有很多中转的过程,每一个邮递员都只负责某几个小区信件的收递

信也可以分类的,可以是普通信件,也可以是加急件,快件之类的

中国邮政,可以送信,也可以送其它快递

如果我们要给隔壁市的好基友发送一条信息,这中间又经历了什么样的过程呢?网络情况是怎么样的呢?

众所周知,网络协议是分层的,如下所示:

image

  • 应用层:可以对比中国邮政,中国邮政可以利用全国的邮政网络推出不同的产品,比如可以送信,也可以送快递,可以飞机运贵重物品,针对邮政网络有不同的“应用”产品
  • 传输层:可以对比邮政的传输方式,物品有易碎品,也有普通物品,邮政肯定会有不同的方式来确保运输的安全,比如说,运送易碎品之前先把物品包裹得厚厚地
  • 网际层:可以对比邮政的运输网络,邮政可能和其它航空公司合作来运输物品,邮政公司本身并不负责运输,它只负责物品的打包,打包好交给航空公司就行了,而航空公司就是邮政的运输网络,它对应着网际层
  • 网络接口层:它对应着邮政系统的一些基层套件,比如邮筒之类的

每一层都利用下一层的服务做相应的事情,比如传输层就利用网络层的传输服务,实现特定的信息传送方式。每一层都只对上一层负责。

二:数据链路层

网络接口层,也可以叫数据链路层,它是网络四层协议中的最下面一层,它会与硬件打交道,网络中传输的都是1、0之类的二进制,二进制数据与电气数据的转换,就是由数据链路层完成。数据链路层有自己的数据格式:

那这里就有一个疑问了?数据链路层的数据如何定位呢?送信必须得有地址,数据链路层的数据也有地址,mac地址。每一个主机都必须有mac地址,mac地址在设备出厂的时候就确定了,通常是48个二进制位,通常用12个十六进制数据表示

如上图的物理地址,就是mac地址,前6位是厂商编号,后6位是网卡编号。mac地址,全世界唯一。可能有同学会有疑问了,不是还有IP地址吗,不是通过IP地址来确定网络接收地址的吗?IP地址用在网际层(也叫网络层),MAC地址用在数据链路层。

从前文所述,我们可以知道,mac地址是一个真实的物理地址,而ip地址只是一个虚拟地址。为什么会有两套地址体系,既然MAC地址已经全世界唯一了,能不能不要IP地址,只要mac地址呢?这个问题,当我们聊到IP地址时就能回答了。IP地址是通过层级关系来将计算机分组的(子网的实现)。不同计算机组间传递信息时要通过路由表,它们自己被分成不同的层级。比如,202.108.x.x是百度的网络。通过这个地址,百度可以知道那些成千上万的子网在哪里分布同时怎么找到它们(其他人不需要知道这个,只需要知道以202.108开头的IP地址都会到百度那里)。

在一个局域网中,如果两台主机互相通信,网速会非常快。因为在同一个主机当中,彼此都有对方的mac地址,直接将数据发送给对方就行了。这就好比送信,如果对方和你在同一个小区中,你直接把信送过去就行了,不需要再把信中转到城市的信件中转中心,再绕一大圈送回来,这样效率自然就高了。

三:网络层

邮递员送信的过程是怎么样的呢?

首先根据地址将信分捡,广东省深圳市某某区某某街道某某小区之类的。将信分组之后,效率则会在大提高。网络,也是存在分组的,如何实现网络分组的呢,就是通过大名鼎鼎的IP地址。

一般ip地址是由32个bit组成,它的前一部分代表网络,后一部分代码主机,假定上面的ip地址中前24位是网络地址,223.212.40,那么主机部分就是后面的8位,当前ip地址的主机部分就是80。如果两个ip地址的网络部分是相同的,那么它们肯定处于同一个子网络当中。

网络层传输的数据叫IP数据包,ip数据包也分为标头和数据部分,但整个ip数据包都是存在在数据链路层的数据部分。可以理解为信封套着信封

ip层传输的数据并不能保证安全,比如说货车在送货的时候有可能出现货物损坏,没有办法保证货物一定就完整无缺。另外,ip层也不是一个面向连接的运输,它和电话不一样,电话得打通之后再说话,但ip层传输数据不一样,只管送。当然,运输出错也会有相应方式通知主机。

四:传输层

传输层中有两个大名鼎鼎的协议,TCP和UDP,只要是程序员没人不知道这两个的吧。TCP和UDP利用ip层,实现自己的特殊的传输方式,所以这一层叫传输层。

有了ip地址和mac地址,可以精准地确定一台主机的位置。但我可以使用pc看网页,也能用pc聊qq,某人给我发了一个qq信息,pc怎么知道这是qq信息而不是一个其它信息呢,这里还有一个概念叫端口。在传输层,结合ip和端口,就可以知道信息是发给主机的哪个应用程序的。

TCP,一种面向连接的安全的传输方式,有点类似于打电话,得经过三次握手确认连接,双方才可以发送消息,如果因为网络原因发送出错了,还会重传,断开连接还得经过四次握手才会真地断开连接

UDP,非面向连接,也不安全的传输方式。它并不要求双方建立连接,只管把数据报发送出去,不管对方是否接收。

安全的方式都是有代价的,虽然TCP安全,但得经过三次握手才能建立连接,中间还得通过ack确认已接收的数据,监听超时,如果超时了,还要重传,如果网络阻塞,重传是否会加剧阻塞,所以超时时间的设定也是一个难点,得通过特定算法动态计算超时时间。

UDP不安全,是不是就一定不可取呢,也不是,它有它的好处。谷歌的QUIC,就是在应用层对UDP加以控制,也能实现安全的传输,某些地方也会比TCP更优秀

传输层也有自己的数据格式,不过它是套在ip数据中,还是和之前一样的信封套信封方式

五:应用层

应用层,大家都听过http等协议,http协议就是应用层的协议。

http协议是使用tcp协议实现的,利用tcp协议实现的诸多特性。前文提到的QUIC,也是应用层的协议。应用层是最高的一层,直接面对用户,http协议的数据部分就放在TCP数据包的“数据”部分。最后,整个数据链路层的数据包格式就变成了这样