草庐IT

网络初识之协议分层

奋斗小温 2024-02-27 原文

目录

一、初始网络

1.网络通信基础

1.1 IP地址

1.2 端口号

1.3 认识协议

1.4 五元组

2. 协议分层

2.1 什么是协议分层

2.2 协议分层的好处

2.3 TCP/IP五层模型(最核心的概念)

3. 封装和分用

3.1 发送过程(以QQ发送消息为例)

3.2 接收过程

3.3 真实网络环境中要经理多节点进行转发


 

一、初始网络

1.网络通信基础

1.1 IP地址

1️⃣IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址

2️⃣IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如: 01100100.00000100.00000101.00000110。

3️⃣127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1;本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。

1.2 端口号

在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单说:端口号用于定位主机中的进程

类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)

✨端口号是0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。

1.3 认识协议

协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。通常由三要素组成:

1️⃣语法:即数据与控制信息的结构或格式;

2️⃣语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;

3️⃣时序:即事件实现顺序的详细说明。

协议(protocol)最终体现为在网络上传输的数据包的格式

1.4 五元组

在TCP/IP协议中,用五元组来标识一个网络通信:

1. 源IP:标识源主机
2. 源端口号:标识源主机中该次通信发送数据的进程
3. 目的IP:标识目的主机
4. 目的端口号:标识目的主机中该次通信接收数据的进程
5. 协议号:标识发送进程和接收进程双方约定的数据格式

2. 协议分层

在网络通信中,需要约定的协议,其实是非常复杂的。面对复杂环境,就需要复杂协议,但是一个复杂的协议也是不好;那么我们就可以把一个协议拆分成多个协议:协议是拆分出很多存在小的协议,作用或者定位是类似的,就可以针对这些小协议进行“分层”,同时针对这些不同的类别进行分层(相当于是约定 层数 和 级数 之间的调用关系,要求上层协议调用下层协议,下层协议给上层提供支持,不能跨层调用

2.1 什么是协议分层

协议分层类似于打电话时,定义不同的层次的协议

2.2 协议分层的好处

1️⃣分层之后就可以做到 层次之间,耦合程度比较低;上层协议不必了解写层的细节,下层也不必了解上层的细节

2️⃣方便对某一层的协议进行替换

🌈分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接

在代码中,类似于定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类(使用方,使用服务):

1️⃣对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可

2️⃣对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可

2.3 TCP/IP五层模型(最核心的概念)

1️⃣应用层关注传输过来的数据要干啥

负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

2️⃣传输层不考虑中间路径,只关注起点和终点

负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。

3️⃣网络层主要负责两个遥远的节点之间 路径规划

负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。

4️⃣数据链路层主要关注的是两个相邻节点之间的传输

负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。

有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层

5️⃣物理层网络通信的基础设施,网络,光纤,网络接口...网络上的高速公路

负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。

物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层

3. 封装和分用

在协议分层的背景下,数据如何让通过网络传输?封装 和 分用

1.即发送方发送数据,要把数据从上到下,依次交给对应的层次的协议,进行封装

2.接收方收到数据,要把数据从上到下,依次交给对应的层次的协议,进行解析

3.1 发送过程(以QQ发送消息为例)

1️⃣应用层拿到用户数据,进行封装,封装成应用层数据包

2️⃣ 传输层拿到上述数据,应用层要调用传输层提供的 api ,来处理这个数据,传输层有很多协议,最典型的是 TCP 和 UDP,此处以 UDP 为例:

一个典型的据报都是通过报头+载荷的方式构成

此处,UDP协议再给应用层数据报加上 UDP 报头(本质上是字符串拼接),就是为了再贴一层标签,从而在标签上填写必要的属性;传输层协议最关键的属性就是源端口和目的端口

3️⃣ 传输层到网络层

UDP 数据报已经有了,接下来就要把这个数据报交给网络层的协议;网络层最常见的协议,就是 IP 协议;

上述 UDP 数据报,到达网络层,还需要进一步的封装:添加上 IP 协议报头

IP协议报头+整个 UDP 数据报,作为 IP 的载荷

IP协议报头有 1) 源IP 2) 目的IP (源IP 和目的IP 就描述了这次传输中,最初的起点和最终的终点)

整个 UDP 数据报有 1) 源端口(发送方程序的端口号) 2) 目的端口(接收方程序的端口号)

 4️⃣网络层交给数据链路层

最典型的协议,叫做 以太网(数据链路层+物理网)

以太网数据帧:以太网帧头+源IP、目的IP+源端口、目的端口+以太网帧尾

以太网帧头有 1) 源 mac(也叫物理地址,也是描述一个主机在网络上的位置,它的功能和ip很相似,但是当下就把这两个地址分别作用于不同的用途,IP用来进行网络层的路径规划)

                      2) 目的 mac 地址(mac用来进行描述数据链路层,两个即将进行传输的相邻节点)

 5️⃣数据链路层就要把上述以太网数据帧交给物理层,物理层要把上述 0101 的二进制数据 转化为 光信号/电信号/电磁波信号,进行传输

🌈上述过程操作系统已经封装好了

3.2 接收过程

与上述过程刚好相反——发送:从上到下,依次封装,新增报头 接收,从上到下,依次分用,去掉报头

1️⃣物理层(网卡):收到高低电平二进制数据,就会对这里的信号进行解析,还原成 0101 这样的二进制序列

2️⃣从物理层交给数据链路层

此时就把上述 0101 这系列数据当做一个 以太网数据帧(此处是从以太网线,收到的数据,就是要交给以太网协议来处理)

 把帧头去掉,帧尾去掉,取出中间的载荷,再往上交给网络层(以太网数据帧头中有一个消息类型,根据这个类型就知道网络层是 ip协议了)

3️⃣网络层

 此时就由网络层的 IP 协议进行解析数据报,也是去掉 IP 报头,同时会做一些工作,最重要的还是取出 载荷,交给更上层的传输层协议

(ip 数据报,报头中也有一个字段,标识当前传输层用的是哪个协议)

4️⃣传输层

此处是由 UDP 来解析,还是去掉报头,取出载荷,把数据交给应用层;借助端口来区分具体的应用程序;每个要接收网络数据的程序都需要关联上一个端口号

 5️⃣应用层

 由 qq 这个程序,进行解析应用层数据报,取出下列字段,放在程序的界面中

发送方:层次分装;接收方:层次分用

3.3 真实网络环境中要经理多节点进行转发

中间的交换机,只需要封装分用到 数据链路层(只需要改源 mac 目的 mac)

中间的路由器,则需要分装分用到 网络层(也需要改 mac,同时还需要根据目的 ip 进行下一阶段的路径规划)

通常也说:交换机是进行“二层转发”,路由器进行“三层转发

 上述内容说的是“经典”的交换机路由器,也就是出现在教科书/考试试卷上的交换机路由器;但实际上,真实世界的路由器/交换机 之间的越界越来越小了;路由器可以通过设定特殊模式,只进行二层转发,交换机也有高端交换机,支持三层转发,甚至路由器/交换机还可以封装分用到 传输层 甚至 应用层

 

有关网络初识之协议分层的更多相关文章

  1. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  2. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  5. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

  6. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  7. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  8. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  9. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  10. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

随机推荐