在传统以太网中,为什么要有最小帧长度(64 bytes)和最大帧长度(1500 bytes)的限制?
遇到的问题:以太网的数据帧封装如下图所示,包含在IP数据报中的数据部分最长应该是( )字节?
A.1434
B.1460
C.1480
D.1500
答案:C
原因:

以太网(IEEE 802.3)帧格式:
1、前导码(前同步码):7字节0x55,一串1、0间隔,用于信号同步
2、帧开始定界符:1字节0xD5(10101011),表示一帧开始
3、DA(目的MAC):6字节
4、SA(源MAC):6字节
5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF)
6、数据:46~1500字节
7、帧校验序列(FCS):4字节,使用CRC计算从目的MAC到数据域这部分内容而得到的校验和。
以CSMA/CD作为MAC算法的一类LAN称为以太网。CSMA/CD冲突避免的方法:先听后发、边听边发、随机延迟后重发。一旦发生冲突,必须让每台主机都能检测到。关于最小发送间隙和最小帧长的规定也是为了避免冲突。
考虑如下的情况,主机发送的帧很小,而两台冲突主机相距很远。在主机A发送的帧传输到B的前一刻,B开始发送帧。这样,当A的帧到达B时,B检测到冲突,于是发送冲突信号。假如在B的冲突信号传输到A之前,A的帧已经发送完毕,那么A将检测不到冲突而误认为已发送成功。由于信号传播是有时延的,因此检测冲突也需要一定的时间。这也是为什么必须有个最小帧长的限制。
按照标准,10Mbps以太网采用中继器时,连接的最大长度是2500米,最多经过4个中继器,因此规定对10Mbps以太网一帧的最小发送时间为51.2微秒。这段时间所能传输的数据为512位,因此也称该时间为512位时。这个时间定义为以太网时隙,或冲突时槽。512位=64字节,这就是以太网帧最小64字节的原因。
512位时是主机捕获信道的时间。如果某主机发送一个帧的64字节仍无冲突,以后也就不会再发生冲突了,称此主机捕获了信道。
由于信道是所有主机共享的,如果数据帧太长就会出现有的主机长时间不能发送数据,而且有的发送数据可能超出接收端的缓冲区大小,造成缓冲溢出。为避免单一主机占用信道时间过长,规定了以太网帧的最大帧长为1500。
100Mbps以太网的时隙仍为512位时,以太网规定一帧的最小发送时间必须为5.12μs。
1000Mbps以太网的时隙增至512字节,即4096位时,4.096μs。
IP数据包长度问题总结
TCP/IP协议,涉及到四层:链路层、网络层、传输层、应用层。
其中以太网的数据帧在链路层
IP包在网络层
TCP或UDP包在传输层
TCP或UDP中的数据(Data)在应用层
它们的关系是数据帧{IP包{TCP或者UDP包{Data}}}
————————————————————————————————
在应用程序中我们用到的Data的长度最大是多少,直接取决于底层限制。
我们从下到上分析一下:
1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)—(1500 + 18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;
2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20 = 1480;
3.在传输层,对于UDP包的首部要占8字节,所以这的MTU为1480 - 8 = 1472;
所以,在应用层,您的Data最大长度为1472字节。(当我们UDP包中的数据多于1472时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。)
从上面的分析来看,普通的局域网环境下,UDP的数据最大是1472字节最好,避免分片重组。
但是在网络编程中,Internet中的路由器可能设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时的数据长度最好在576 - 20 -8 = 548字节以内。
Mac OS点击系统偏好设置——网络——高级——硬件可以查看本机的MTU设置。
IP数据包的最大长度是64K字节(2^16 -1),因为在IP包头中用2个字节描述报文长度,2个字节所能表示的最大数字就是2^16-1 = 65536 -1 = 65535.
由于IP协议提供为上层协议分割和重组报文的功能,因此传输层协议的数据包长度原则上来说没有限制。实际上限制还是有的,因为IP包的标识字段终究不可能无限长,按照IPv4,上限是2^32=4G字节。依照这种机制,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必关心数据包的大小,只需要将SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。
UDP则和TCP不同,UDP包头内有总长度字段,同样为2个字节,因此UDP数据包的总长度被限制为(2^16-1),这样恰好可以放进一个IP包内,使得UDP/IP协议栈的实现非常简单高效。65535再减去UDP头本身所占据的8个字节,UDP服务中的最大有效负载长度仅为65527.这个值也就是调用getsockopt()时指定SO_MAC_MSG_SIZE所得到的返回值,任何使用SOCK_DGRAM属性的socket,一次send的数据都不能超过这个值,否则必然得到一个错误。
那么,IP包提交给下层协议时将会得到怎样的处理呢?取决于数据链路层协议,一般得到数据链路层协议都会负责将IP包分割成更小的帧,然后在目的端重组它,在EtherNet上,数据链路帧的大小如开篇所述。而如果是IP over ATM,则IP包将被切分成一个一个的ATM Cell,大小为53字节。
在传统以太网中,为什么要有最小帧长度(64 bytes)和最大帧长度(1500 bytes)的限制?的更多相关文章
- 【转载】传统以太网和时间敏感网络TSN的区别
转载连接:http://www.proav-china.com/News/16800.html ——Biamp亚太区高级工程师 Kane Zhang [专业视听网报道]:[摘要]AVB-Audio ...
- Jquery中$(document).ready()与传统JavaScript中的window.onload方法的区别(2016/8/3)
Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 ...
- LeetCode OJ:Kth Smallest Element in a BST(二叉树中第k个最小的元素)
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。浮点型数据使用注意事项。全局变量特殊之处
JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储. 所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定: <!DOCTYPE html& ...
- 数据结构作业——N个数中未出现的最小整数(想法题)
Description 给出一串数字,这串数字由 n 个数 ai 组成,找出未出现在这串数字中的最小正整数 Input 输入第一行为一个正整数 n (1 <= n <= 1000) 第二行 ...
- 求n个数中的最大或最小k个数
//求n个数中的最小k个数 public static void TestMin(int k, int n) { Random rd = new Ra ...
- 用ES6巧妙的解决传统面试中的算法小问题!
最近自己也在准备面试,在复习算法的时候,机智的用了一波ES6.一起来瞧瞧吧! 1.数组的去重 var arr=str.split(''); for(var i=0;i<arr.length-1; ...
- 以整数元素构成的list中的数字组成最小整数
问题 把一个int型数组中的数字拼成一个串,这个串代表的数字最小. 思路说明 不同角度,对原题理解有所不同.我依照以下的理解方式求解. 对这个问题的理解: 有一个元素是int类型的list: 将上述l ...
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复
先看看线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域.利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索 ...
随机推荐
- SDUT 2623 The number of steps (概率)
The number of steps Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Mary stands in a stra ...
- MySQL 获取子分类ID的所有父分类ID和Name的集合
CREATE DEFINER=`sa`@`%` PROCEDURE `proc_Product_leimu_ParentIds`( IN pID INT ) BEGIN ) vars, product ...
- Windows下面安装和配置Solr 4.9(一)
1.Solr下载 下载地址 :http://lucene.apache.org/solr/ 2.解压,测试 在example文件夹中找到start.jar文件,用命令提示符运行这个文件:ja ...
- 自动化测试尝试 动态Linq表达式生成 ftp上传
自动化测试尝试 1. Selenium IDE Selenium IDE is a Chrome and Firefox plugin which records and plays back u ...
- activity的onCreate参数 saveInstanceState
写过Android程序的都知道Activity中有一个名称叫onCreate的方法.该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始.可是有一点容易被忽视,就是 ...
- 转 CAS实现SSO单点登录原理
原文链接 http://m.blog.csdn.net/hxpjava1/article/details/74019017 CAS 简介 1. 1.1. What is CAS ? CAS ( ...
- Android开发5——文件读写
一.基本概念 在Android应用中保存文件,保存的位置有两处 ①手机自带的存储空间,较小(如200M),适合保存一些小文件,Android中保存位置在data/data/应用包名/files目录 ② ...
- Spring中三种配置Bean的方式
Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...
- php 读取功能分割大文件实例详解
在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数.但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求 ...
- sqlite数据库部署到服务器上的问题
试了一天...本地测试是好的(WIN10 64位+VS2015),部署到服务器上(WIN2008 32位+IIS6) 总是不行..按网上说了什么不要BUNDLE的,加入X86X64目录再放那个SQLi ...