您的位置:首页 > 理论基础 > 计算机网络

浅谈网络协议(二) 网络分层的含义

2018-08-04 16:39 316 查看
做开发的朋友肯定知道,越是复杂的程序,往往越是需要分得越细。即使是刚刚入门的程序员,也知道MVC等分层结构。复杂的程序都要分层。

为什么网络要分层

因为不同的层次之间有不同的沟通方式,沟通使用的协议不同。与程序相似的,网络也是一个非常复杂的系统,如果不进行分层处理,那么不同层次之间的交流会变得非常困难和混乱。

而且分层之后也有显而易见的好处。

每层容易形成统一的标准,即使是不同的网络厂商也可以交流

每层只需要专注自己的事情,减少了这一层的复杂度

整体容易形成统一的规范,有助于计算机网络的发展

很多人听过 TCP 建立连接的三次握手协议,也会把它当知识点背诵。那你知道 TCP 在进行三次握手的时候,IP 层和 MAC 层对应都有什么操作吗?

分层之后也有一些坏处,比如分层之后,由于单层更加专注,导致一些学习者会分层的进行学习,但是经常会忘记层与层之间的关联。

学习第三层网络层的时候会提到,IP 协议里面包含目标地址和源地址。第三层里往往还会学习路由协议。路由就像中转站,我们从原始地址 A 到目标地址 D,中间经过两个中转站 A->B->C->D,是通过路由转发的。

那么问题来了。A 知道自己的下一个中转站是 B,那从 A 发出来的包,应该把 B 的 IP 地址放在哪里呢?B 知道自己的下一个中转站是 C,从 B 发出来的包,应该把 C 的 IP 地址放在哪里呢?如果放在 IP 协议中的目标地址,那包到了中转站,怎么知道最终的目的地址是 D 呢?

教科书不会通过场景化的例子,将网络包的生命周期讲出来,所以你就会很困惑,不知道这些协议实际的应用场景是什么。

你一定听过二层设备、三层设备。二层设备处理的通常是 MAC 层的东西。如果发送一个 HTTP 的包,那么应该是在第七层工作的,那是不是不需要经过二层设备?或者即便经过了,二层设备也不处理?或者换一种问法,二层设备处理的包里,有没有 HTTP 层的内容呢?

你能详细的说出来你在网络上的某一个行为,例如购物、通过ftp上传文件、下载一个游戏等经过了哪些过程吗?知道具体通过了哪些协议吗?

尽管对每一层都很熟悉,但是估计很多人会答不上来。因为无法把这些内容串联到一起。

程序是如何工作的?
把自己想象成一个程序,看看“你”这个程序是如何进行工作的。



当一个网络包从一个网口经过时,首先先看看要不要放进来。有的网口配置了混杂模式,凡是经过的,全部拿进来。

拿进来以后,就要交给一段程序来处理。于是,你调用process_layer2(buffer)。procrss_layer2是从 Buffer 中摘掉二层的头的函数,看一看,应该根据头里面的内容做什么操作。以下process_layer3是摘掉第三层的头函数。

如果这个包的 MAC 地址和你的相符,那说明就是发给你的,于是需要调用process_layer3(buffer)。这个时候,Buffer 里面往往就没有二层的头了,因为已经在上一个函数的处理过程中拿掉了,或者将开始的偏移量移动了一下。在这个函数里面,摘掉三层的头,看看到底是发送给自己的,还是希望自己转发出去的。如果 IP 地址不是自己的,那就应该转发出去;如果 IP 地址是自己的,那就是发给自己的。

到第四层的时候,就要根据地址是TCP的还是UDP的来调用不同的procrss程序来处理。传输层需要查看四层的头来判断数据包是一个发起,还是一个应答,还是普通的数据传输包,分别交给不同的逻辑处理。发起或者应答的话,就要发送一个回复包,正常的数据包就需要交给上层处理了。

到了第五层应用层,往往没有直接的相应的处理头的procrss,而是直接通过第四层头里的端口号,将数据包交给对应监听端口的进程去处理。

浏览器通过解析 HTML 来显示页面。用户点击鼠标,点击鼠标的动作被浏览器捕获之后发起另一个 HTTP 请求,于是使用端口号,将请求发给了你。

浏览器这里调用send_tcp(buffer)。Buffer 里面就是 HTTP 请求的内容。在这个函数里面加一个 TCP 的头,记录下源端口号。浏览器会给你目的端口号,一般为 80 端口。

然后调用send_layer3(buffer)。Buffer 里面已经有了 HTTP 的头和内容,以及 TCP 的头。在这个函数里面加一个 IP 的头,记录下源 IP 的地址和目标 IP 的地址。

然后调用send_layer2(buffer)。Buffer 里面已经有了 HTTP 的头和内容、TCP 的头,以及 IP 的头。这个函数里面要加一下 MAC 的头,记录下源 MAC 地址,得到的就是本机器的 MAC 地址和目标的 MAC 地址。不过,这个还要看当前知道不知道,知道就直接加上;不知道的话,就要通过一定的协议处理过程,找到 MAC 地址。反正要填一个,不能空着。

万事俱备,只要 Buffer 里面的内容完整,就可以从网口发出去了,一个程序的任务就算告一段落了。

那 TCP 在三次握手的时候,IP 层和 MAC 层在做什么呢?

TCP 发送每一个消息,都会带着上 IP 层和 MAC 层了。因此,TCP 每发送一个消息,IP 层和 MAC 层的所有机制都要运行一遍。。

只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。所以如果一个 HTTP 协议的包跑在网络上,它一定是完整的。无论这个包经过哪些设备,它都是完整的。

所以,对 TCP 协议来说,三次握手也好,重试也好,只要想发出去包,就要有 IP 层和 MAC 层,不然是发不出去的。

那么上一讲的问题:当网络包到达一个城市城关的时候,可以直接通过路由得到达下一个网关的IP地址,直接通过IP地址找就可以了,为什么还要通过本地的MAC地址呢?这里的关键就是,没有 MAC 地址消息是发不出去的。

所谓的二层设备、三层设备,都是这些设备上跑的程序不同而已。一个 HTTP 协议的包经过一个二层设备,二层设备收进去的是整个网络包。这里面 HTTP、TCP、 IP、 MAC 都有。什么叫二层设备呀,就是只把 MAC 头摘下来,看看到底是丢弃、转发,还是自己留着。那什么叫三层设备呢?就是把 MAC 头摘下来之后,再把 IP 头摘下来,看看到底是丢弃、转发,还是自己留着。

小结
如何理解网络协议的工作模式:

理解清楚计算机是如何拿到网络包,如何根据规则进行处理,如何发出去;
始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  layer