linux内核中的TCP / IP堆栈

时间:2012-01-13 16:24:24

标签: networking tcp linux-kernel

我正在实现自定义TCP协议作为LKM。除了正常的数据包之外,我需要每个RTT发送一个自定义数据包,以便向接收器传送一些信息。但我无法理解如何确定每个RTT或传输轮的开始/结束。

任何有用的指针或建议?

1 个答案:

答案 0 :(得分:0)

检查出来:

http://www.spinics.net/lists/newbies/msg47478.html

在内核源代码(尤其是net / ipv4 / branch)中搜索" srtt"签名:

净/的IPv4 / tcp_input.c:

/* Called to compute a smoothed rtt estimate. The data fed to this
 * routine either comes from timestamps, or from segments that were
 * known _not_ to have been retransmitted [see Karn/Partridge
 * Proceedings SIGCOMM 87]. The algorithm is from the SIGCOMM 88
 * piece by Van Jacobson.
 * NOTE: the next three routines used to be one big routine.
 * To save cycles in the RFC 1323 implementation it was better to break
 * it up into three procedures. -- erics
 */
static void tcp_rtt_estimator(struct sock *sk, long mrtt_us)
{
        struct tcp_sock *tp = tcp_sk(sk);
        long m = mrtt_us; /* RTT */
        u32 srtt = tp->srtt_us;

这是另一个使用jiffies()函数设置/重置srtt字段的示例:

if (crtt > tp->srtt_us) {
            /* Set RTO like tcp_rtt_estimator(), but from cached RTT. */
            crtt /= 8 * USEC_PER_MSEC;
            inet_csk(sk)->icsk_rto = crtt + max(2 * crtt, tcp_rto_min(sk));
    } else if (tp->srtt_us == 0) {
            /* RFC6298: 5.7 We've failed to get a valid RTT sample from
             * 3WHS. This is most likely due to retransmission,
             * including spurious one. Reset the RTO back to 3secs
             * from the more aggressive 1sec to avoid more spurious
             * retransmission.
             */
            tp->rttvar_us = jiffies_to_usecs(TCP_TIMEOUT_FALLBACK);
            tp->mdev_us = tp->mdev_max_us = tp->rttvar_us;

            inet_csk(sk)->icsk_rto = TCP_TIMEOUT_FALLBACK;
    }