当你听到什么二层设备、三层设备、四层LB和七层LB中层的时候,是否一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么工作呢?

在教科书中经常会有一个对网络为什么要分层有一个不是十分恰当的比喻:因为不同的层次之间有不同的沟通方式,这个叫作协议。例如一家公司也是分层次的,分总经理、经理、组长、员工。总经理之间有他们的沟通方式,经理和经理之间也有沟通方式,同理组长和员工也有自己的共同方式。

那么第一个问题来了,经理在握手的时候,员工在干什么呢?很多人听过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层的内容呢?

网络为什么要分层?

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

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

程序是如何工作的?

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

拿进来以后,就要交给一段程序来处理,于是调用了process_layer(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_layer(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头摘下来,看看到底是丢弃、转发,还是自己留着。

小结

理解网络协议的工作模式,有两个小窍门:

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

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

02-网络为什么要分层相关推荐

  1. 网络为什么要分层—程序如何工作

    文章目录 开篇问题 网络为什么要分层? 程序是如何工作的? 层与层之间的关系 小结 开篇问题 TCP 在进行三次握手的时候,IP层和 Mac 层对应有什么操作呢? 从原始地址 A 到目标地址 D,中间 ...

  2. 计算机网络协议的缺点,对网络协议的分层处理的优缺点

    网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能.一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合.TCP/IP通常被认为是一个四层协议系统,对网络协议的分层处理的优缺点是什 ...

  3. C1任务02 网络初窥之双任务的实现与分析

    C1任务02 网络初窥之双任务的实现与分析 目录 C1任务02 双任务的实现与分析 一.工具准备 二.任务1-网络抓包并添加额外的字段 三.任务2-在code.org上完成互联网模拟器的系列任务 2- ...

  4. 网络编程与分层协议设计:基于linux平台实现,网络编程与分层协议设计:基于Linux平台实现...

    图书简介 本书以Linux网络套接字编程和网络分层协议的设计与程序实现为主题,详细介绍如何在Linux平台下进行套接字程序设计,并给出了一个基于分层协议的应用实例,用于模拟Linux网络协议栈中IP层 ...

  5. 带你认识网络世界,什么是网络协议、分层有什么好处

    作者:一天,本文首发于公众号:网络之路博客 前言 对于路由交换的课程,构思了两个星期,一直在想一个好的顺序流程,以及怎么去讲解,因为跟之前的两门课程无线与防火墙不一样,路由交换属于数通里面的入门课程, ...

  6. 网络 TCP/IP 分层思想 综合布线系统

    计算机网络组成:硬件.操作系统.应用程序 计算机网络功能分为 资源共享.数据传输.增加可靠性.提高系统处理能力 计算机网络发展阶段 60年代--标志性事件:ARPANET--关键技术:分组交换 70- ...

  7. 074.JAVA网络编程_网络概述和分层模型

    1. 计算机网络 1.1. 计算机网络的概念 1.2. 网络分层 1.3. 网络各层常用协议 1.3.1. OSI 分层模型 1.4. 分层模型各层含义 1.4.1. 应用层 1.4.2. 表示层 1 ...

  8. FC网络学习笔记02 -网络配置方法

    随着新一代飞机的综合化航电系统对通信需求的不断提高,传统的ARINC429.1553B总线的传输速率分别只有100Kbps和1Mbps,其带宽已远远不 论文联盟 http://Www.LWlm.cOm ...

  9. Faster RCNN超详细入门 02 网络细节与训练方法

    文章目录 前言 论文结构 Abstract Introduction Related Work Region Proposal Network Experiments Conclusion 网络架构 ...

  10. 力扣每日一题21.08.02网络延迟时间

    网络延迟时间 题目描述: 有n个网络节点,标记为1到n. 给你一个列表times,表示信号经过有向边的传递时间.times[i] = [ui, vi, wi],其中ui是源结点,vi是目标节点,wi是 ...

最新文章

  1. 一种集各种优点于一身的技术面试方式--转
  2. python查询MySQL写入Excel
  3. mysql profiling表_mysql8 参考手册-INFORMATION_SCHEMA PROFILING表
  4. java面试题三十一
  5. PurchaseOrder创建成功,然而...
  6. Linux lsof命令使用详细
  7. entOS查看系统信息-CentOS查看命令
  8. GroupBy()方法
  9. echarts3Dearth 地球数据可视化添加 tooltip效果和涟漪扩散的效果
  10. chrome浏览器安装印象笔记插件
  11. matlab GUI页面 科学计算器代码
  12. 请问如何制作中国象棋对弈软件的界面部分?
  13. 【OpenCV 例程200篇】203. 伪彩色图像处理
  14. win10去掉快捷方式小箭头_win7电脑桌面图标有这样的小箭头,怎么去掉?
  15. 用友T+、U8、NC系列,致远OA产品二次开发
  16. 2021年中式面点师(中级)报名考试及中式面点师(中级)考试总结
  17. 测试知识之:黑盒白盒和灰盒测试
  18. 股权分配有什么风险?
  19. Linux tar/rpm/yum命令软件安装
  20. unity3d中ScriptingBackend选择mono和il2cpp的区别

热门文章

  1. 推荐5个堪称神器的学习网站,在家你值得拥有
  2. C++项目--汇总(无工作经验或者不到两年工作经验者)
  3. 腾讯技术总监的转行感悟
  4. C语言实现简单的电梯控制系统
  5. 鸿蒙系统如何开启多屏互动,鸿蒙带来的超强多屏互动 荣耀智慧屏果然不一样...
  6. Autodesk Alias AutoStudio 2021.3.1
  7. SOCKS5实现(一)
  8. Away3D学习笔记1 - 戏说Flash 三维引擎
  9. 新手如何搭建一个比较简单的网站?完全不会代码的新手小白搭建自己的网站流程分享!
  10. 文件系统(十一)—fuse内核实现