生活本系列分为上中下三层,分别是:
(上):操作基础与IP、端口、MAC初步介绍
(中):udp,IP、MAC帧结构(本篇)
(下):UDP工程分析
一、传输层(UDP数据段)
16位源、目的端口号:
主机 :32768 (16’h8000)
Board:32768 (16’h8000)
16位UDP长度 :
长度为16bit。
表明UDP头部和数据的总长度字节。
UDP的长度是指包括包头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。理论上,包含报头在内的数据报的最大长度为65535字节,实际上,UDP的MTU一般为1500,这与CDMA/CS机制有关系,即使巨型包也不会超过65535,在基于USO和UFO层次时,可对UDP进行拆包处理。(这部分暂未研究,以后有机会一定要好好学习一哈)
16位UDP校验和:
占16bit,用来对UDP头部和UDP数据进行校验。
UDP的校验和需要计算UDP首部+数据荷载部分,但也需要加上UDP伪首部,这个伪首部指的是:源地址、目的地址、type/length、IP数据字段 + UDP首部 + 数据一起运算。
数据:
用户数据是打包在UDP协议中,UDP协议是基于IP协议之上的,IP协议又是走MAC层发送的,即从包含关系来说:MAC帧中的数据段为IP数据报,IP报文中的数据段为UDP报文,UDP报文中的数据段为用户希望传输的数据内容,如下图所示:
二、网络层(IP数据包)
前20字节为IP数据报的首部,IP数据报的首部是固定的,首部的每一行是一个32位字的单位,最高位在左边,为0bit,最低位在右边,为31bit。
4字节的32bit数据传输次序为:首先0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit,这种传输次序为big endian(大端对齐)。TCP/IP所有二进制整数在网络中传输时都要求采用这种次序,因此这种传输次序又称为网络字节序。
版本+首部长度:
长度为1字节。
版本[0:3]就是IPv4或者IPv6,一般选择IPv4,即版本值为4。
首部长度[4:7]是指首部有多少个32位数,因为4位的最大值为15,因此首部最长为60字节,5表示固定最小值为20字节。选项部分(可选字段)的最大值为40字节,不够4的倍数要用0填充,使数据部分的起始地址为4的倍数。
服务类型 :
长度为8比特,置0 is ok~,对此研究不深。
【以下摘抄自网络】ip数据包包头内部有一个16位的标识来区分每一个ip数据包,同时3位的标志位中有一位来来表示“更多分片”,也就是说这一位置位的时候表示自该ip包被分片了并且当前这一片还不是最后一片,如果是最后一片的话就是置0的。还有一个13位的偏移字段表示当前ip包(如果是分片)在原包中所处的2113偏移位置。对了,分片的每个ip包的长度字段表示的是当前分片的长度。因此有了上面这些信息就可以在最后一片到达目的主机的时候能够将所有的分片进行重组。ip分片的时候是与上层协议(5261TCP)不相关的。流程如下:ip包在途经MTU比较小的路线的时候会将ip包进行分片,理论上除了最后一片4102外前面的所有分片都是将送往的链路的MTU大小,然后每一个分片的ip标识以及源目的ip等都相同,但除了最后一个分片外标志位中的“更多分片”字段位被置为1,并且偏移字段和长度字段也被填写1653为适当的值。当分片到达目的主机后再根据上面的这些信息进行重组。
总长度 :
长度为2Byte。总长度是指整个IP数据报的长度,(报头+数据),16bit,最长为65535字节,如果超过1500-20=1480还需要进行分包处理。
分段标识:
长度为2Byte。是否属于同一数据段,IP报文的分段ID。
//分段标识
mema[1][31:16]<=mema[1][31:16]+1;
分段标识用来区分每一个IP数据包,本次中短数据直接置0、1或者随意置数也可:
mema[1][31:16]<=16'd1;
段标识和段偏移:
长度为2B。置0即可。
生成周期(TTL):
长度为1Byte。
表示这可经过的最大路由数,生存时间字段设了数据包可以经过的最大路由数,表示数据包在网络上生存多久。TTL的初始值由源主机设置(通常为32或64),一旦经过一个路由器(网络层),他的值就减去1,当该字段的值为0时,数据报就被丢弃,并发送ICMP消息通知源主机,这样当封包在传递过程中由于某些原因未能抵达目的地的时候就可以避免其一直充斥在网路。
上层协议(上层为传输层):
1Byte。指示该封包所使用的网络协议类型,如ICMP、DNS等,常用的协议号:
16’d00:IP
16’d01:ICMP
16’d06:TCP
16’d17:UDP
报头校验和:
2Byte。
IP报头的校验和,不对首部后面的的和数据进行计算,在发送数据时,为了计算IP数据报的校验和,步骤为:
(1)、将校验和字段置0,然后将IP包头按照16bit分成更多单元,如包头长度不是16bit整数倍,则用0bit填充到16bit的倍数。
(2)、对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢弃溢出高位),将得到的和的反码填入校验和字段。
源IP地址:
4byte。
发送端的IP地址,192.168.0.3
目的IP地址 :
4Byte。
接收端的IP地址。
可选字段:
可选,没有时候可以为0,最大为40字节,必须为4的倍数,不到的话用0填充。
三、数据链路层(MAC帧)
MAC帧是数据帧的一种,所谓数据帧,就是数据链路层的协议数据单元,包括三部分:帧头、数据部分、帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传输下来的数据,比如IP数据包。
前导码和帧起始符不算MAC帧组成,所以MAC帧的固定长度为6+6+2+4=18。
MAC帧的帧头包括三个字段,前两个字段分别为6字节长的目的地址字段和源地址字段,第三个字段为2字节的类型/长度字段。
MAC帧尾可以没有,所以fifo读取没有出错,MAC层是在所有数据都发送完成之后才发送CRC校验值。
在网络通信中,“标准”和“协议”两个词通常可以混用。
一般的,关注于逻辑数据关系的协议通常称为上层协议,而关注于物理数据流的协议通常称为底层协议。
前导码(Preamble):
不算在MAC帧成分,前导码的作用是使主机接收器时钟和源主机发送器时钟同步,紧接着是帧开始分界符字节0x55或者0xAA,用于指示帧的开始,前导码是为了隔离每个以太网帧的,也是定位符。因为以太网是变长的,所以每个帧之间需要前导码来确认。字段长度为:7个字节。
帧开始符(SFD)
不算MAC帧成分,8’hd5:表明下一字段为为目的MAC字段。
目的MAC地址:
长度为:6个字节,指明帧的接受者。(board:00_0a_35_10_fe_c0)
源MAC地址:
长度为6个字节,指明帧的发送者。(pc:f0_76_1c_82_4e_d8)
长度/类型(type/length):
帧的数据字段长度,为2个字节,里面包含的信息用来标志航一层使用的什么协议,一边接收端把接收到的MAC帧的数据备份山交给上一层的这个协议,例如,当类型字段的数值为0x0800时,就表示上层使用的是IP数据报,若类型字段的值为0x8137,则表示该帧是由Novell IPX发过来的。
当该字段值大于1500时,表示“类型”;当这个字段值小于1500时,才表示“长度”。所以!UDP在该形式下不能拆包!这与CDMA/CS机制有关系,即使巨型包也不会超过65535,在基于USO和UFO层次时,可对UDP进行拆包处理。(这部分暂未研究,以后有机会一定要好好学习一哈)
数据和填充(数据部分)
Data and Pad,长度为46~1500,包含的是高层(网络层)的数据,通常是3层协议单元,对于TCP/IP是IP数据包。
(46B如何得出?)
最小帧长64B – MAC帧18B的首部地址和尾部就得出数据字段的最小长度。如果一个帧的数据部分少于46B,则MAC子层就会在就会在数据字段的后面加入一个整数字节的填充字段Pad,以保证以太网的MAC地址不低于64B。
MAC帧中数据和填充部分的长度必须在46~1500字节之间,这是由以太网的物理特性决定的,这个1500字节被称为链路层的MTU(最大传输单元,Max Transmit Unit),但是这并不是指链路层的长度被限制在1500字节,MTU指的是链路层的数据区,并不包括链路层的首部和尾部的18字节。
因为IP数据报的首部长度为20字节,所以IP数据报的数据区长度为1480字节,而这个1480字节就是用来存放TCP传来的TCP报文段或者UDP传来的UDP数据报的,又因为UDP数据报的首部为8字节,所以UDP数据报的数据区最大长度为1472字节。(这1472即为可使用的字节数)
所以在普通局域网环境下,将UDP的数据控制在1472字节下最好。在intel上标准MTU的值为576字节,一般就是512字节一个包,大数据使用分包—封包处理。
帧校验序列(FCS)
在NetAssist中可选是否发送帧校验序列,对接受网卡判断是否传输错误的一种方法,如果发现错误,丢弃此帧(使用CRC循环冗余校验码校验)。这个字段只是提供检错功能,并不提供纠错功能,该校验范围为:目的地址+源地址+类型/长度+数据字段。
帧长度最小为64字节(数据链路层)?
最小数据帧的设计原因和以太网电缆程度有关,为的是让两个相距最远的站点能够感知到感知到双方的数据发生了碰撞,最远两端数据的往返时间就是争用期,以太网的争用期是51.2us,正好发送64byte数据。以太网的数据帧(数据链路层)的传输包长的要求,一般在46~1500字节(是数据帧)。所以在发送以太网数据包的时候,数据帧的长度不能太短,不然会导致PC数据包发送而FPGA接收不到数据包的情况。
如有错误,欢迎诸位后台批评指正,谢谢!
下一篇预告:《UDP工程分析》
感谢阅读~~儿童节快乐!