动态更改套接字选项

Changing socket options dynamically

我希望我可以在单个套接字的生命周期内来回快速多次地更改 setsockopt 的 optvals。

具体来说,我需要根据某些业务逻辑启用和禁用 TCP_NODELAY。有些数据包需要带 TCP_NODELAY 出去,有些数据包是散装的,没有它就应该出去。我们事先知道,所以我想设置适当的选项。说来话长 -- 这个问题不是关于启用或禁用 Nagle 的优点或缺点!

setsockopt调用生效之前是否有延迟?

引用源,它应该可以立即工作,立即在 tcp_sk 上设置选项:

do_tcp_setsockopt

...
case TCP_NODELAY:
    if (val) {
        /* TCP_NODELAY is weaker than TCP_CORK, so that
         * this option on corked socket is remembered, but
         * it is not activated until cork is cleared.
         *
         * However, when TCP_NODELAY is set we make
         * an explicit push, which overrides even TCP_CORK
         * for currently queued segments.
         */
        tp->nonagle |= TCP_NAGLE_OFF|TCP_NAGLE_PUSH;
        tcp_push_pending_frames(sk);
    } else {
        tp->nonagle &= ~TCP_NAGLE_OFF;
    }
    break;

__tcp_push_pending_frames

tcp_write_xmit