第2讲 | 网络分层的真实含义是什么?

关注协议间的关系,不要单独拆开一个协议来看。

Q : 从你的电脑,通过SSH登录到公有云主机里面,都需要经历那些过程?或者说打开一个电商网站,都需要经历哪些过程?说的越详细越好。

网络为什么要分层?

因为,是个复杂程序都要分层。

理解计算机网络中的概念,一个很好的角度是,想象网络包就是一段 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 头摘下来,看看到底是丢弃、转发,还是自己留着。

小结

总结一下今天的内容,理解网络协议的工作模式,有两个小窍门:

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

始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

最后,给你留两个思考题吧。

如果你也觉得总经理和员工的比喻不恰当,你有更恰当的比喻吗?

要想学习网络协议,IP 这个概念是最最基本的,那你知道如何查看 IP 地址吗?

参考资料:

互联网协议以及网络分层  https://blog.csdn.net/yangnianbing110/article/details/37927647

ISO网络参考模型分层     https://blog.csdn.net/yanghaitao_1990/article/details/51694688

网络分层模型  https://blog.csdn.net/foreverling/article/details/44302435

原文地址:https://www.cnblogs.com/zhangjianbin/p/9241312.html

时间: 2024-10-08 09:13:59

第2讲 | 网络分层的真实含义是什么?的相关文章

网络分层的真实含义是什么?---读后感

1.此图很形象地i描述了计算机的分层:2.值得记忆的是:只要是在网络上跑的包,都是完整的.可以有下层没上层,绝对不可能有上层没下层.3.问题:TCP协议三次握手四次断开的时候,IP层和MAC层是如何配合的? 原文地址:https://blog.51cto.com/8560232/2431270

数据封装 DataEncapsul时网络分层模型

如今学习分了十分十分重 要.重要性重要到网络课程学(图1数据封装)习中不论怎么也得也得把握它首要 内容是一个包.悉数数据包含 TFTP头被别的一个协议 这儿是UDP封装,先是被榜首个协议这儿是TFTP报头(或许 报尾)包装封装"然后.然后下一个IP一贯重复下去,直到硬件物理层这儿是以太网 当别的一台机器接纳到包.内核剥去IP和UDP头,硬件先剥去以太网头.TFTP次序再剥去TFTP头,毕竟得到数据.如今总算讲到身败名裂的网络分层模型 LayerNetworkModel这种网络模型在描绘网络体系上

android:layout_margin真实含义 及 自定义复合控件 layout()执行无效的问题解决

一.关于layout_margin 搞Android时间也不短了,对layout_margin也不陌生了,可最近遇到一个问题让我发现,对它的认识还不够深入全面.大量网络资料上都说,layout_margin指view距离父view的距离.这个说法不够严谨,正确的说法是,距离view的相对view的距离才更准确. 在Linearlayout下,可以认为是距离父view的距离.但在RelativeLayout下则不然,如果view A已经写定在view B的右侧,则view A的layout_mar

01 概述 网络分层

讲的是这本书: Book:<TCP/IP 详解> 内容提要 网络分层 OSI 分层模型 分层原则(软件产品也是一样): 每层有清晰的边界,每层有自己的功能.每层相互独立,互不影响. 举例: 北京老板想发月饼(中秋节),所想他想告诉上海公司的老板也发月饼. 应用层: 北京老板说了要发月饼. 表示层: 但是老板肯定说的是白话, 需要贴身秘书帮着修饰一下话语. (修饰应用层数据,修饰的冠冕堂皇一些) 会话层: 部门秘书把信放到信封里,然后写上地址, 源 / 目的地址就等于主机上的两个应用进程. (所

第12章 网络基础(1)_网络分层和TCP/IP协议族

1. 协议的概念 (1)计算机网络中实现通信必须有一些约定.如对速率.传输代码.代码结构.传输控制步骤和出错控制等约定,这些约定即被称为通信协议 (2)在两个节点之间要成功地进行通信,两个节点之间必须约定使用共同的"语言",这些被通信各方共同遵守的约定.语言.规则被称为协议 (3)在Internet中,最为通用的网络协议是TCP/IP协议. 2. 网络分层模型 (1)应用层:提供用户接口,特指能够发起网络通信的应用程序,如客户端程序.QQ.MSN.浏览器等,服务器程序有Web服务器.邮

android:layout_weight的真实含义

首先声明只有在Linearlayout中,该属性才有效.之所以android:layout_weight会引起争议,是因为在设置该属性的同时,设置android:layout_width为wrap_content和match_parent会造成两种截然相反的效果.如下所示: <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android

基本网络概念之网络分层

网络通信的不同方面被分解为不同的层.每一层表示为物理硬件与所传输信息之间的不同抽象层次.在理论上,每一层只与紧挨其上和其下的层对话.将网络分层,这样就可以修改甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层.如下图: 上图显示了你的网络中可能存在的协议栈.尽管如今在Internet上中间层协议相当稳定,但是上层和下层的协议变化很大.有些主机使用Ethernet(以太网):有些使用WiFi:有些使用PPP:还有一些主机使用其他的协议.类似地,这个栈顶层使用的协议完全取决于主机

Android开发(二十七)——android:layout_weight的真实含义

android:layout_weight的真实含义是:一旦View设置了该属性(假设有效的情况下),那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比! 含义:原有宽度+剩余空间占比 设屏幕宽度为L,在两个view的宽度都为match_parent的情况下,原有宽度为L,两个的View的宽度都为L,那么剩余宽度为L-(L+L) = -L, 左边的View占比三分之一,所以总宽度是L+(-L)*1/3 = (2/3)L.事实上默认的View的weig

网络分层模型

目前存在的两种网络分层模型:OSI模型和TCP/IP模型.OSI模型一共分为七层,TCP/IP模型和OSI模型类似,但是只分为四层. OSI模型 OSI的全程是Open Systems Interconncection,即开放系统互联,它由ISO(International Organization for Standardization)制定.OSI是网络通信的一种通用框架,它分为七层,并且定义了在每一层上数据的处理方法. 层数 层名 备注 7 应用层(Application) 6 表示层(P