为何互联网最终选择让IP分片?

因特网协议(IP)为互联提供了两个基本功能:寻址和分片。解释为什么要在这个互连协议中引入数据包分片?
刚工作那会,因为工作原因需要学习Ethernet,进而开发航空系统专用“优先级调度以太网”。遇到两个问题,分别为:
  • 为何IP报文(甲方)的最大尺寸为65535字节,而以太网作为IP报文的承运方(乙方),允许IP最大报文的包裹尺寸为1500字节,为何有这个限制?为何不能允许65535字节?那样传输效率会更高!

  • 为何Ethernet在传输真正的IP报文之前,需要先传输8个字节的Preamble?把Preamble去掉传输效率会更高!

请教一位硬件专家,专家回答是:preamble是机器同步码,之所以限制IP报文=1500字节,是因为可以时钟保持/恢复,可以保证足够高的传输可靠性。报文再长,将无法保证收发时钟同步,从而造成高误码率。其它都听懂了,只是对时钟保持/恢复(Clock Recovery)怎么也理解不了。越是理解不了的内容,越是有好奇心。
首先,这个地球上没有两台设备的时钟频率是完全一样的。通俗地说,甲设备的1纳秒,和一设备的1纳秒并不一样长。即使同一个设备,在不同的时间段1纳秒也是不一样长的,受设备的温度、电压的影响。时钟频率就好比节拍,收发双方只有处于同一个节拍,或者极端近似相同的节拍,才能保证收的数据,就是发的数据,否则会造成误码丢包。
在建筑工地会看到工人在扔砖头,一个扔,另一个接。双方节拍完全一致,砖头就可以可靠地送达。否则砖头就会因为节拍不一致而脱手。以太网的网卡没有眼睛,无法凭借眼睛来实时调整接收网卡的节拍,与发送网卡的节拍一致。那以太网如何来实时调整节拍的呢?
机器学习
在机器学习阶段,接收网卡会尝试使用自己本地的时钟/频率,在线路上采样信号。最初的信号是Preamble码,由于Preamble码是101010交替的,也是已知的。接收方可以根据这些已知的数值,来判断1或者0这个波形是从哪里开始。如果本地晶振产生的载波比接收的波形落后,机器会认为自己的频率偏慢,于是微量增加自己的频率。如果本地晶振产生的载波比接收波形提前,机器会认为自己的频率偏快,于是微量减小自己的频率。经过多个机器学习周期的调整,接收双方的频率差(Frequency Shift)越来越小。小到不会影响高可靠性的收发数据。
在长达56 bit交替1/0机器学习之后,接收方发送8bit SFD(Start Frame Delimiter),SFD = “10101011“,接收方知道在这之后真正的Frame数据就要开始了。接收方至少做了以下两件事:
  • 硬件收发机(Transceiver)置于接收(Receiver)状态
  • 接收方的本地晶振时钟将锁定为机器学习期间最新的时钟频率,在数据接收阶段,不再学习时钟
Frame数据一个bit一个bit被快乐地搬运到接收方,但是不要忘记,随着时间的流逝,接收方与发送方的频率差又会慢慢趋于变大。当大到一定阈值时,将会产生误码。产生的误码如果无法恢复,将会被丢弃,从而造成高层的数据重传,从而影响传输效率。
为何数据传输期间,不再使用机器学习来同步收发时钟?
因为无法机器学习,因为要传输的数据是未知的,接收方我来问问你:下一个采样值,是0还是1?不知道。既然不知道,就无法机器学习。
最终Ethernet的承运字节数被限制为1500字节,在这个时间内收发双方的时钟可以保持高度一致。
有同学会问,那为何现在高端交换机最大承运字节数可以超过9200字节?这是为什么呢?
以太网芯片一直在发展,芯片的晶振时钟越来越精细,成本也在下降。使用更加精准的时钟,可以使得收发双方的时钟同步保持的更长久,传输速率已经从最初10Mbps发展到今天10Gbps,传输同样的字节数需要传输的时间大大减少了。时钟保持的时间可以高可靠性传输9200 字节的用户数据。
文章好像跑题,其实并没有,上文先回答为何要限制IP报文的尺寸。剩下的内容就很简单了。Ethernet作为承运方,简单易用,以至于连报文分片的能力也没有。顺便说句啊,无线802.11是有报文的分片/重组能力的。
Ethernet(乙方)作为数据链路层,既然没有分片的能力,自然就需要甲方有数据分片的能力,在TCP/IP的世界里,这个甲方有且只有一人,那就是IP。
IP作为TCP/IP的承运方,它对来自高层的用户数据进行分片是比较合理的。如果IP不分片,意味着IP上方N多个甲方都要有分片的能力。这里的甲方不仅仅是TCP、UDP,还有好多好多,比如GRE、ESP、AH、IP、OSPF等等。。。那样复杂度就上升了N倍。
其实TCP也是有分片能力的,只是UDP是一个懒人,它没有分片能力。有没有分片能力,只要看看协议的格式就可以看出。
当然,IP分片会造成整体的传输效率的低下,在真实的网络里,需要尽最大的可能避免IP分片。最最理想的分片,是应用层分片应用层智能化检测底层传输端到端的MTU,从而将自己委托TCP/IP承运的包裹不超出IP层的MTU。
如果应用层偷懒不愿意分片,那么就把这个负担扔给TCP,TCP分片的效率也是很高的,但是千万别让IP分片,这是网络工程师需要坚守的底线。
(0)

相关推荐