免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12912 | 回复: 3
打印 上一主题 下一主题

[网络] Linux tcp内核中tcp_retries1和tcp_orphan_retries参数的意义是什么 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-28 21:55 |只看该作者 |倒序浏览
对于Linux tcp的参数有几个没有看明白,望高手指点一下:

tcp_orphan_retries
网上解释:在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7,没看懂

tcp_retries1:
这个参数是什么含义?网上解释是放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值,﹐没看懂

tcp_retries2 :
限制普通tcp data的最大重传次数,默认值是15

tcp_syn_retries:
表示的是3次握手过程中第1个步骤syn的最大发送次数,默认值是5

tcp_synack_retries:
表示的是3次握手中第2个步骤syn-ack的最大发送次数,默认值为5

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
2 [报告]
发表于 2013-08-29 10:50 |只看该作者
回复 1# Huntsmen

tcp_write_timeout,它用来判断重传次数是否已经到了。这里主要分为两个分支,一个是状态为syn_sent或者syn_recv状态,一个是另外的状态。而这里系统设置的重传次数一共有4种。

1 sysctl_tcp_syn_retries,它表示syn分节的重传次数。

2 sysctl_tcp_retries1 它表示的是最大的重试次数,当超过了这个值,我们就需要检测路由表了。

3 sysctl_tcp_retries2 这个值也是表示重试最大次数,只不过这个值一般要比上面的值大。和上面那个不同的是,当重试次数超过这个值,我们就必须放弃重试了。

4 sysctl_tcp_orphan_retries 主要是针对孤立的socket(也就是已经从进程上下文中删除了,可是还有一些清理工作没有完成).对于这种socket,我们重试的最大的次数就是它。

下面来看代码:


Java代码
static int tcp_write_timeout(struct sock *sk)   
{   
    struct inet_connection_sock *icsk = inet_csk(sk);   
///retry_untry表示我们需要重传的最大次数。   
    int retry_until;   
  
///判断socket状态。   
    if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {   
        if (icsk->icsk_retransmits)   
            dst_negative_advice(&sk->sk_dst_cache);   
///设置重传最大值   
        retry_until = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries;   
    } else {   
///是否需要检测路由表。   
        if (icsk->icsk_retransmits >= sysctl_tcp_retries1) {   
            /* Black hole detection */  
            tcp_mtu_probing(icsk, sk);   
  
            dst_negative_advice(&sk->sk_dst_cache);   
        }   
///设置重传最大次数为sysctl_tcp_retries2   
        retry_until = sysctl_tcp_retries2;   
        if (sock_flag(sk, SOCK_DEAD)) {   
///表示是一个孤立的socket。   
            const int alive = (icsk->icsk_rto < TCP_RTO_MAX);   
  
///从tcp_orphan_retries(这个函数中会通过sysctl_tcp_orphan_retries来进行计算)中取得重传最大次数。   
            retry_until = tcp_orphan_retries(sk, alive);   
  
            if (tcp_out_of_resources(sk, alive || icsk->icsk_retransmits < retry_until))   
                return 1;   
        }   
    }   
  
///最终进行判断,如果重传次数已到则返回1,否则为0.   
    if (icsk->icsk_retransmits >= retry_until) {   
        /* Has it gone just too far? */  
        tcp_write_err(sk);   
        return 1;   
    }   
    return 0;   
}

static int tcp_write_timeout(struct sock *sk)
{
struct inet_connection_sock *icsk = inet_csk(sk);
///retry_untry表示我们需要重传的最大次数。
int retry_until;

///判断socket状态。
if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
  if (icsk->icsk_retransmits)
   dst_negative_advice(&sk->sk_dst_cache);
///设置重传最大值
  retry_until = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries;
} else {
///是否需要检测路由表。
  if (icsk->icsk_retransmits >= sysctl_tcp_retries1) {
   /* Black hole detection */
   tcp_mtu_probing(icsk, sk);

   dst_negative_advice(&sk->sk_dst_cache);
  }
///设置重传最大次数为sysctl_tcp_retries2
  retry_until = sysctl_tcp_retries2;
  if (sock_flag(sk, SOCK_DEAD)) {
///表示是一个孤立的socket。
   const int alive = (icsk->icsk_rto < TCP_RTO_MAX);

///从tcp_orphan_retries(这个函数中会通过sysctl_tcp_orphan_retries来进行计算)中取得重传最大次数。
   retry_until = tcp_orphan_retries(sk, alive);

   if (tcp_out_of_resources(sk, alive || icsk->icsk_retransmits < retry_until))
    return 1;
  }
}

///最终进行判断,如果重传次数已到则返回1,否则为0.
if (icsk->icsk_retransmits >= retry_until) {
  /* Has it gone just too far? */
  tcp_write_err(sk);
  return 1;
}
return 0;
}


请参考:
http://blog.csdn.net/onelight1997/article/details/7334455
http://blog.csdn.net/zhangskd/article/details/7196707
http://blog.csdn.net/admyww/article/details/5596775

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
3 [报告]
发表于 2013-08-30 14:50 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2013-11-08 23:23 |只看该作者
有个疑问:既然是孤立的socket,那它还要发送哪些段/重试哪些段,是最后的一个ACK段吗?
--sysctl_tcp_orphan_retries 主要是针对孤立的socket(也就是已经从进程上下文中删除了,可是还有一些清理工作没有完成).对于这种socket,我们重试的最大的次数就是它。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP