zoukankan      html  css  js  c++  java
  • 以太网帧最小长度为64字节的原因(转)

      转:http://blog.sina.com.cn/s/blog_13b34cfee0102wjfo.html

      在编写arp请求程序的时候,struct arpMsg 结构体的最后一个成员是u_char pad[18],这个成员是防止arp报文小于64字节而添加的,但为什么会有这个要求呢?这就要提到数据在物理层的传输方式CSMA/CD了.

    CSMA/CD:即带冲突检测的载波监听多路访问技术(载波监听多点接入/碰撞检测).

     
     

     以太网是不可靠的,这意味着它并不知道对方有没有收到自己发出的数据包,但如果他发出的数据包发生错误,他会进行重传。以太网的错误主要是发生碰撞,碰撞是指两台机器同时监听到网络是空闲的,同时发送数据,就会发生碰撞,碰撞对于以太网来说是正常的。

    我们来看一下,假设A检测到网络是空闲的,开始发数据包,尽力传输,当数据包还没有到达B时,B也监测到网络是空闲的,开始发数据包,这时就会发生碰撞,B首先发现发生碰撞,开始发送碰撞信号,所谓碰撞信号,就是连续的01010101或者10101010,十六进制就是55或AA。这个碰撞信号会返回到A,如果碰撞信号到达A时,A还没有发完这个数据包,A就知道这个数据包发生了错误,就会重传这个数据包。但如果碰撞信号会返回到A时,数据包已经发完,则A不会重传这个数据包。

    我们先看一下,以太网为什么要设计这样的重传机制。首先,以太网不想采用连接机制,因为会降低效率,但他又想有一定的重传机制,因为以太网的重传是微秒级,而传输层的重传,如TCP的重传达到毫秒级,应用层的重传更达到秒级,我们可以看到越底层的重传,速度越快,所以对于以太网错误,以太网必须有重传机制。

    要保证以太网的重传,必须保证A收到碰撞信号的时候,数据包没有传完,要实现这一要求,A和B之间的距离很关键,也就是说信号在A和B之间传输的来回时间必须控制在一定范围之内。IEEE定义了这个标准,一个碰撞域内,最远的两台机器之间的round-trip time 要小于512bit time.(来回时间小于512位时,所谓位时就是传输一个比特需要的时间)。这也是我们常说的一个碰撞域的直径。

    512个位时,也就是64字节的传输时间,如果以太网数据包大于或等于64个字节,就能保证碰撞信号到达A的时候,数据包还没有传完。

    这就是为什么以太网要最小64个字节,同样,在正常的情况下,碰撞信号应该出现在64个字节之内,这是正常的以太网碰撞,如果碰撞信号出现在64个字节之后,叫 late collision。这是不正常的。

    总结:最小数据帧的设计原因和以太网电缆长度有关,为的是让两个相距最远的站点能够感知到双方的数据发生了碰撞;最远两端数据的往返时间就是争用期,以太网的争用期是51.2微妙,正好发送64byte数据。

    交换机在传输一个64字节的数据包时,具体的数据包在传输过程中会在每个包的前面加上64个bit preamble(前导符),然后在每个包之间会有96个bit的IFG(帧间隙),也就是原本传输一个64个字节的数据包,虽只有512个bit,但在传输过程中实际上会有512+64+96=672bit,也就是说,传输一个64字节数据包,但是这时一个数据包的长度实际上是有672bit的。 千兆端口线速包转发率=1000Mbps/672=1.488095Mpps,约等于1.4881Mpps, 百兆端口线速包转发率=100Mbps/672=0.1488095Mpps,约等于0.14881Mpps。一个交换机的数据包转发能力的计算方法:交换机满配置吞吐量(Mpps)=满配置GE端口数×1.488Mpps

  • 相关阅读:
    python中实现mysql连接池
    flask简单的路由分发
    用进程池创建子进程
    用类创建子进程
    用函数创建子进程
    fiddler抓包工具使用
    requests库的小技巧
    requests库的get请求,带有cookies
    requests库的post请求
    Android下Json数据解析
  • 原文地址:https://www.cnblogs.com/Flychown/p/6734445.html
Copyright © 2011-2022 走看看