精华内容
下载资源
问答
  • 在对层模进行远离截止近似, 利用耦合模理论分析了周期光纤光栅中导模与层模的耦合, 并与短周期光纤光栅进行了比较, 指出周期光纤光栅的工作特性可由它的相位匹配条件来说明。 计算结果与实验现象相符。
  • 因为博主之前也研究过WebSocket,开发了个简单的聊天室,但是这次这次应用到实际,我就在想TCP的这个连接在不发生异常的情况可以维持多久?在思考这个问题时,我就在想Http建立的TCP短连接,是什么时候断开连接...

    最近开发中遇到以下:需要客户端建立一个链接,然后服务器端持有这个链接,当有时间变换(如任务的状态改变),需要后端将事件推送给任务对应的责任人。因为博主之前也研究过WebSocket,开发了个简单的聊天室,但是这次这次应用到实际,我就在想TCP的这个长连接在不发生异常的情况下可以维持多久?在思考这个问题时,我就在想Http建立的TCP短连接,是什么时候断开连接的?基于这个问题,我就写了个简单的测试用例,通过tcpdump来抓包,对长连接和短连接进行对比分析。

    ​ 下面我们来简单的介绍下长连接和短连接的概念。

    ​ 首先是TCP,三次握手建立连接,四次挥手释放连接,示意图如下:

    TCP连接建立和释放的过程图

    ​ 短连接就如上图所示,数据传输完成后,一般由客户端发起释放连接的信号,也可以看到,短连接是进行一次请求,请求结束后断开连接,那就回到上面令博主疑惑的问题了,建立连接我们都知道,Http请求到达服务器,就会立刻建立TCP连接,那是什么时候断开的呢?是服务器return了结果后立刻结束么,还是别的情况,别急,后面我们会来给大家讲解。

    ​ 长连接,和短连接最简单最直接的区别就是,他是为了服务器和客户端间的一个频繁的交互,之前的浏览器端定时的ajax轮询会消耗大量的资源,现在已经很少有人使用了;另一个,长连接比短连接更大的一个优势就是,服务器端可以维护和客户端建立的这个TCP通信的channel,这样就可以让服务器主动的给客户端发送数据,也等同于实现了全双工通信,这个也是相比ajax轮询更大的一个优势,可以实现事件的实时通知。

    基于上面所讲的,我们来分析下长连接和短连接的优缺点:

    1. 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接;
    2. 长连接如果不主动关闭,这个连接会长久的存在,并且如果长连接滥用,或者不加任何限制,会导致连接数过多,会对服务器的产生较大的压力,因此长连接在使用时要慎用,做好评估和限制;
    3. 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

    ​ 下面,我们就开始使用tcpdump来进行抓包来分析上面让我们疑惑的两个问题,首先,我们启动服务端,长连接就是我们使用的WebSocket,短连接就是一个简单的无业务逻辑的一个接口,

    ​ 在电脑上启动tcpdump,命令如下,其中-w指定抓到的包的输入路径,如果没有-w的话,会将包输出到shell窗口:

    sudo tcpdump -i lo0 -w /tmp/tcpdump/1.pcap port 8080
    

    tcpdump命令的详解大家可以参考这篇博客:https://www.jianshu.com/p/b281964a8459

    ​ 本文为了更好的分析,将日志输出到文件,并使用wireshark软件进行分析,数据包如下:
    TCP长连接抓包分析
    ​ 从中我们可以看到,红框中的为TCP连接建立的过程,红色箭头是创建WebSocket的请求,后面我们可以看到,数据反而发送就是TCP和WebSocket协议了,后面客户端和服务端之间的数据发送就无须建立TCP连接了,这和我们预料的是一致。

    ​ 但是困扰我们的一个问题:长连接在不发生异常的情况下可以维持多久?经过博主的测试,4个小时是没有任何问题的,具体多久就没有继续测试啦。。。而且,这个连接的保持应该有客户端来进行,可以定时的检查连接的状态,如果链接断开,可以重新建立连接,这样可以保证连接的畅通,事件可以及时的有服务端推送到客户端。

    ​ 下面我们来分析短连接,大家也也在思考一下困扰我们的问题:TCP短连接是什么时候断开的?结果可能和你预期的不太一样,下面我们一起来看下:

    ​ 接口代码如下:

    @GetMapping("/create")
    public String onCreate(){
        log.info("---------1111");
        return "OK";
    }
    

    ​ 下面就是直接在浏览器上输入url,按下回车键,并请求五次,每次的时间间隔为3s左右,wireshark分析得到的数据包如下:

    HTTP请求抓包分析
    由上图我们可以看到,第一次调用接口时,创建了TCP连接,但是之后的每隔三秒的再次调用,是没有重新创建TCP连接的,而是使用了之前已经创建好的连接,最后,在经过一段时间后,TCP断开连接,因为wireshark中没有时间,我们截取原始的数据包来展示TCP断开连接的时间,
    TCP连接断开
    上图是一次Http请求的所有报文,也是一次TCP连接的建立和断开,从中我们可以看到,连接的建立和数据的发送很快就结束了,但是连接的断开时在数据发送结束差不多45s开始的,由客户端发送,ack 116,服务器端真正断开连接是在约一分钟后。

    ​ 是不是和你预料的结果不太一致呢?但是为什么会导致这个结果呢,大家看下面这张截图:
    在这里插入图片描述
    之前,在http/1.0中,一个服务器发送完http响应后,会断开TCP连接。但是这样每次请求都会重新建立和断开TCP连接,开销太大。所以虽然标准中没有设定,某些服务器对Connection:keep-alive的Header进行了支持。意思是说,完成这个HTTP请求后,不要断开HTTP请求使用的TCP连接。这样的好处是连接可以被重复使用,之后发送HTTP请求的时候就不用再重新建立TCP连接了。这也符合我们刚才截图中的结果,这样,如果我们频繁的请求,Http短连接也是可以满足需求的,可见在我们开发中,有很多问题都有人为我们考虑到了。

    ​ 我们可以做一个实验,修改请求头中的Connection,值改为close,这就需要我们在postMan中调用,结果如下图所示:
    在这里插入图片描述
    可以看到,连接的建立和断开非常的快,这也符合我们最开始的设想。

    讲到这里,大家对长连接和短连接应该都很明白了,迷惑我们的两个问题也都很清楚了,希望本文能对大家有所帮助,如果有什么疑问,欢迎评论留言交流。

    最后,原创不易,喜欢的话请点赞支持,谢谢。

    展开全文
  • 出于最近对im研究的兴趣,看到smack里有个30s发送一个空消息的线程,了解了关于心跳,keepalive的知识。 TCP的socket本身就是连接的,那么为什么还要心跳呢?搜索到的资料解释如下:一:内网机器如果不主动...

    出于最近对im研究的兴趣,看到smack里有个30s发送一个空消息的线程,了解了下关于心跳包,keepalive的知识。 TCP的socket本身就是长连接的,那么为什么还要心跳包呢?

    搜索到的资料解释如下:

    一:内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一吧,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间就会向服务器发送消息,以保证服务器可以随时找到你,这东西被称为心跳包。

    二:理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

    三:如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。为什么需要心跳连接主要是判断当前连接是否是有效的、可被使用的。在实际应用中假设一段时间没有数据传输时候理论上说应该连接是没有问题的,但是网络复杂,中途出现问题也是常见的,网线被掐断了、对方进程挂掉了、频繁丢包等,这时候TCP连接是不可使用的,但是对于应用层并不知道,如果需知道网络情况则要很复杂的超时进行了解,TCP从底层就实现了这样的功能。心跳机制是TCP在一段时间间隔后发送确定连接端是否还存在,如果存在的话就会回传一个包确定网络有效,如果心跳包有问题,则通知上层应用当前网络有问题了。
    这取决于你的server端的超时配置, 每个socket连接都是长连接,它是一个相当占用系统资源的通信管道, 如果这个长连接什么事也没干硬是要占着资源,则server端可以选择关闭这个连接,以省下资源让更多的用户连接进来。
    所以,即便客户端的是采用死循环while(true)方式连到服务端,对于特定的客户端和服务端类型来说也需要一定时间间隔的心跳(告诉服务端,我还活着,虽然我没干活也没说话,但别把我关了)。

    记得以前开发手机游戏时,索爱有一款手机有强制要求,客户端如果超过三分钟无消息发向网络服务端,则会在客户端自动地强制把socket关断。因为socket长连接相对于手机这样资源少的设备来说是宝贵的资源。 (这个强制是指客户端系统自动关的,不是我们代码close的)
    这3个原因都是挺有道理。如果你有更好的解释欢迎交流啊。改天我做个程序测试一下不发心跳包和发心跳包的连接情况。

    四:长连接与短连接

    所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。
    短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。
    比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。
    其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
    长连接与短连接的操作过程

    通常的短连接操作步骤是:
    连接→数据传输→关闭连接;

    而长连接通常就是:
    连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
    这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了
    什么时候用长连接,短连接?

    长 连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理 速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

    五:发送接收方式

    1、异步
    报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况:
    (1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收
    (2)异步单工:接收和发送是用两个不同的程序来完成。
    2、同步
    报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。

    在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

    六:单工、半双工和全双工
    根 据通信双方的分工和信号传输方向可将通信分为三种方式:单工、半双工与全双工。在计算机网络中主要采用双工方式,其中:局域网采用半双工方式,城域网和广 域网采用全双年方式。 1. 单工(Simplex)方式:通信双方设备中发送器与接收器分工明确,只能在由发送器向接收器的单一固定方向上传送数据。采用单工通信的典型发送设备如早 期计算机的读卡器,典型的接收设备如打印机。 2. 半双工(Half Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以相互传送数据,但某一时刻则只能向一个方向传送数据。例如,步话机是半双工设备, 因为在一个时刻只能有一方说话。 3. 全双工(Full Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以同时在两个方向上传送数据。例如,电话是全双工设备,因为双方可同时说话。

    而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连 接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况 下需用短连好。

    总之,长连接和短连接的选择要视情况而定。

    来源:

    1. http://blog.csdn.net/iamdesmo/article/details/7439193
    2. http://www.apkbus.com/blog-227172-54729.html
    展开全文
  • 连接和端连接 心跳机制

    千次阅读 2017-08-15 22:45:29
    一个定时器,在一定时间间隔发送一个空给客户端,然后客户端反馈一个同样的空回来,服务器如果在一定时间内收不到客户端发送过来的反馈,那就只有认定说掉线了。       其实,要判定掉线,只需要send...
    TCP连接简介
    当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,
    当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,
    连接的建立是需要三次握手的,而释放则需要4次握手,
    所以说每个连接的建立都是需要资源消耗和时间消耗的
    经典的三次握手示意图:



    经典的四次握手关闭图:
     


    一、长连接与短连接
    长连接: 指在一个TCP连接上可以连续发送多个数据包,
            在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接;
            一般需要自己做在线维持。 
    短连接: 指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接;
            一般银行都使用短连接。 
            它的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段 

    比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。 
    其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

    长连接与短连接的操作过程 
    通常的短连接操作步骤是: 
      连接→数据传输→关闭连接;

    而长连接通常就是: 
      连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接; 

    这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,
    短连接在没有数据传输时直接关闭就行了

    什么时候用长连接,短连接?
    长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。
    每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,
    所以每个操作完后都不断开,下次次处理时直接发送数据包就OK了,不用建立TCP连接。

    例如:数据库的连接用长连接, 
    如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

    二、发送接收方式
    1、异步 
    报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况: 
    (1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收 
    (2)异步单工:接收和发送是用两个不同的程序来完成。 

    2、同步 
    报文发送和接收是同步进行,既报文发送后等待接收返回报文。 
    同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,
    超过该时间发送方不再等待读返回报文,直接通知超时返回。
     
    在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。
    读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

    三. 单工、半双工和全双工
    根据通信双方的分工和信号传输方向可将通信分为三种方式:
    单工、
    半双工、
    全双工。

    在计算机网络中主要采用双工方式,其中:
    局域网采用半双工方式,
    城域网和广域网采用全双年方式。   

    1. 单工(Simplex)方式:
    通信双方设备中发送器与接收器分工明确,只能在由发送器向接收器的单一固定方向上传送数据。
    采用单工通信的典型发送设备如早期计算机的读卡器,典型的接收设备如打印机。   

    2. 半双工(Half Duplex)方式:
    通信双方设备既是发送器,也是接收器,两台设备可以相互传送数据,但某一时刻则只能向一个方向传送数据。
    例如,步话机是半双工设备,因为在一个时刻只能有一方说话。   

    3. 全双工(Full Duplex)方式:
    通信双方设备既是发送器,也是接收器,两台设备可以同时在两个方向上传送数据。
    例如,电话是全双工设备,因为双方可同时说话。

    而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,
    而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,
    如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。
    所以并发量大,但每个用户无需频繁操作情况下需用短连好。

    总之,长连接和短连接的选择要视情况而定。
    心跳包机制
       跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
        在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
        心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
        其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。
        在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。
        总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

    心跳检测步骤
    1 客户端每隔一个时间间隔发生一个探测包给服务器
    2 客户端发包时启动一个超时定时器
    3 服务器端接收到检测包,应该回应一个包
    4 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
    5 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

    展开全文
  • 主要介绍了Java编程实现获取mp3时及播放mp3文件的方法,涉及java基于jaudiotagger与jl对MP3音频文件属性操作及音频播放相关操作技巧,并提供了相关jar的本站下载,需要的朋友可以参考
  • 连接和心跳

    千次阅读 2015-12-16 09:25:19
    摘自:... 第一种设置:通过设置socket的keepalive属性 #include "/usr/include/linux/tcp.h" #include "/usr/include/linux/socket.h" ////KeepAlive实现,单位秒 ...//下面代码要求有

    摘自:http://blog.csdn.net/sctq8888/article/details/7426031

    第一种设置:通过设置socket的keepalive属性
    #include    "/usr/include/linux/tcp.h"
    #include "/usr/include/linux/socket.h"
    KeepAlive实现,单位秒
    //下面代码要求有ACE,如果没有包含ACE,则请把用到的ACE函数改成linux相应的接口
    int keepAlive = 1;//设定KeepAlive
    int keepIdle = 5;//开始首次KeepAlive探测前的TCP空闭时间
    int keepInterval = 5;//两次KeepAlive探测间的时间间隔
    int keepCount = 3;//判定断开前的KeepAlive探测次数
    if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
    {
        ACE_DEBUG ((LM_INFO,
        ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!/n")));
    }

    if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)
    {
        ACE_DEBUG ((LM_INFO,
        ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!/n")));
    }

    if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)
    {
        ACE_DEBUG ((LM_INFO,
        ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!/n")));
    }

    if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)
    {
        ACE_DEBUG ((LM_INFO,
        ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!/n")));
    }

    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7

    TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能。
    默认的Keepalive超时需要7,200,000 milliseconds,即2小时,探测次数为5次。它的功效和用户自己实现的心跳机制是一样的。开启Keepalive功能需要消耗额外的宽带和流量,尽管这微不足道,但在按流量计费的环境下增加了费用,另一方面,Keepalive设置不合理时可能会因为短暂的网络波动而断开健康的TCP连接。

    keepalive并不是TCP规范的一部分。在Host Requirements RFC罗列有不使用它的三个理由:(1)在短暂的故障期间,它们可能引起一个良好连接(good connection)被释放(dropped),(2)它们消费了不必要的宽带,(3)在以数据包计费的互联网上它们(额外)花费金钱。然而,在许多的实现中提供了存活定时器。

    一些服务器应用程序可能代表客户端占用资源,它们需要知道客户端主机是否崩溃。存活定时器可以为这些应用程序提供探测服务。Telnet服务器和Rlogin服务器的许多版本都默认提供存活选项。

    个人计算机用户使用TCP/IP协议通过Telnet登录一台主机,这是能够说明需要使用存活定时器的一个常用例子。如果某个用户在使用结束时只是关掉了电源,而没有注销(log off),那么他就留下了一个半打开(half-open)的连接。如果客户端消失,留给了服务器端半打开的连接,并且服务器又在等待客户端的数据,那么等待将永远持续下去。存活特征的目的就是在服务器端检测这种半打开连接。

    也可以在客户端设置存活器选项,且没有不允许这样做的理由,但通常设置在服务器。如果连接两端都需要探测对方是否消失,那么就可以在两端同时设置(比如NFS)。



    keepalive工作原理:

    若在一个给定连接上,两小时之内无任何活动,服务器便向客户端发送一个探测段。(我们将在下面的例子中看到探测段的样子。)客户端主机必须是下列四种状态之一:

    1) 客户端主机依旧活跃(up)运行,并且从服务器可到达。从客户端TCP的正常响应,服务器知道对方仍然活跃。服务器的TCP为接下来的两小时复位存活定时器,如果在这两个小时到期之前,连接上发生应用程序的通信,则定时器重新为往下的两小时复位,并且接着交换数据。

    2) 客户端已经崩溃,或者已经关闭(down),或者正在重启过程中。在这两种情况下,它的TCP都不会响应。服务器没有收到对其发出探测的响应,并且在75秒之后超时。服务器将总共发送10个这样的探测,每个探测75秒。如果没有收到一个响应,它就认为客户端主机已经关闭并终止连接。

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

    4) 客户端主机活跃运行,但从服务器不可到达。这与状态2类似,因为TCP无法区别它们两个。它所能表明的仅是未收到对其探测的回复。

     

    服务器不必担心客户端主机被关闭然后重启的情况(这里指的是操作员执行的正常关闭,而不是主机的崩溃)。当系统被操作员关闭时,所有的应用程序进程(也就是客户端进程)都将被终止,客户端TCP会在连接上发送一个FIN。收到这个FIN后,服务器TCP向服务器进程报告一个文件结束,以允许服务器检测这种状态。

    在第一种状态下,服务器应用程序不知道存活探测是否发生。凡事都是由TCP层处理的,存活探测对应用程序透明,直到后面2,3,4三种状态发生。在这三种状态下,通过服务器的TCP,返回给服务器应用程序错误信息。(通常服务器向网络发出一个读请求,等待客户端的数据。如果存活特征返回一个错误信息,则将该信息作为读操作的返回值返回给服务器。)在状态2,错误信息类似于“连接超时”。状态3则为“连接被对方复位”。第四种状态看起来像连接超时,或者根据是否收到与该连接相关的ICMP错误信息,而可能返回其它的错误信息。

    linux内核包含对keepalive的支持。其中使用了三个参数:tcp_keepalive_time(开启keepalive的闲置时 长)tcp_keepalive_intvl(keepalive探测包的发送间隔)和tcp_keepalive_probes (如果对方不予应答,探测包的发送次数);在liunx中,keepalive是一个开关选项,可以通过函数来使能。具体地说,可以使用以下代码:
    setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));

    当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。此时TCP的状态是断开的。



    keepalive参数设置代码如下: 
    //  开启KeepAlive
    BOOL bKeepAlive  =  TRUE;
    int  nRet  =  ::setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, ( char * ) & bKeepAlive,  sizeof (bKeepAlive));
    if  (nRet  ==  SOCKET_ERROR)
    {
    return  FALSE;
    }

    //  设置KeepAlive参数
    tcp_keepalive alive_in                 =  { 0 };
    tcp_keepalive alive_out                
    =  { 0 };
    alive_in.keepalivetime                
    =   5000 ;                 //  开始首次KeepAlive探测前的TCP空闭时间
    alive_in.keepaliveinterval         =   1000 ;                 //  两次KeepAlive探测间的时间间隔
    alive_in.onoff                                 =  TRUE;
    unsigned 
    long  ulBytesReturn  =   0 ;
    nRet 
    =  WSAIoctl(socket_handle, SIO_KEEPALIVE_VALS,  & alive_in,  sizeof (alive_in),
    & alive_out,  sizeof (alive_out),  & ulBytesReturn, NULL, NULL);
    if  (nRet  ==  SOCKET_ERROR)
    {
    return  FALSE;
    }

    开启Keepalive选项之后,对于使用IOCP模型的服务器端程序来说,一旦检测到连接断开,GetQueuedCompletionStatus函数将立即返回FALSE,使得服务器端能及时清除该连接、释放该连接相关的资源。对于使用select模型的客户端来说,连接断开被探测到时,以recv目的阻塞在socket上的select方法将立即返回SOCKET_ERROR,从而得知连接已失效,客户端程序便有机会及时执行清除工作、提醒用户或重新连接。

    TCP连接非正常断开的检测(KeepAlive探测)

    此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因

    有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAlive探测

    第二种方法简单可靠,只需对TCP连接两个Socket设定KeepAlive探测。


    在windows下使用,要包含MSTcpIP.h的头文件。点击下面的链接即可下载这个文件
       MSTcpIP  

    备注:长连接虽好,但是比较好用但是占用系统资源比较大。个人建议如无特殊需要,用自己的心跳包机制最好
    展开全文
  • android studio 更改 app 名和包的长度

    千次阅读 2018-07-26 16:15:30
    1、修改apk 的名 2、修改的长度 1、修改apk 的名 将 com.example.menglux.myapplication 修改为 com.example.lum.test 1) 点击studio 左边project 上面的设置按钮,...
  • 在不考虑其他损耗的情况,如果只改变级联处光纤长度,级联周期光栅总量守恒;此外,当级联周期光栅在级联处光纤层模损耗系数较大时,级联周期光栅的光谱等效于两个周期光栅光谱的非相干叠加,从而为周期光栅...
  • 分析 1、Charles抓 一开始爬美团外卖App我是直接Charles上手...不过好在在我查找资料的过程也并非无任何收获,我得知美团使用了一种叫 “移动连接“ 的技术导致我抓不到; 接着我在网上找了关于该名词的解...
  • 本文章向大家介绍C# TCPclient 服务器保持连接的一种办法(变相的心跳功能),主要包括C# TCPclient 服务器保持连接的一种办法(变相的心跳功能)使用实例、应用技巧、基本知识点总结和需要注意事项,具有...
  • 时延丢网络控制系统的分析与建模,江卷,朱其新,本文分析了网络控制系统中的主要问题,在传感器为时间驱动,控制器和执行器为事件驱动的前提,提出了在综合考虑网络诱导时延、
  • java socket 连接 心跳

    千次阅读 2018-06-02 16:19:01
    首先先说说心跳在socket连接中的意义: 通过socket连接的双方为了保证在一段时间未发消息不被防火墙断开连接或者使对方及时知道自己是否已经断线而定期给对方发送的某些特殊标识字符,这个字符可以根据双方自定义...
  • 连接是客户和服务器建立连接后不断开,持续用这个连接通信,持续过程中一般需要连接侦测,客户探测服务,或者服务心跳告知客户,应用层的保活机制。 短连接是通信一次后就关闭连接。长短连接是一种通信约定,需要...
  • BS穿透内网连接例子带测试实例,vs2015项目LongPoll,http默认保持连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST、不四次握手),等待在同域名继续用...
  • 最近在测试程序时,发生了崩溃,递归建立了很深层的...虽然现代的NTFS文件系统支持的路径文件长度已经远远超过了这个数值,但因为各种历史遗留原因和兼容性原因,Windows系统却不能原生彻底支持这种路径。这种文件...
  • onedrive文件夹目录为[D:\toolbox\OneDrive - A Great Company] 打开cmd(管理员权限) mklink /J D:\toolbox\onedrive "D:\toolbox\OneDrive - A Great Company" 其中[D:\toolbox\onedrive]可以换成...
  • TCP 、UDP、IP的最大长度是多少?

    万次阅读 2017-08-10 12:01:18
    的长度
  • 目录 目录 先说问题和结论 环境 问题 真相 正文先说问题和结论环境正在 RK3288 调试 Mipi LCD(540×960)问题首先是因为我出现了这样的 Bug...于是错误地将地将两者联系起来,认为参数为 8 或者 16 的情况,LP 模式
  • TS流包长的简单判断(188/204B)

    千次阅读 2018-09-14 10:42:54
    1.按照TS流标准:一个TS流文件连续5个步进188Byte,第一个字节都是0x47同步字节开头的,那么包长188B;同理为204B。 那么,如果文件大小 < 5*188B(约1kB)是否就不好判断了呢? 我觉得,还是有个简单方法的:...
  • wireshark时间抓分多个文件

    千次阅读 2017-10-28 16:40:01
    说一说这个问题的由来,一般使用wireshark不需要时间抓的,但是有时候遇到网络通信中非常棘手的问题,例如一个小时出现一次或者几个小时出现一次问题的情况,这种情况就必须时间抓了。但是如果在wireshark...
  • wireshark抓tcp长度的疑惑

    万次阅读 2015-03-21 15:21:55
    问题今天用wireshark抓调试的时候遇到了一点小困扰,如图 本来就是两条很普通的192.168.10.90发给195的fin,195回应ack,但是这两个的长度是挺诡异的,为什么一个是54,一个是60呢,而且查看60长度的,...
  • 针对镀高折射率纳米膜的长周期光栅,建立了传感理论模型,研究了长周期光栅的谐振波长与纳米膜厚度及外界折射率的关系,给出不同纳米膜厚度下长周期光栅不同层模式重组特性。研究发现,当长周期光栅外面镀上一层沿角向...
  • 解决windows文件名太无法删除的问题

    万次阅读 多人点赞 2018-06-29 11:07:03
    今天删除一个无用文件夹时windows跳出如下弹窗:解决方法:1、在要删除的文件夹同级新建一个空文件夹(如图:1是要删除的文件夹,也就是包含那个文件名过的文件的文件夹,2是空文件夹)2、点空白处(只要不选中...
  • 四、使用FixedLengthFrameDecoder解决半粘包 4.1 试验 由于客户端发给服务器端的是hello server,im a client字符串,该字符串占用24字节,所以在服务器端channelpipeline里面添加一个长度为24的定解码...
  • 关于socket连接的心跳GOOD

    千次阅读 2014-07-16 18:57:48
    TCP的socket本身就是连接的,那么为什么还要心跳呢?   在smack里有个30s发送一个空消息的线程,同样关于心跳(keepalive)  据网络搜索到的资料解释如下 内网机器如果不主动向外发起连接,外网机...
  • 环境: websphere8.5.5.13 + JDK...现象如图所示:上传war之后就会一直卡在第一步页面,时间没有反应,查看系统进程,java进程CPU一直在100%之上; 查看日志: 日志显示多次报错: java.net.SocketTi...
  • 在电脑系统中,有时候会出现无法删除文件的情况,并提示源路径太的窗口,具体内容是“源文件名长度大于文件系统支持的长度”,如图所示。那么,下面就为大家介绍通过压缩文件解决这个问题的方法。 1、右击要...
  • 高并发的Nginx性能优化实战

    万人学习 2019-12-24 14:44:52
    【超实用课程内容】 本课程内容包含讲解解读Nginx的基础知识,解读Nginx的核心知识、带领学员进行高并发环境的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 【课程如何观看?】 PC端:...
  • 码友们好,我想实现变struct的解封,功能类似下面这样,当然这样还行不通 ``` #一个变字串 s='string data' #在串的前面写入串的长度然后写入串本身 buf=struct.pack('i'+str(len(s))+'s', len(s), s) ...
  • 最近遇到比较麻烦的事情,需要整个晚上甚至更时间启用Wireshark抓,分析网络是否有异常,甚至在抓的同时要开启迅雷等下载软件,或者进行VOIP通话等,鬼知道一晚上抓的有多大。不管三七二十一,启动wireshark...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,372,523
精华内容 949,009
关键字:

下面长包