菜单

tcp_tw_recycle检查tcp_timestamps的根本代码

2019年6月12日 - www6165com

小心:本文档中的基业代码的版本:linux-四.0.5
/*************************************************
* Author : Samson
* Date : 07/14/2015
* Test platform:
* gcc (Ubuntu
4.8.2-19ubuntu1) 4.8.2
* GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu)
* Nginx version:
* Nginx 1.6.2
* Nginx 1.8.0
*
***********************************************/

两岸的关系
net.ipv4.tcp_tw_recycle是与net.ipv4.tcp_timestamps是密切相关的,而net.ipv4.tcp_timestamps暗中同意是开启的,当tcp_tw_recycle和tcp_timestamps同不经常间展开时会激活TCP的一种隐藏属性:缓存连接的光阴戳。60秒内,同1源IP的持续请求的光阴戳小于缓存中的时间戳,内核就可以扬弃该请求。

那么在基本中对应的代码是怎么管理的吧?
在基本代码中net/ipv4/tcp_input.c中的tcp_conn_request函数的代码:

if (tcp_death_row.sysctl_tw_recycle) {
            bool strict;

            dst = af_ops->route_req(sk, &fl, req, &strict);

            if (dst && strict &&
                !tcp_peer_is_proven(req, dst, true,
                        tmp_opt.saw_tstamp)) {
                NET_INC_STATS_BH(sock_net(sk),
LINUX_MIB_PAWSPASSIVEREJECTED);
                goto drop_and_release;
            }
        }

//tcp_peer_is_proven函数的落实

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry
*dst,
            bool paws_check, bool timestamps)

    struct tcp_metrics_block *tm;
    bool ret;     
    if (!dst)
        return false; 
    rcu_read_lock();
    tm = __tcp_get_metrics_req(req, dst);
    if (paws_check) {
        if (tm &&
            (u32)get_澳门金沙国际,seconds() – tm->tcpm_ts_stamp <
TCP_PAWS_MSL &&
            ((s32)(tm->tcpm_ts – req->ts_recent) >
TCP_PAWS_WINDOW ||
            !timestamps))
            ret = false;
        else
            ret = true;
    } else {
        if (tm && tcp_metric_get(tm, TCP_METRIC_RTT) &&
tm->tcpm_ts_stamp)
            ret = true;
        else
            ret = false;
    }
    rcu_read_unlock();

    return ret;
}

主要参数表明
tmp_opt.saw_tstamp:该socket支持tcp_timestamp,
tcp_death_row.sysctl_tw_recycle:本机系统开启tcp_tw_recycle选项
TCP_PAWS_MSL:/* Per-host timestamps are invalidated
* after this time. It should be equal
* (or greater than) TCP_TIMEWAIT_LEN
* to provide reliability equal to one
* provided by timewait state.
*/
60s,该标准决断表示该源ip的上次tcp通信爆发在60s内;

TCP_PAWS_WINDOW:/* Replay window for per-host
* timestamps. It must be less than
* minimal timewait lifetime.
*/
一,该规则判定表示该源ip的上次tcp通信的timestamp 大于此番tcp;

甩掉请求的首要性代码
(u32)get_seconds() – tm->tcpm_ts_stamp <
TCP_PAWS_MSL表示若当前呼吁的岁月戳小于60S,则赶回false,则跳转到goto
drop_and_release;实行连接请求的抛弃及财富的回收;

drop_and_release:
dst_release(dst);
drop_and_free:
reqsk_free(req);
drop:
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
return 0;

本文永远更新链接地址:http://www.linuxidc.com/Linux/2015-07/119963.htm

澳门金沙国际 1

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图