在传统以太网中,为什么要有最小帧长度和最大帧长度的限制

在传统以太网中,为什么要有最小帧长度和最大帧长度的限制?

以太网(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。

对于1000Mb/s的吉比特以太网,MAC层有两种选择,要么保留CSMA/CD,要么不用它。若保留CSMA/CD协议,必须面临碰撞检测问题,这就要再一次减小网络的最大有效传输距离到25米。当然您可以不缩短网络的距离,而是增加一个帧的程度,就如我们开始分析100Mb/s以太网那样,让一个帧持续足够长的时间。但因为上层来的数据没有这么多,所以就需要在MAC层进行一些无用数据的填充来满足这个要求。

最后,我们推导出以下比例关系:

最小帧长/传输速率 正比于 网络最大传输距离/光速

一个网络的最大传输距离也称为冲突域,传输一个最小帧所用的时间(最小帧长/传输速率)正比于1位信息穿越冲突域的时间。

以太网的最大帧长有1518,1522,1536。那么这几个值是怎么来的呢?

下面是最初802.3定义的以太网帧结构:

Preamble (7-bytes) --前导位

Start Frame Delimiter (1-byte) --定界符

Dest. MAC Address (6-bytes) --目的地址

Source MAC Address (6-bytes) --源地址

Length / Type (2-bytes) --长度或帧类型

MAC Client Data --数据,n最大为1500,即MTU

(0-n bytes) Pad --填充字段,p最大为46

(0-p bytes) Frame Check Sequence (4-bytes) --帧校验码

其实Ethernet V2为实际的标准了。所以我们最常见到的是,源地址后是类型而非长度。

在1998年提出的802.3ac里,加入了对vlan的支持。也就是在有vlan的情况下在源地址后多加入4个字节,所以就有了1522这个帧长度了。

Preamble (7-bytes) --前导位

Start Frame Delimiter (1-byte) --定界符

Dest. MAC Address (6-bytes) --目的地址

Source MAC Address (6-bytes) --源地址

Length/Type = 802.1Q Tag Type (2-byte) --表明是VLAN,这个为8100

Tag Control Information (2-bytes) --3-bits User Priority Field;1-bit Canonical Format Indicator (CFI);12-bits VLAN Identifier (VID)

Length / Type (2-bytes) --长度或帧类型

MAC Client Data --数据,n最大为1500,即MTU

(0-n bytes) Pad --填充字段,p最大为46

(0-p bytes) Frame Check Sequence (4-bytes) --帧校验码

最后要提的就是1536这个长度了。我们知道802.3中规定,如果Length / Type的值大于0×600则表示是类型,而这个值就是1536。

1998年提出的802.3z中的应用。802.3中提出了一个Extension字段放在了最末尾。它主要作用是在短封包(如64)传输时,由于1000M速度的加快,导致传输时间的减少,破坏了原有冲突检测的机制,缩短了有效传输矩离,所以要增加一些字节,使长度达到512。当然,这个只用在半双工时了。

第2 / 3页

其实在802.3中没有规定要扩展的值的大小的,所以最大可以扩展到1536。

还有一个就是802.1ad。也就是所谓的“Q-in-Q”,就是多重的vlan了,主要为网络运营商用来管理的,实现用户的vlan和运营商的vlan相隔离。这个也会加大现有封包的长度,会增加4个字节。 以太网最大帧长 最小帧长 - Sacrifice - BabyUnion

还有一个Jumbo frame。这东西不是802.3的标准,而一些厂商提出来的,为了提高1000M时的传输效率。由于是非标的,所以各家支持的大小也不尽相同。一般来说,现在一般可以支持到9k。 在802.3z中还提出一个Frame Bursting。这个东西可以提高短包的传输效率。在1000M以太网下,limit”。帧和帧之间以extension bits来填充gap,以表示线路处于占用状态。burst mode唯一特殊的是,第一个帧要加一个”extension field”。

新的改变可以参见802.3as-2006。

使用burst mode,一端可以连续发包,直到达到了65,536 bit times (8192 byte times)的”burst

时间: 2024-10-23 02:11:17

在传统以太网中,为什么要有最小帧长度和最大帧长度的限制的相关文章

[算法]数组中未出现的最小正整数

题目: 给定一个无序整型数组arr,找到数组中未出现的最小正整数. 例如: arr=[-1,2,3,4].返回1. arr=[1,2,3,4].返回5. 要求时间复杂度为O(N),空间复杂度为O(1). 解答: 在遍历arr之前先生成两个变量.变量l表示遍历到目前为止,数组arr已经包含的正整数范围是[1,l],所以在没有开始之前l=0,表示arr没有包含任何正整数.变量r表示遍历到目前为止,在后续出现最优状况的情况下,arr可能包含的正整数范围是[1,r],所以在没有开始之前,令r=N,r同时

hdu1598find the most comfortable road(并查集+枚举,求起点到终点的边中最大边减最小边差值最小)

Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的"舒适度"有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ), 但XX星人对时间却没那么多要求.要你找出一条城市间的最舒适的路径.(

[算法]在数组中找到一个局部最小的位置

题目: 定义局部最小的概念.arr长度为1时,arr[0]是局部最小.arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]为局部最小.如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小.如果0<i<N-1,arr[i]<arr[i+1]&&arr[i]<arr[i-1],那么arr[i]是局部最小. 给定无序数组arr,已知arr中任何两个相邻的数不相等.写一个函数,只需返回arr中任何一个局部最小出现

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. Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements. 求二叉树中第k个最小的元素,中序遍历就可以了,具体代码和另一个Binary Tree Iterator差不多其实,这题由于把=写成了==调bug调了好久,细心细心啊啊

