TCPsegmentationoffloadTCP\quad segmentation\quad offloadTCPsegmentationoffload功能可以将图1中处于运输层的TCPTCPTCP或UDPUDPUDP协议的一个较大的数据包划分为多个小的数据包来传送,注意这里必须是处于运输层的TCPTCPTCP或UDPUDPUDP协议(但是对于这一块,STM32H750XBH6的用户手册只是重点描述了TCPTCPTCP,UDPUDPUDP只是提了一下,具体支持与否还不知道如图2和图3所示),其它协议的数据包是不行的。该功能只能用于全双工模式。

图1.

图2.

图3.
TCPsegmentationoffloadTCP\quad segmentation\quad offloadTCPsegmentationoffload功能在寄存器中的使能位如图4所示,这个应该是主使能位,图5中的使能位是发送描述符里面的使能位。TCPsegmentationoffloadTCP\quad segmentation\quad offloadTCPsegmentationoffload功能最重要的一个参数是MaximumSegmentSizeMaximum\quad Segment\quad SizeMaximumSegmentSize,如图7和图8所示,那个后写入那个配置就生效。一个图1中处于运输层的TCPTCPTCP或UDPUDPUDP协议数据包主要结构图如图6所示,TCPsegmentationoffloadTCP\quad segmentation\quad offloadTCPsegmentationoffload功能在划分数据包的时候主要是划分payloadpayloadpayload那一部分,划分的单位就是MaximumSegmentSizeMaximum\quad Segment\quad SizeMaximumSegmentSize个字节数据,比如payloadpayloadpayload现在有113字节数据,MaximumSegmentSizeMaximum\quad Segment\quad SizeMaximumSegmentSize配置为70,在划分的时候先取前面的70字节放到一个数据包里面去发送,剩下的不足70字节就放到另一个数据包里面去发送,这里就相当于把一个payloadpayloadpayload有113字节数据的数据包分为两个数据包发送了出去,这里每个数据包的包头(也就是图6中EthernetheaderEthernet\quad headerEthernetheader,IPheaderIP\quad headerIPheader和TCP/UDPheaderTCP/UDP\quad headerTCP/UDPheader这三部分)基本一样只有部分不一样,详细可以参考这三种包头的详细介绍。详细的如图9和图10所示。

图4.

图5.

图6.

图7.

图8.

图9.

图10.
和以前普通的数据包发送不一样的是,这里图6中EthernetheaderEthernet\quad headerEthernetheader,IPheaderIP\quad headerIPheader和TCP/UDPheaderTCP/UDP\quad headerTCP/UDPheader这三部分单独放在一块BUFFER,BUFFER地址放在图11中TDES0TDES0TDES0中,字节个数写入TDES2TDES2TDES2中对应区域。payloadpayloadpayload也即是实际的数据放在另一块BUFFER。BUFFER地址放在图11中TDES1TDES1TDES1中,payloadpayloadpayload的字节个数写入TDES3TDES3TDES3中对应区域。

图11.
图12是一个有167个字节的TCPTCPTCP数据报,实际的数据有113字节,也就是payload,这里MaximumSegmentSizeMaximum\quad Segment\quad SizeMaximumSegmentSize设置为70,因此这个完整的数据包会被分成两个数据包,第一个数据包的实际数据是70字节,第2个数据包的实际数据是43字节。通过wireshark捕获的截图如图13和图14所示。

图12.

图13.

图14.