- 论坛徽章:
- 0
|
我最近在看tcp的发送流程,对于tcp_sendmsg处tso特性的实现有一点疑问.理论上讲,如果网络设备支持tso特性,那么经过tcp协议栈发送到网卡的最大数据包应该是64kB(我认为这是因为skb最大支持64KB page的原故).在tcp_sendmsg中,最终会调用tcp_push,tcp_push_one或者__tcp_push_pending_frames来完成发送.在tcp_sendmsg的结尾处就是发送函数:
if ((seglen -= copy) == 0 && iovlen == 0)
goto out;
if (skb->len < mss_now || (flags & MSG_OOB))
continue;
if (forced_push(tp)) {
tcp_mark_push(tp, skb);
__tcp_push_pending_frames(sk, tp, mss_now, TCP_NAGLE_PUSH);
}
else if (skb == sk->sk_send_head)
tcp_push_one(sk, mss_now);
continue;
如果不考虑nagle以及发送窗,拥塞窗口问题.我觉得skb不可能在此处能够填充满64kB的数据.因为只要skb->len < mss_now,就会要尝试发送此skb至网络层.我对这点比较疑惑,不知道在甚么情况下,在使能tso的前提下,能够发送一个full size(64KB)的skb到网络层.希望各位大牛指教,谢谢 |
|