TCP TSO/GSO初步探索

参考:https://blog.csdn.net/quqi99/article/details/51066800
           https://www.ibm.com/developerworks/cn/linux/l-cn-network-pt/  重点介绍和分析

TCP TSO/GSO:
1、数据payload+TCP header(20 bytes)到达IP层后,加上IP层的20字节header
2、此时协议栈在IP层会将该数据包的总大小和MTU值进行比较,大于MTU,则会进行分包,协议栈IP层的分片和组装消耗的是CPU的资源
3、如果开启了GSO/TSO属性,则协议栈在IP层不对数据包的总大小进行检查
4、TSO开启,则数据包直接透传到网卡,在网卡上根据MTU进行分片
5、TSO开启的前提下,GSO会默认开启,GSO不仅仅支持TCP,也支持UDP,TSO仅支持TCP
6、若TSO未开启,GSO开启,数据包在协议栈会推迟分包,在最后发送到网卡前才执行分段

延迟分段会减少发送路径上的数据拷贝操作,所以即使网络设备不支持TSO,只要能够延迟分段也是有收益的


参考:https://blog.csdn.net/maxlovezyy/article/details/77824679
           https://blog.csdn.net/hanpingxue/article/details/38415235
           https://blog.csdn.net/substitute_coder/article/details/53909516


一条TCP发送数据流:
1、应用层在user space打开一个fd,并将user space的buffer数据发送至内核IP协议栈
2、内核IP协议栈检测该fd有效性后,会绑定一个socket到该 fd,同时会绑定一个TCB(TCP control block)到socket,TCB包含该数据流连接需要的所有信息
3、IP协议栈内核开辟socket buffer,将user space的buffer数据拷贝到socket buffer

对于TCP,内核支持的最大接收和发送的缓冲区大小可在以下文件中查询:
[root@cfs_netstorage core]# cat /proc/sys/net/core/rmem_default
[root@cfs_netstorage core]# cat /proc/sys/net/core/wmem_default

新建socket时,socket buffer的默认值通过以下文件查询:
[root@cfs_netstorage core]# cat /proc/sys/net/ipv4/tcp_wmem 
第一个表示最小值,第二个表示默认值,第三个表示最大值。
[root@cfs_netstorage core]# cat /proc/sys/net/ipv4/tcp_rmem
用户通过套接字将user space的数据传给socket buffer时,socket buffer大小的设置以及协议栈的处理

参考:
https://www.cnblogs.com/x_wukong/p/8444557.html
https://www.cnblogs.com/x_wukong/p/4467838.html

4、socket buffer下一步经过TCP层时,根据MSS值大小,若此时数据超过MSS,在TCP层进行分片,此时该TCP报文段存在协议栈开辟的内存中

5、然后该段数据进入IP层(增加IP header),在IP层会根据MTU值决定对数据包进行分片或者不分片

6、在进过MAC层(eth header)

7、最后在驱动层会拷贝协议栈中TCP报文段到网卡,网卡进行发送

举例:
app 每隔1ms,通过fd发送10k数据到socket buffer,经过TCP层的MSS值的限制,该buffer数据会进行TCP分包,之后传递给IP层,IP层如检测出该分包大于MTU值,会在IP层继续分包

一次传递给socket buffer的数据,在TCP、IP层都进行分包,导致一次buffer的数据消耗的CPU资源会过高

根据以上分析,对于TCP/UDP,数据从主机经过TCP/IP协议栈向外发送时,如果开启了TSO/GSO,在传输层,mss的最大值不再是MTU-header,而是由gso_max_size决定
同理,在网络层,IP层不再根据MTU值将数据进行分片,若网卡支持TSO,直接交由网卡进行分片,若网卡不支持TSO,则将大包的分别交由驱动做,尽量减少数据包在TCP/IP协议栈中的处理

https://blog.csdn.net/quqi99/article/details/51066800  这篇文章分析了TSO/GSO/LRO等对virtio的影响

TSO、GSO存在的问题:对于发送较小的报文,会增大报文在缓冲区的时间,导致报文传输异常

发布了2 篇原创文章 · 获赞 0 · 访问量 253

猜你喜欢

转载自blog.csdn.net/zhuge1020032431/article/details/93190510
tcp
TSO