OSI模型、TCP/IP模型、数据封装与解封装-----网络通信原理

OSI模型、TCP/IP模型、数据封装与解封装

OSI模型

OSI模型
开放式系统互连参考模型(Open system interconnection Reference Model,缩写OSI),由国际标准化组织(International Standard Organization ,ISO)与1984年提出的一个试图使在世界范围内的各个计算机互联的网络标准参考模型


OSI模型的由来

在网络发展的过程中,每个国家和地区都独立的发展自己的网络,但是在实现网络互联的时候,发现由于各自的网络标准不同,导致无法互联
为了解决标准不统一的问题,实现网络的互联,国际标准化组织(ISO)为网络通信领域制造了一个标准:OSI(开放式系统互连参考模型)
建议:业界的厂商在开发任何软件的时候都遵循统一的标准,从而实现各个国家和地区的网络互联。


OSI七层模型

osi本质就是一系列协议集合,人们根据各个协议功能和分工不同将其划分为七层模型
七层为:物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
OSI七层模型的名称、作用、协议
在这里插入图片描述


TCP/IP模型

OSI模型仅仅是ISO提出的一个参考标准,实际在网络中使用更多的是TCP/IP模型,但是实现的功能是相同的。
TCP/IP五层模型:应用层、传输层、网络层、数据链路层、物理层
TCP/IP五层模型就是将OSI七层模型中的上三层,应用层、表示层和会话层合并为应用层。
TCP/IP四层模型:应用层、传输层、网络层、网络接口层
TCP/IP四层模型则是将五层模型层中的数据链路层和物理层结合成网络接口层。

在这里插入图片描述


TCP/IP本质上是一系列协议的集合,所以严格的称呼应该是TCP/IP协议族。

在这里插入图片描述
在物理层和数据链路层
TCP/IP并未定义任何特定协议,它支持所有标准的和专用的协议。比如广泛使用的以太网协议。
网络层
IP协议:互联网协议,定义了网络层地址
ICMP协议:网络控制消息协议,用于测试网络连通性以及对网络故障的排查。
ARP协议:地址解析协议,把IP地址解析为MAC地址,实现数据转发
OSPF协议:开放式最短路径有线协议(动态路由协议),学习其它路由网段,实现不同网段的互通。
传输层
TCP:传输控制协议,面向连接的可靠协议。但传输速度慢。
UDP:用户数据报协议,面向非连接的不可靠协议,但传输速度快。
应用层
HTTP:超文本传输协议,端口TCP 80
FTP:文件传输协议,端口TCP 20、21
TFTP:简单文件传输协议,端口UDP 69
DHCP:动态主机配置协议,端口UDP 67、68

数据通信流程

设备之间的通信,指的是设备之间能够互相传输数据。
设备之间的数据传输,一定是双向的,每个方向都可以分为三个阶段

  • 产生数据,也称为数据封装
  • 传输数据,也称为网络传输
  • 接收数据,也称为数据解封装
  • 在这里插入图片描述

数据封装过程

  • 应用层:各种应用软件说产生的数据被翻译成网络通用语言—二进制编码数据,数据传输是双向的,在传输过程中双方会建立数据通信会话,在传输未完成之前维护数据通信通道,传输完成后终止会话。
  • 传输层:在传输层传输的过程中,来自上层的数据会被分割成数据段,在选择数据传输的方式之后,会为每个数据段装上TCP报文头部。TCP报文头部就包含源端口号和目标端口号,本质传输层提供的是端到端的连接
  • 网络层:在网络层传输的过程中,来自上层的数据段会被封装上新的报文头部—IP头部组成新的数据包,IP头部包含了源IP地址和目标IP地址。网络层主要完成的是实现不同网段的互通
  • 数据链路层:将网络层传递的数据封装成帧,在其前部装上一个MAC头部,其内部存在一个关键字段—MAC地址,由48位二进制数组成,尾部装上一个帧校验序列
  • 物理层:将二进制数字组成的比特流转换为电信号在网络中传输

在这里插入图片描述
数据的解封装
数据的解封装就是在每一层拆去对应的头部或尾部。
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,可以使用`net`模块来创建TCP服务器和客户端,同时也提供了对TCP/IP协议数据封装功能。 当服务器接收到TCP/IP协议的数据时,会触发`data`事件,通过监听该事件可以获取到接收到的原始二进制数据。接着可以通过Node.js内置的`Buffer`对象将二进制数据转换为字符串或者其他格式的数据。 下面是一个简单的示例代码,演示了如何封装基于TCP/IP协议发过来的数据: ```javascript const net = require('net'); // 创建TCP服务器 const server = net.createServer((socket) => { console.log('客户端已连接'); // 监听数据接收事件 socket.on('data', (data) => { console.log('接收到数据:', data); // 封装数据 const str = data.toString('utf8'); console.log('封装后的数据:', str); }); // 监听连接断开事件 socket.on('end', () => { console.log('连接已断开'); }); }); // 启动服务器 server.listen(3000, () => { console.log('服务器已启动'); }); // 创建TCP客户端 const client = net.createConnection({ port: 3000 }, () => { console.log('已连接到服务器'); // 发送数据 client.write('Hello, world!'); }); // 监听数据接收事件 client.on('data', (data) => { console.log('接收到数据:', data); // 封装数据 const str = data.toString('utf8'); console.log('封装后的数据:', str); }); // 监听连接断开事件 client.on('end', () => { console.log('连接已断开'); }); ``` 在上面的示例中,服务器和客户端都监听了`data`事件,当接收到数据时会先输出原始的二进制数据,然后通过`toString()`方法将其转换为字符串格式的数据。这里使用了默认的编码方式`utf8`,也可以根据具体情况使用其他编码方式。 在实际应用中,可能需要根据协议规范对数据进行更复杂的封装操作,这时可以使用第三方的析库,比如`Protocol Buffers`等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值