第2讲 | 网络分层的真实含义是什么?
这四个问题你真的懂了吗?
因为教科书或者老师往往会打一个十分不恰当的比喻:为什么网络要分层呀?因为不同的层次之间有不同的沟通方式,这个叫作协议。例如,一家公司也是分“层次”的,分总经理、经理、组长、员工。总经理之间有他们的沟通方式,经理和经理之间也有沟通方式,同理组长和员工。有没有听过类似的比喻?
第一个问题 :请问经理在握手的时候,员工在干什么?很多人听过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层的内容呢?
一个综合的问题。从你的电脑,通过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头摘下来,看看到底是丢弃、转发,还是自己留着。
OSI七层协议模型从下至上依次是:
- 物理层 (Physical Layer)
- 功能:定义了网络设备之间物理接口的电气、机械、过程和功能规范,以及如何激活、维持、关闭物理链路的规则。它涉及信号的传输和接收,包括信号的电压、电流、频率和波形等特性。
- 数据链路层 (Data Link Layer)MAC
- 功能:负责在两个相邻节点间可靠地传输数据帧,实现错误检测和修正,同时通过MAC地址来寻址,确保数据在本层内正确传输。它分为逻辑链路控制(LLC)子层和媒体访问控制(MAC)子层。
- 网络层 (Network Layer)IP
- 功能:负责将数据包从源主机路由至目的主机,通过IP地址或其他网络层协议提供的地址来进行逻辑寻址。它还涉及到路径选择、分组转发与网络互连。
- 传输层 (Transport Layer)TCP UDP
- 功能:提供了端到端的数据传输服务,确保数据可靠或顺序无误地到达目标进程。在TCP/IP协议栈中,主要有TCP(传输控制协议)提供可靠传输,UDP(用户数据报协议)提供无连接不可靠传输。
- 会话层 (Session Layer)
- 功能:建立、管理和终止不同主机上的应用程序间的会话连接,负责同步交互和恢复机制。在现代网络体系结构中,许多会话层的功能已经合并到其他高层实现。
- 表示层 (Presentation Layer)
- 功能:处理数据的表示方式,如数据格式转换、加密解密、压缩解压等,确保数据在不同系统间的语法和语义兼容性。
- 应用层 (Application Layer)HTTP DNS FTP
- 功能:直接为用户提供服务,支持各种网络应用,如电子邮件、文件传输、Web浏览、远程登录等。这一层包含了许多具体的协议标准,例如HTTP、FTP、SMTP、DNS等。
TCP/IP四层模型(有时也被描述为五层模型)
- 应用层 (Application Layer)
- 同样位于模型顶层,包含各种应用协议,实现用户应用程序对网络资源的访问。
- 传输层 (Transport Layer)
- 与OSI模型相同,负责端到端的数据传输服务,TCP和UDP协议在此层运行。
- 网络层(Internet Layer, Network Layer)
- 负责将数据包从一个网络传输到另一个网络,通过IP协议进行寻址和路由选择。
- 网络接口层(主机-网络层)(Link Layer, sometimes called Network Access Layer)
- 结合了OSI模型的数据链路层和物理层的功能,负责在单一网络中发送和接收数据帧,包括硬件地址识别、错误检测和媒介访问控制。
小结
理解网络协议的工作模式,有两个小窍门:
- 始终想象自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发出去;
- 始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。