网络协议之为什么要分层

写在前面

想要学习一个东西,首先要了解为什么要有这个东西,自然,学习网络分层也是如此。

1:为什么要分层

答案其实很简单,只要是一个复杂的程序,都需要分层,而网络协议本身其实也是一个非常复杂的程序,所有需要分层也是理所当然的。为了好理解,可以对比下图:

是不是和我们熟悉的领域一比较,就好理解多了。

所以你肯定知道了每一层肯定都是执行了一些代码逻辑的,简单起见,可以认为只是执行了一个方法,就像下图这样:

其中每个的函数作用如下:

复制代码
proccess_mac_head:获取mac头信息,判断是否和自己的mac匹配,匹配则继续往上层处理,否则把包继续转发
proccess_ip_head:获取IP头信息,判断是否和自己的IP匹配,匹配则继续往上层处理,否则把包继续转发
proccess_tcp_head:获取TCP头信息,根据端口号找到对应的应用进程,并交给对应的应用进程处理

在应用程序处理后,就是反过程了,添加对应的头,最终将数据包通过网口发送出去。使用程序模拟这个过程如下:

java 复制代码
public class NetworkTest {

    public static void main(String[] args) {
        System.out.println("网卡收到信息:MAC头_IP头_TCP头_应用消息");
        System.out.println("物理层函数proccess_mac_head执行,解析mac头,执行后消息变为:IP头_TCP头_应用消息");
        System.out.println("网际层函数proccess_ip_head执行,解析IP头,执行后消息变为:TCP头_应用消息");
        System.out.println("传输层函数proccess_tcp_head执行,解析TCP头,执行后消息变为:应用消息,接着将应用消息交给应用层处理");
        System.out.println("应用层拿到应用消息,开始处理。。。处理结束生成新的需要返回内容:应用消息");
        System.out.println("传输层函数proccess_tcp_head执行,添加TCP头,执行后消息变为:TCP头_应用消息");
        System.out.println("网际层函数proccess_ip_head执行,添加IP头,执行后消息变为:IP头_TCP头_应用消息");
        System.out.println("物理层函数proccess_mac_head执行,添加mac头,执行后消息变为:MAC头_IP头_TCP头_应用消息");
        System.out.println("网卡发送消息:MAC头_IP头_TCP头_应用消息");
    }
}

运行:

复制代码
[INFO] --- exec:3.5.0:exec (default-cli) @ untitled8 ---
网卡收到信息:MAC头_IP头_TCP头_应用消息
物理层函数proccess_mac_head执行,解析mac头,执行后消息变为:IP头_TCP头_应用消息
网际层函数proccess_ip_head执行,解析IP头,执行后消息变为:TCP头_应用消息
传输层函数proccess_tcp_head执行,解析TCP头,执行后消息变为:应用消息,接着将应用消息交给应用层处理
应用层拿到应用消息,开始处理。。。处理结束生成新的需要返回内容:应用消息
传输层函数proccess_tcp_head执行,添加TCP头,执行后消息变为:TCP头_应用消息
网际层函数proccess_ip_head执行,添加IP头,执行后消息变为:IP头_TCP头_应用消息
物理层函数proccess_mac_head执行,添加mac头,执行后消息变为:MAC头_IP头_TCP头_应用消息
网卡发送消息:MAC头_IP头_TCP头_应用消息
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...

为了加深理解再来以浏览器作为应用层处理程序看个例子:

2:其他和分层相关的知识点

2.1:一个基本原则

只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

2.1:二层设备、三层设备

跑了不同层处理程序的设备。

那么什么是二层设备呢?即只有物理层处理相关程序的设备,即只会获取mac头,决定如何处理的设备,最终决定数据包丢弃,转发,或保留。

那么什么是三层设备呢?即跑了物理层处理程序和网际层处理程序的设备,先获取mac头进行处理,接着也会获取IP头进行处理,最终决定数据包丢弃,转发,或保留。

写在后面

参考文章列表

相关推荐
神鸟云41 分钟前
DELL服务器 R系列 IPMI的配置
linux·运维·服务器·网络·边缘计算·pcdn
herderl1 小时前
**僵尸进程(Zombie Process)** 和**孤儿进程(Orphan Process)**
linux·运维·服务器·网络·网络协议
亲爱的非洲野猪1 小时前
令牌桶(Token Bucket)和漏桶(Leaky Bucket)细节对比
网络·算法·限流·服务
G_H_S_3_2 小时前
【网络运维】Playbook项目实战:基于 Ansible Playbook 一键部署 LNMP 架构服务器
linux·运维·服务器·网络·ansible
XINVRY-FPGA2 小时前
10CL016YF484C8G Altera FPGA Cyclone
嵌入式硬件·网络协议·fpga开发·云计算·硬件工程·信息与通信·fpga
七七&55611 小时前
2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
开发语言·网络·golang
元清加油12 小时前
【Golang】:函数和包
服务器·开发语言·网络·后端·网络协议·golang
向日葵.14 小时前
fastdds.ignore_local_endpoints 属性
服务器·网络·php
athink_cn16 小时前
HTTP/2新型漏洞“MadeYouReset“曝光:可发动大规模DoS攻击
网络·网络协议·安全·http·网络安全
zzc92116 小时前
TLSv1.2协议与TCP/UDP协议传输数据内容差异
网络·测试工具·安全·wireshark·ssl·密钥·tlsv1.2