zoukankan      html  css  js  c++  java
  • tso

    tso(TCP Segment Offload)是一种利用网卡的少量处理能力,降低CPU发送数据包负载的技术,需要网卡硬件及驱动的支持。

    TSO:Technical Standards Orders

    技术标准说明,航空产品要取得适航认证就必须由美国联邦航空局FAA进行审查,FAA对产品的公司进行质量保证体系的全面符合性审查,提出建设性的建议和意见,如果FAA对审查情况比较满意,将会颁发TSO认证证书。这对航空产品走向国际市场的必须门槛。
    A Technical Standard Order (TSO)is a minimum performance standard issued by the Administrator for specified materials, parts, processes, and appliances used on civil aircraft. TSOs can be viewed by Current, Active Historical, or Canceled. Current TSOs are the approved FAA performance standard that the applicant must use to receive a TSO authorization. Active Historical TSOs are for previously approved TSO authorizations. Canceled TSOs are for reference only.[1]

    1TSO(TCP Segment Offload)

    在 不支持TSO的网卡上,TCP层向IP层发送数据会考虑mss,使得TCP向下发送的数据可以包含在一个IP分组中而不会造成分片, mss是在TCP初始建立连接时由网卡MTU确定并和对端协商的,所以在一个MTU=1500的网卡上,TCP向下发送的数据不会大于 min(mss_local, mss_remote)-ip头-tcp头。
    而当网卡支 持TSO时,TCP层会逐渐增大mss(总是整数倍数增加),当TCP层向下发送大块数据时,仅仅计算TCP头,网卡接到到了IP层传下的大数 据包后自己重新分成若干个IP数据包,添加IP头,复制TCP头并且重新计算校验和等相关数据,这样就把一部分CPU相关的处理工作转移到由网卡来处理。 内核TCP/IP协议栈也必须考虑下发包数和实际包数不一致的情况,例如处理拥塞控制算法时必须做一些特殊的处理等等。
    注:参考内核版本为2.6.9;
    1 TCP/IP协议栈对TSO的支持
    1.1 逐渐增大mss(offload)
    在不支持TSO的网卡 上,TCP层向IP层发送数据会考虑mss,使得TCP向下发送的数据可以包含在一个IP分组中而不会造成分片, mss是在TCP初始建立连接时根据网卡MTU确定并和对端协商的,所以在一个MTU=1500的网卡上,TCP向下发送的数据不会大于min (mss_local, mss_remote)-ip头-tcp头。
    应用层传输层传输数据时,对于TCP协议,最终会调用如下函数:
    文件 net/ipv4/tcp.c
    int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t size)
    该函数会调用如下函数
    文件 net/ipv4/tcp.c
    unsigned int tcp_current_mss(struct sock *sk, int large)
    获得当前的mss值,如果网卡不支持TSO,则该函数返回的mss值将和原来相同,否则如果当前不是一个MSG_OOB类型的消息,内核将尝试增大 mss值,注意: 最大的mss值不会大于65535-ip头-tcp。 内核根据/proc变量tcp_tso_win_divisor决定增大后的mss占当前拥塞控制窗口的比率(snd_cwnd)。最终的效果是:增大的mss总是原有mss值的整数倍,但是不会超过snd_cwnd/tcp_tso_win_divisor。
    1.2 对skb计数的修正
    在启用TSO时,由于TCP层向下发送一个skb, 有可能最终会发出n个IP数据包,即一个skb和一个IP packet可能不是一一对应的关系,而我们都知道,TCP拥塞控制算 法需要精确跟踪当前发送、接收以及拥塞控制窗口来决定最终发送多少数据包,TSO的 存在给计算带来了一定的复杂性,所以内核在每一个skb的末尾维护了额外的数据(struct skb_shared_info,通过skb_shinfo取出),表示该skb包含多少个packet。内核提供下列函数操作这块数据: tcp_skb_pcount
    tcp_skb_mss
    tcp_inc_pcount
    tcp_inc_pcount_explicit
    tcp_dec_pcount_explicit
    tcp_dec_pcount
    tcp_dec_pcount_approx
    tcp_get_pcount
    tcp_set_pcount
    tcp_packets_out_inc
    tcp_packets_out_dec
    tcp_packets_in_flight

    最终,当TCP协议栈在调用tcp_snd_test决定是否可以发送当前skb时,会调用上述函数修正计算结果

  • 相关阅读:
    Bootstrap的介绍和响应式媒体查询
    jquery内容补充
    jquery的ajax
    jquery的事件
    JQuery的筛选方法
    jquery的css
    jQuery的文档操作
    操作表单域中的value值
    jquery的属性操作
    jquery的效果
  • 原文地址:https://www.cnblogs.com/niuchunjian/p/3776966.html
Copyright © 2011-2022 走看看