﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-thisliy-随笔分类-网络</title><link>http://www.blogjava.net/thisliy/category/42672.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 17 Feb 2010 14:24:46 GMT</lastBuildDate><pubDate>Wed, 17 Feb 2010 14:24:46 GMT</pubDate><ttl>60</ttl><item><title>socket心跳检测</title><link>http://www.blogjava.net/thisliy/archive/2010/02/17/313271.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Wed, 17 Feb 2010 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2010/02/17/313271.html</guid><description><![CDATA[一、什么是心跳检测<br />
<br />
判断对方（设备，进程或其它网元）是否正常动行，一般采用定时发送简单的通讯包，如果在指定时间段内未收到对方响应，则判断对方已经当掉。用于检测TCP的异常断开。<br />
<br />
基本原因是服务器端不能有效的判断客户端是否在线也就是说，服务器无法区分客户端是长时间在空闲，还是已经掉线的情况。所谓的心跳包就是客户端定时发送简单的信息给服务器端告诉它我还在而已。<br />
<br />
代码就是每隔几分钟发送一个固定信息给服务端，服务端收到后回复一个固定信息。如果服务端几分钟内没有收到客户端信息则视客户端断开。比如有些通信软件长时间不使用，要想知道它的状态是在线还是离线就需要心跳包，定时发包收包。
<p>发包方可以是客户也可以是服务端，看哪边实现方便合理。<font size="+0">一般是客户端。服务器也可以定时轮询发心跳下去。<br />
</font><br />
<font color="#000000"><font style="background-color: #ffffff">一般来说，出于效率的考虑，是由客户端主动向服务器端发包，而不是相反。<br />
</font><br />
</font>二、关于Send函数的返回值<br />
<br />
我们知道当客户端以优雅的方式断开TCP连接后，服务器使用Send函数发包，得到的返回值为0（说明TCP连接已断开）。然而，SEND函数的成功返回只能表示发送数据已经进入了SOCKET内核的发送队列，不一定就已经在线上或者已经被成功接收了。这可能是因为send只是往发送缓冲区拷贝数据, 刚开始缓冲区还未满,所以不会有错误发生, 只有等到相当一段长的时间后, send的返回值才会为-1。<br />
<br />
三、定时Ping<br />
<br />
如果服务器不能进行心跳检测的应答。可以采用定时Ping某服务器来检测TCP连接是否断开，如新浪（必须允许Ping的服务器）。PING是向远程主机发送一个ICMP包，如果给定时间内没有接收到回应就认为是超时，如果收到回应则分析接收到的ICMP包，得到TTL、类型以及用时。<br />
<br />
不过Ping包有32字节，如果是无线连接，有时需要考虑流量问题。<br />
<br />
四、使用TCP存活定时器</p>
<img src ="http://www.blogjava.net/thisliy/aggbug/313271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2010-02-17 13:11 <a href="http://www.blogjava.net/thisliy/archive/2010/02/17/313271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP连接、Http连接与Socket连接</title><link>http://www.blogjava.net/thisliy/archive/2009/11/08/301615.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Sun, 08 Nov 2009 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/11/08/301615.html</guid><wfw:comment>http://www.blogjava.net/thisliy/comments/301615.html</wfw:comment><comments>http://www.blogjava.net/thisliy/archive/2009/11/08/301615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/thisliy/comments/commentRss/301615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thisliy/services/trackbacks/301615.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <div>
            <p><strong><span style="font-family: 微软雅黑"><span style="font-size: 12pt">1、TCP连接</span></span></strong></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"><span style="font-size: 12pt">手机能够使用联网功能是因为手机底层实现了TCP/IP协议，可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口，使上层网络数据的传输建立在&#8220;无差别&#8221;的网络之上。</span></span></font></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">建立起一个TCP连接需要经过&#8220;三次握手&#8221;：</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">第一次握手：客户端发送syn包(syn=j)到服务器，并进入SYN_SEND状态，等待服务器确认；</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">第二次握手：服务器收到syn包，必须确认客户的SYN（ack=j+1），同时自己也发送一个SYN包（syn=k），即SYN+ACK包，此时服务器进入SYN_RECV状态；</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">第三次握手：客户端收到服务器的SYN＋ACK包，向服务器发送确认包ACK(ack=k+1)，此包发送完毕，客户端和服务器进入ESTABLISHED状态，完成三次握手。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">握手过程中传送的包里不包含数据，三次握手完毕后，客户端与服务器才正式开始传送数据。<font color="#ff0000">理想状态下，TCP连接一旦建立，在通信双方中的任何一方主动关闭连接之前，TCP 连接都将被一直保持下去。</font>断开连接时服务器和客户端均可以主动发起断开TCP连接的请求，断开过程需要经过&#8220;四次握手&#8221;（过程就不细写了，就是服务器和客户端交互，最终确定断开）</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><br />
            <strong><span style="font-family: 微软雅黑"><span style="font-size: 12pt">2、HTTP连接</span></span></strong></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">HTTP协议即超文本传送协议(Hypertext Transfer Protocol )，是Web联网的基础，也是手机联网常用的协议之一，HTTP协议是建立在TCP协议之上的一种应用。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应，在请求结束后，会主动释放连接。从建立连接到关闭连接的过程称为&#8220;一次连接&#8221;。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">1）在HTTP 1.0中，客户端的每次请求都要求建立一次单独的连接，在处理完本次请求后，就自动释放连接。<br />
            <wbr></wbr><wbr></wbr><br />
            2）在HTTP 1.1中则可以在一次连接中处理多个请求，并且多个请求可以重叠进行，不需要等待一个请求结束后再发送下一个请求。<br />
            <wbr></wbr><wbr></wbr><br />
            <font color="#ff0000">由于HTTP在每次请求结束后都会主动释放连接，因此HTTP连接是一种&#8220;短连接&#8221;，要保持客户端程序的在线状态，需要不断地向服务器发起连接请求。</font>通常的做法是即时不需要获得任何数据，客户端也保持每隔一段固定的时间向服务器发送一次&#8220;保持连接&#8221;的请求，服务器在收到该请求后对客户端进行回复，表明知道客户端&#8220;在线&#8221;。若服务器长时间无法收到客户端的请求，则认为客户端&#8220;下线&#8221;，若客户端长时间无法收到服务器的回复，则认为网络已经断开。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><br />
            <strong><span style="font-family: 微软雅黑"><span style="font-size: 12pt">3、SOCKET原理</span></span></strong></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">3.1套接字（socket）概念</span></span></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">套接字（socket）是通信的基石，是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示，包含进行网络通信必须的五种信息：连接使用的协议，本地主机的IP地址，本地进程的协议端口，远地主机的IP地址，远地进程的协议端口。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">应用层通过传输层进行数据通信时，TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接，许多计算机操作系统为应用程序与TCP／IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口，区分来自不同应用程序进程或网络连接的通信，实现数据传输的并发服务。</span></span></p>
            <p><br />
            <span style="font-family: 微软雅黑"><span style="font-size: 12pt">3.2 建立socket连接</span></span></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">建立Socket连接至少需要一对套接字，其中一个运行于客户端，称为ClientSocket ，另一个运行于服务器端，称为ServerSocket 。</span></span></p>
            <p><font size="4"><font color="#ff0000"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">套接字之间的连接过程分为三个步骤：服务器监听，客户端请求，连接确认。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">服务器监听：服务器端套接字并不定位具体的客户端套接字，而是处于等待连接的状态，实时监控网络状态，等待客户端的连接请求。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">客户端请求：指客户端的套接字提出连接请求，要连接的目标是服务器端的套接字。为此，客户端的套接字必须首先描述它要连接的服务器的套接字，指出服务器端套接字的地址和端口号，然后就向服务器端套接字提出连接请求。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">连接确认：当服务器端套接字监听到或者说接收到客户端套接字的连接请求时，就响应客户端套接字的请求，建立一个新的线程，把服务器端套接字的描述发给客户端，一旦客户端确认了此描述，双方就正式建立连接。而服务器端套接字继续处于监听状态，继续接收其他客户端套接字的连接请求。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><br />
            <strong><span style="font-family: 微软雅黑"><span style="font-size: 12pt">4、SOCKET连接与TCP连接</span></span></strong></p>
            <p><font size="4"><span style="font-family: 微软雅黑"><span style="font-size: 12pt">创建Socket连接时，可以指定使用的传输层协议，Socket可以支持不同的传输层协议（TCP或UDP），<font color="#ff0000">当使用TCP协议进行连接时，该Socket连接就是一个TCP连接。</font></span></span></font></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><br />
            <strong><span style="font-family: 微软雅黑"><span style="font-size: 12pt">5、Socket连接与HTTP连接</span></span></strong></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">由于通常情况下Socket连接就是TCP连接，因此Socket连接一旦建立，通信双方即可开始相互发送数据内容，直到双方连接断开。但在实际网络应用中，客户端到服务器之间的通信往往需要穿越多个中间节点，例如路由器、网关、防火墙等，大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连，因此需要通过轮询告诉网络，该连接处于活跃状态。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">而HTTP连接使用的是&#8220;请求—响应&#8221;的方式，不仅在请求时需要先建立连接，而且需要客户端向服务器发出请求后，服务器端才能回复数据。</span></span></p>
            <p><font size="4"><wbr></wbr><wbr></wbr><span style="font-family: 微软雅黑"></span></font></p>
            <p><span style="font-family: 微软雅黑"><span style="font-size: 12pt">很多情况下，需要服务器端主动向客户端推送数据，保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接，服务器就可以直接将数据传送给客户端；若双方建立的是HTTP连接，则服务器需要等到客户端发送一次请求后才能将数据传回给客户端，因此，客户端定时向服务器端发送连接请求，不仅可以保</span></span></p>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/thisliy/aggbug/301615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-11-08 17:58 <a href="http://www.blogjava.net/thisliy/archive/2009/11/08/301615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>