当前位置: 首页 > news >正文

【通信协议】帧、数据报、数据包的区别和联系

在学习计算机网络时,我们经常会遇到帧、数据包、数据报等名词?有人会问,他们不是都一样的吗,不是都是在网络传输的数据概念吗?其实它们三个还真不一样。那我们赶紧看一下他们之间的区别和联系。

      我们首先从概念上来区分他们:

      数据帧(Frame):就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如ip数据包。    

      数据包(Packet):TCP/IP协议通信传输中的数据单位,处于网络层,在局域网中,“包”是包含在“帧”里的。

      数据报(Datagram):多用于网络层以上,面向无连接的数据传输,工作过程类似于报文交换。采用数据报方式传输时,被传输的分组称为数据报。

      有人说,局域网中传输的不是“帧”(Frame)吗?没错,但是TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,而帧是工作在第二层(数据链路层)。上一层的内容由下一层的内容来传输,所以在局域网中,“包”是包含在“帧”里的。       名词解释:OSI(Open System Interconnection,开放系统互联)模型是由国际标准化组织(ISO)定义的标准,它定义了一种分层体系结构,在其中的每一层定义了针对不同通信级别的协议。OSI模型有7层,1~7层分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。OSI模型在逻辑上可分为两个部分:低层的1~4层关注的是原始数据的传输;高层的5~7层关注的是网络下的应用程序。 我们可以用一个形象一些的例子对数据包的概念加以说明:我们在邮局邮寄产品时,虽然产品本身带有自己的包装盒,但是在邮寄的时候只用产品原包装盒来包装显然是不行的。必须把内装产品的包装盒放到一个邮局指定的专用纸箱里,这样才能够邮寄。这里,产品包装盒相当于数据包,里面放着的产品相当于可用的数据,而专用纸箱就相当于帧,且一个帧中只有一个数据包。       那我们从体系结构上区分他们:

       一般说来,数据链路层发出的数据包称为frame,地址是链路层的地址,如mac地址;网络层发出的数据包称为packet,地址是网络层地址,如ip地址;传输层发出的数据包称为segment/datagram,地址是传输层地址,如TCP的端口号。

   下面的图片就很好解释了各个数据名词所对应的层次:

总而言之:

    二层的PDU叫做Frame;    IP的叫做Packet;    TCP的叫做Segment;    UDP的叫做Datagram。

————————————————————

最后再补充一个知识点

数据包的帧封装原理:

    通过前面的学习我们就已经知道,网络层传输的包(packet,又称分组),在数据链路层中传输的是“帧”(frame)。数据包到达数据链路层后加上数据链路层的协议头和协议尾就构成了一个数据帧。在每个帧的前部加上一个帧头部,在帧的结尾处加上一个帧尾部,把网络层的数据包作为帧的数据部分,就构成了一个完整帧。帧头和帧尾就是作为帧的起始和结束标志,也就是帧边界,如图所示。

                      

    由数据包封装成的数据帧其大小是受对应的数据链路层协议的MTU(最大传输单元)限制的,如以太网数据链路层封装网络层IP 包的MTU 值为1500 字节(这是指帧中数据部分,也就是来自网络层整个数据分组,最大不能超过1500 字节,但不包括帧头和帧尾部分)。同时,帧还有最小大小限制,如以太网帧中封装的IP 包最小值为46 字节,如果封装的IP 包小于最小帧要求时,就要用一些特殊字符进行填充,以满足对应链路中传输最小帧的限制。

用通俗易懂的话解释就是:

    当数据数据链路层传播的时候通常叫“帧”,当一个帧被接收并交由第二层处理:剥开帧头帧尾,获得数据包(对于第二层来说它只认识帧头和帧尾,其它包括包头等都是帧承载的普通数据);完了这个包(packet)被交给第三层:它能识别包头,得到被包在里面的信息(这信息就包含第四层比如tcp数据报头,但对于第三层来说报头也只是它所承载的普通数据),第三层完事之后把去掉包头的数据给第四层,这坨数据就是数据报(英文datagram / segment),那么第四层就认得报头然后干该自己干的事了。

转自http://m.blog.csdn.net/qq_25606103/article/details/51295965

相关文章:

  • 【网络编程】Python网络编程详解socket
  • 【多线程】C/C++语言中多线程的简单例子
  • 【Python数据序列化】详解Python之数据序列化(json、pickle、shelve)
  • 【Socket】Windows下C语言的Socket编程例子(TCP和UDP)
  • 【php扩展】PHP-CPP:一个开发PHP扩展的C++库
  • 【php构架】Zend Enginephp
  • 【AOP】轻松理解AOP(面向切面编程)
  • 【GCC】生成debug、release、32位版与64位版|gcc参数和DEBUG条件编译
  • 【stl map】C++中的STL中map用法详解
  • 【socket】Socket send函数和recv函数详解
  • 【OLTP与OLAP】OLTP与OLAP的区别
  • 【gcc】 gcc编译工具生成动态库(共享库)和静态库
  • 【cJSON】cJSON 实例
  • 【yum/apt-get】yum/apt-get/rpm/dpkg/brew之间的区别
  • 【删除重复记录】SQL删除重复记录
  • js正则,这点儿就够用了
  • MySQL几个简单SQL的优化
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SpringBoot 实战 (三) | 配置文件详解
  • SQL 难点解决:记录的引用
  • 大型网站性能监测、分析与优化常见问题QA
  • 给初学者:JavaScript 中数组操作注意点
  • 技术胖1-4季视频复习— (看视频笔记)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​2020 年大前端技术趋势解读
  • #QT(TCP网络编程-服务端)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C语言)球球大作战
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .apk 成为历史!
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .Net 路由处理厉害了
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net专家(高海东的专栏)
  • /*在DataTable中更新、删除数据*/
  • /boot 内存空间不够
  • @Documented注解的作用
  • @ResponseBody
  • [100天算法】-x 的平方根(day 61)
  • [1127]图形打印 sdutOJ
  • [20170713] 无法访问SQL Server
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [BZOJ3223]文艺平衡树
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [C++]C++类基本语法
  • [codevs] 1029 遍历问题
  • [CSS]CSS 字体属性