linux内核中的TCP重传定时器

linux内核中的TCP重传定时器,linux,tcp,timer,Linux,Tcp,Timer,如何在linux tcp内核中检查重传计时器是否正在运行?您可以设置两个主机:发送方和接收方。在两者之间建立一个连接并发送一些流量,比如传输一个大文件。嗅探两边的交通 在发送流量时,设置防火墙规则以丢弃某些数据包,例如随机丢弃x%: # for randomly dropping 10% of incoming packets: iptables -A INPUT -m statistic --mode random \ --probability 0.1 -j DROP

如何在linux tcp内核中检查重传计时器是否正在运行?

您可以设置两个主机:发送方和接收方。在两者之间建立一个连接并发送一些流量,比如传输一个大文件。嗅探两边的交通

在发送流量时,设置防火墙规则以丢弃某些数据包,例如随机丢弃x%:

# for randomly dropping 10% of incoming packets:
iptables -A INPUT -m statistic --mode random \ 
         --probability  0.1 -j DROP
清理:

# for the incoming packets:
iptables -D INPUT -m statistic --mode random \
         --probability 0.1 -j DROP
如果您查看您的捕获,您应该会看到发送方多次发送数据包以克服丢弃的数据包。这表明重新传输正在工作


如果将下降幅度提高到100%,您将看到仅由于超时而导致的重新传输。

您可以设置两个主机:发送方和接收方。在两者之间建立一个连接并发送一些流量,比如传输一个大文件。嗅探两边的交通

在发送流量时,设置防火墙规则以丢弃某些数据包,例如随机丢弃x%:

# for randomly dropping 10% of incoming packets:
iptables -A INPUT -m statistic --mode random \ 
         --probability  0.1 -j DROP
清理:

# for the incoming packets:
iptables -D INPUT -m statistic --mode random \
         --probability 0.1 -j DROP
如果您查看您的捕获,您应该会看到发送方多次发送数据包以克服丢弃的数据包。这表明重新传输正在工作


如果将下降幅度提高到100%,您将看到仅由于超时而导致的重新传输。

它一定会运行,否则它不是TCP的实现。参见RFC

人们可以想象,到现在为止,有人已经注意到系统的一部分不工作了


至于调整它-请参阅
/proc/sys/net/ipv4

下的配置参数,它一定会运行,否则它不是TCP的实现。参见RFC

人们可以想象,到现在为止,有人已经注意到系统的一部分不工作了


至于调优,请参见
/proc/sys/net/ipv4

下的配置参数。我解决了这个问题,我想我应该分享解决方案。简而言之,当接收到ACK时,通过调用inet_csk_clear_xmit_timer关闭重传计时器。icsk_pending是inet_connection_sock结构中的一个标志。当接收到最早未完成数据的ACK时,此标志未设置,因此重传计时器关闭。从Linux3.7内核

static inline void inet_csk_clear_xmit_timer(struct sock *sk, const int what)
 {
         struct inet_connection_sock *icsk = inet_csk(sk);

         **if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0) {
                 icsk->icsk_pending = 0;**
 #ifdef INET_CSK_CLEAR_TIMERS
                 sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
 #endif
         } else if (what == ICSK_TIME_DACK) {
                 icsk->icsk_ack.blocked = icsk->icsk_ack.pending = 0;
 #ifdef INET_CSK_CLEAR_TIMERS
                 sk_stop_timer(sk, &icsk->icsk_delack_timer);
 #endif
         }
 #ifdef INET_CSK_DEBUG
         else {
                 pr_debug("%s", inet_csk_timer_bug_msg);
         }
 #endif
 }

我解决了这个问题,我想我应该分享解决方案。简而言之,当接收到ACK时,通过调用inet_csk_clear_xmit_timer关闭重传计时器。icsk_pending是inet_connection_sock结构中的一个标志。当接收到最早未完成数据的ACK时,此标志未设置,因此重传计时器关闭。从Linux3.7内核

static inline void inet_csk_clear_xmit_timer(struct sock *sk, const int what)
 {
         struct inet_connection_sock *icsk = inet_csk(sk);

         **if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0) {
                 icsk->icsk_pending = 0;**
 #ifdef INET_CSK_CLEAR_TIMERS
                 sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
 #endif
         } else if (what == ICSK_TIME_DACK) {
                 icsk->icsk_ack.blocked = icsk->icsk_ack.pending = 0;
 #ifdef INET_CSK_CLEAR_TIMERS
                 sk_stop_timer(sk, &icsk->icsk_delack_timer);
 #endif
         }
 #ifdef INET_CSK_DEBUG
         else {
                 pr_debug("%s", inet_csk_timer_bug_msg);
         }
 #endif
 }

你是说计时器不能运行吗?我不知道不,我不是那个意思。TCP中有几个计时器。重传计时器是其中之一,可能是最常用的计时器,它应该在有未完成的数据包时运行。但是,如果正在发送突发的第一个数据包,并且没有未完成的数据包,则此计时器未运行,它将在数据包发送后立即设置。我想知道内核中显示计时器是否正在运行的任何特定标志。谢谢。你是说计时器不能运行吗?我不知道不,我不是那个意思。TCP中有几个计时器。重传计时器是其中之一,可能是最常用的计时器,它应该在有未完成的数据包时运行。但是,如果正在发送突发的第一个数据包,并且没有未完成的数据包,则此计时器未运行,它将在数据包发送后立即设置。我想知道内核中显示计时器是否正在运行的任何特定标志。谢谢,谢谢。我有兴趣检查重传计时器是否在内核级别运行,是否有任何特定标志(例如,在interconnect_sock结构中)。我喜欢这个统计模块。我有兴趣检查重传计时器是否在内核级别运行,是否有任何特定的标志(例如,在interconnect_sock结构中)。我喜欢统计模块在TCP中有几个计时器。重传计时器是其中之一,可能是最常用的计时器,它应该在有未完成的数据包时运行。但是,如果正在发送突发的第一个数据包,并且没有未完成的数据包,则此计时器未运行,它将在数据包发送后立即设置。我想知道内核中显示计时器是否正在运行的任何特定标志。计时器一定会运行-它是TCP协议的一部分。当然,如果没有未完成的数据包,则重传计时器不会运行。TCP中有几个计时器。重传计时器是其中之一,可能是最常用的计时器,它应该在有未完成的数据包时运行。但是,如果正在发送突发的第一个数据包,并且没有未完成的数据包,则此计时器未运行,它将在数据包发送后立即设置。我想知道内核中显示计时器是否正在运行的任何特定标志。计时器一定会运行-它是TCP协议的一部分。当然,如果没有未完成的数据包,则重传计时器不会运行。