网络为什么要分层?

网络为什么要分层?因为,是个复杂的程序都要分层。

理解计算机网络中的概念,一个很好的角度是,想象网络包就是一段 Buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。你想象自己有很多的网口,从某个口拿进一个网络包来,用自己的程序处理一下,再从另一个网口发送出去。

当然网络包的格式很复杂,这个程序也很复杂。**复杂的程序都要分层,这是程序设计的要求。**比如,复杂的电商还会分数据库层、缓存层、Compose 层、Controller 层和接入层,每一层专注做本层的事情。

程序是如何工作的?

我们可以简单地想象“你”这个程序的工作过程。

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

拿进来以后,就要交给一段程序来处理。于是,你调用process_layer2(buffer)。当然,这是一个假的函数。但是你明白其中的意思,知道肯定是有这么个函数的。那这个函数是干什么的呢?从 Buffer 中,摘掉二层的头,看一看,应该根据头里面的内容做什么操作。

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

如何判断呢?如果 IP 地址不是自己的,那就应该转发出去;如果 IP 地址是自己的,那就是发给自己的。根据 IP 头里面的标示,拿掉三层的头,进行下一层的处理,到底是调用 process_tcp(buffer) 呢,还是调用 process_udp(buffer) 呢?

假设这个地址是 TCP 的,则会调用process_tcp(buffer)。这时候,Buffer 里面没有三层的头,就需要查看四层的头,看这是一个发起,还是一个应答,又或者是一个正常的数据包,然后分别由不同的逻辑进行处理。如果是发起或者应答,接下来可能要发送一个回复包;如果是一个正常的数据包,就需要交给上层了。交给谁呢?是不是有 process_http(buffer) 函数呢?

没有的,如果你是一个网络包处理程序,你不需要有 process_http(buffer),而是应该交给应用去处理。交给哪个应用呢?在四层的头里面有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听这个端口,那你发给浏览器就行了。至于浏览器怎么处理,和你没有关系。

浏览器自然是解析 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 层的所有机制都要运行一遍。而你只看到 TCP 三次握手了,其实,IP 层和 MAC 层为此也忙活好久了。

这里要记住一点:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

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

经常有人会问这样一个问题,我都知道那台机器的 IP 地址了,直接发给他消息呗,要 MAC 地址干啥?这里的关键就是,没有 MAC 地址消息是发不出去的。

所以如果一个 HTTP 协议的包跑在网络上,它一定是完整的。无论这个包经过哪些设备,它都是完整的。

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

小结

  • 始终想象自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发出去;
    己留着。

小结

  • 始终想象自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发出去;
  • 始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

2 理解网络协议的工作模式相关推荐

  1. 初学者如何理解网络协议

    初学者如何理解网络协议 网络协议是什么?协议分层是怎么回事?什么是协议的实现? 回想当年初识网络协议,被一张网络层次模型图中的"物理层.数据链路层.网络层.传输层--"搞得云里雾里 ...

  2. 初学者如何理解网络协议?

    初学者如何理解网络协议 网络协议是什么?协议分层是怎么回事?什么是协议的实现? 回想当年初识网络协议,被一张网络层次模型图中的"物理层.数据链路层.网络层.传输层--"搞得云里雾里 ...

  3. 把虚拟系统接入网络 虚拟系统工作模式

    如果你想利用VMWare在局域网中新建一个独立的虚拟服务器,为局域网用户提供网络服务;或者想创建一个与网内其他机器相隔离的虚拟系统,进行特殊的调试工作.此时,对虚拟系统工作模式的选择就非常重要了.如果 ...

  4. 计算机网络资料篇(二)——快速理解网络协议

    <网络编程懒人入门(一):快速理解网络通信协议(上篇)> <网络编程懒人入门(二):快速理解网络通信协议(下篇)> 一:五层模型 物理层.数据链路层.网络层.传输层.应用层 1 ...

  5. eMMC之分区管理、总线协议和工作模式【转】

    本文转载自:https://blog.csdn.net/u013686019/article/details/66472291 一.eMMC 简介 eMMC 是 embedded MultiMedia ...

  6. eMMC---简介、分区管理、总线协议和工作模式

    一.eMMC 简介 eMMC 是 embedded MultiMediaCard 的简称.MultiMediaCard,即MMC, 是一种闪存卡(Flash Memory Card)标准,它定义了 M ...

  7. 网络协议必会知识点:互联网网络分层

    文章出自 |<趣谈网络协议> 长时间从事计算机网络相关的工作,我发现,计算机网络有一个显著的特点,就是这是一个不仅需要背诵,而且特别需要将原理烂熟于胸的学科.很多问题看起来懂了,但是就怕往 ...

  8. 华为18级工程师三年心血终成趣谈网络协议文档(附大牛讲解)

    华为18级工程师三年心血终成趣谈网络协议文档(附大牛讲解) 程序员高级码农II 2020-09-25 07:23:00 前言 虽然在大学的时候大家都学过网络协议 ,但是肯定感觉网络协议的知识点非常多 ...

  9. 面试华为必备:华为18级大牛呕心沥血三年整理的 趣谈网络协议

    前言 华为是一个热门的互联网大厂,华为每年都要进很多新人,对于新人来说,那些高大上的技术是用不到的,反倒是非常需要这些基础的文档,有这些新手进步会快很多,搞清楚TCP IP协议栈,其他的学起来也就容易 ...

最新文章

  1. vue3的传送门teleport究竟有多神奇?suspense发起异步请求有多简约?
  2. 后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column
  3. cadence导入dxf文件_Allegro中如何导入DXF文件
  4. Windows Phone7成为诺基亚核心目标
  5. PHP程序员求职的一点思考
  6. Python学习-第三天-面向对象编程基础
  7. 安装Google版本的金山词霸会导致播放Silverlight视频的时候IE或者是FF崩溃
  8. 10分钟教你写个商业计划书
  9. 评测 AlibabaCloud 阿里云国际版 香港轻量云服务器的性能和网络怎么样
  10. SouceInsight v4 注册机源码
  11. html商品分类列表页面,仿京东商城系列7------商品分类页面
  12. Bill Gekas儿童摄影作品欣赏
  13. 某电子计算机有400个终端,(第四章)大数定率与中心极限定理习题.doc
  14. 没有表情包都不好意思说自己是年轻人——python一键保存几千张表情包图片
  15. cmd命令查看已连接的WiFi密码
  16. 国外python在线教学_国外最顶级的Python学习视频送给你!(带中文字幕)
  17. 实验四 对等网的组建
  18. 【无人机学习之QGroundControl】android端App初解4-遥控器通道
  19. 新零售 — RFID 应用案例
  20. 新书推荐 |《计算机安全:原理与实践(原书第4版)》

热门文章

  1. C语言——冒泡排序、改进的冒泡排序
  2. 计算机辅助普通话水平证书要考吗,目前普通话证书考试都是机器测试吗?
  3. 什么是Asterisk?
  4. 远程桌面,openGL
  5. 森林防火综合解决方案
  6. 关于MacPorts
  7. mysql学生表_课程表_选课表,连表查询
  8. java annotation class,Java Class类 isAnnotation()方法及示例
  9. WebGL编程指南-24 同时使用漫反射光和环境反射光、立方体平移旋转缩放变换时漫反射光和环境反射光处理
  10. 笔记本重装系统后声音图标显示红色×号