算法总结之 数组中未出现的最小正整数

给定一个无序整型数组arr,找到数组中未出现的最小正整数 解题思路非常好,需要好好学习一下,很逻辑 如果arr长度为N, 最优解可以做到时间复杂度O(N) 额外空间复杂度O(1) 1.遍历arr之前生成两个变量, l  r   初始值 l=0   r=N 2.从左到右遍历arr,arr[l] 3.如果arr[l]=l+1 没有遍历arr[l]之前,arr已经包含的正整数范围是[1,l],此时出现了arr[l]=l+1的情况,所以arr包含的正整数范围可以扩展到[1,l+1]  即令 l++ 4.

查找数组中未出现的最小正整数

请设计一个高效算法,查找数组中未出现的最小正整数. 给定一个整数数组A和数组的大小n,请返回数组中未出现的最小正整数.保证数组大小小于等于500. 测试样例: [-1,2,3,4],4 返回:1 class ArrayMex { public: int findArrayMex(vector<int> A, int n) { // write code here // write code here sort(A.begin(),A.end()); //排序 if(A[0] > 1) r

数组中未出现的最小正整数(算法)

1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int s[100]; 5 int main() 6 { 7 int l,r; 8 int n; 9 while(scanf("%d",&n),n) 10 { 11 for(int i=0;i<n;i++) 12 scanf("%d",s+i); 13 l=0; 14 r=n; 15 while

求无序数组中未出现的最小正整数

给定一个无序整型数组arr,找到数组中未出现的最小正整数.要求时间复杂度为O(N),空间复杂度为常数级. 例如: arr=[33,33,33,33]  返回1 arr=[34,56,45,12]  返回1 arr=[-1,2,3,4]  返回1 arr=[1,2,3,4]   返回5 ... 随便什么都行 原理很简单,代码用数据跑一遍就看出思想了. 1 #include<iostream> 2 #include<fstream> 3 using namespace std; 4 i

8.25 数组中未出现的最小正整数

[题目]: 给定一个无序整型数组arr,找到数组中未出现的最小正整数 举例: arr=[-1, 2, 3, 4],返回1 arr=[1, 2, 3, 4],返回5 题目来源:左程云老师<程序员代码面试指南> 原文地址:https://www.cnblogs.com/latup/p/10205040.html