zoukankan      html  css  js  c++  java
  • 转:TCP/IP协议选项——TCP_KEEPALIVE .

    [+]

    1. KEEPALIVE作用
    2. KEEPALIVE代码示例
    3. KEEPALIVE脚本设置
     

    1、KEEPALIVE作用

    KEEPALIVE机制,是TCP协议规定的TCP层(非应用层业务代码实现的)检测TCP本端到对方主机的TCP连接的连通性的行为。避免服务器在客户端出现各种不良状况时无法感知,而永远等在这条TCP连接上。

    2、KEEPALIVE代码示例

    该选项可以设置这个检测行为的细节,如下代码所示:

    1. int keepAlive = 1;    // 非0值,开启keepalive属性   
    2. int keepIdle = 60;    // 如该连接在60秒内没有任何数据往来,则进行此TCP层的探测   
    3. int keepInterval = 5; // 探测发包间隔为5秒   
    4. int keepCount = 3;        // 尝试探测的次数.如果第1次探测包就收到响应了,则后2次的不再发   
    5. setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));  
    6. setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));  
    7. setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));  
    8. setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));  
    int keepAlive = 1;    // 非0值,开启keepalive属性
    int keepIdle = 60;    // 如该连接在60秒内没有任何数据往来,则进行此TCP层的探测
    int keepInterval = 5; // 探测发包间隔为5秒
    int keepCount = 3;        // 尝试探测的次数.如果第1次探测包就收到响应了,则后2次的不再发
    setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
    setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
    setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
    setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

    设置该选项后,如果60秒内在此套接口所对应连接的任一方向都没有数据交换,TCP层就自动给对方发一个保活探测分节(keepalive probe)。这是一个对方必须响应的TCP分节。它会导致以下三种情况:
        对方接收一切正常:以期望的ACK响应。60秒后,TCP将重新开始下一轮探测。
        对方已崩溃且已重新启动:以RST响应。套接口的待处理错误被置为ECONNRESET。
        对方无任何响应:比如客户端那边已经断网,或者客户端直接死机。以设定的时间间隔尝试3次,无响应就放弃。套接口的待处理错误被置为ETIMEOUT。

    3、KEEPALIVE脚本设置

    全局设置可更改/etc/sysctl.conf,加上:
    net.ipv4.tcp_keepalive_intvl = 5
    net.ipv4.tcp_keepalive_probes = 3
    net.ipv4.tcp_keepalive_time = 60
    在程序中表现为:
    阻塞模型下,当TCP层检测到对端socket不再可用时,内核无法主动通知应用层出错,只有应用层主动调用read()或者write()这样的IO系统调用时,内核才会利用出错来通知应用层。
    非阻塞模型下,select或者epoll会返回sockfd可读,应用层对其进行读取时,read()会报错。


    一点经验:
    实际上我们在做服务器程序的时候,对客户端的保活探测基本上不依赖于这个TCP层的keepalive探测机制。
    而是我们自己做一套应用层的请求应答消息,在应用层实现这样一个功能。

    转载自:http://blog.chinaunix.net/uid-29075379-id-3898606.html

  • 相关阅读:
    55种网页常用小技巧(javascript) (转)
    如何利用RadioButtonList实现datagrid列的单选 (转)
    实现数据分类汇总的SQL语句 (转)
    在ASP.Net中两种利用CSS实现多界面的方法. (转)
    ASP.NET 中 Session 实现原理浅析 [1] 会话的建立流程
    用户控件中使用客户端脚本的控件名称问题 (转)
    快速理解.NET Framework[翻译] (转)挺不错的翻译
    table的宽度,单元格内换行问题 (转)
    实现类似Windows资源管理器的DataGrid(转)
    vs.net web项目使用visual source safe进行源代码管理(转)
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/3673510.html
Copyright © 2011-2022 走看看