zoukankan      html  css  js  c++  java
  • TCP ------ keep-alive

    TCP 是面向连接的 , 在实际应用中通常都需要检测对端是否还处于连接中。如果已断开连接,主要分为以下几种情况:

    1.           连接的对端正常关闭,即使用 closesocket 关闭连接。

    2.           连接的对端非正常关闭,包括对端异常关闭,网络断开等情况。

    对于第一种情况,对端正常关闭前都会告知对方,所以很好判断是否连接着。

    对于第二组情况,比较麻烦,方法如下:

    ---------自己编写心跳包程序,简单的说也就是在自己的程序中加入一条线程,定时向对端发送数据包,查看是否有 ACK ,如果有则连接正常,没有的话则连接断开。

    ---------使用 TCP 的 keep-alive 机制,这个需要在 编程时对当前 SOCKET 进行相应设置即可,比较方便。如果客户端使用keepalive,使用read阻塞模式接收服务器的数据,当keepalive发送不成功,客户端的read会退出阻塞模式

    首先说一下 keep-alive 来判断异常断开的原理,其实 keep-alive 的原理就是 TCP 内嵌的一个心跳包。

    以服务器端为例,如果当前 server 端检测到超过一定时间(默认是 7,200,000 milliseconds ,也就是 2 个小时)没有数据传输,那么会 向client 端发送一个 keep-alive packet (该 keep-alive packet 就是 ACK 和当前 TCP 序列号减一的组合),此时 client 端应该为以下三种情况之一:

    1. client 端仍然存在,网络连接状况良好。此时 client 端会返回一个 ACK 。 server 端接收到 ACK 后重置计时器,在 2 小时后再发送探测。如果 2 小时内连接上有数据传输,那么在该时间基础上向后推延 2 个小时。

    2. 客户端异常关闭,或是网络断开。在这两种情况下, client 端都不会响应。服务器没有收到对其发出探测的响应,并且在一定时间(系统默认为 
    1000 ms )后重复发送 keep-alive packet ,并且重复发送一定次数( 2000 XP 2003 系统默认为 5 次 , Vista 后的系统默认为 10 次)。

    3. 客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位,从而引起服务器对连接的终止。

  • 相关阅读:
    dapper+linq+json+ztree构建树
    ubuntu,从一个新用户,要转到新用户的命令行操作
    OC本学习笔记Foundatio框架集
    无法Debug SQL: Unable to start T-SQL Debugging. Could not attach to SQL Server process on
    Struts2 + uploadify 多文件上传完整的例子!
    How use Instruments and display the console in Command Lines applications
    Android ActionBar详解(二):ActionBar实现Tabs标签以及下拉导航
    Android ActionBar详解(一):ActionBar概述及其创建
    Android Fragment详解(六):Fragement示例
    Android Fragment详解(五):Fragment与Activity通讯
  • 原文地址:https://www.cnblogs.com/god-of-death/p/7102151.html
Copyright © 2011-2022 走看看