Socket协议和"心跳"机制

来源:互联网 发布:武力收复台湾 知乎 编辑:程序博客网 时间:2024/05/17 09:15


我们知道网络的3要素:主机地址(也就是常说的ip地址)、端口号(做过服务器开发的童鞋都知道,80、8080...)、传输协议。通过ip地址可以找到对应的主机,通过端口号可以找到主机上对应的程序,通过传输协议可以确定网络间是如何传入数据的。
我们常见的网络传输协议比如:HTTP、HTTPS、TCP、UDP等。Socket 也是一种传输协议,它的底层是基于TCP/IP协议。通过Socket协议使网络上的两个程序通过一个双向的通信连接起来实现数据交换。顾名思义,通过socekt建立的连接,至少要有2个端,一个运行于服务器端的socket,一个运行于客户端的socket。

服务器端的socket,我们可以理解成一个特殊的应用程序,一直处于开启状态。它有一个固定端口,监听客户端socket的连接,一旦接受到客户端的连接请求,就会做出相应的响应。服务器端和客户端建立起连接之后,就可以互相传输数据了。
通俗理解: 可以把服务器端理解成一个巨大的水库,客户端理解成一个个小的水桶,要想让水库和水桶之间可以互相传递水流,就必须socket这个东西,让水库和水桶建立起一个双向连接。如下图:



此时,客户端socket和服务器端socket建立起了连接,就可以互相传递数据了。但我们需要知道在服务器和客户端之间通过socket建立起的这种连接是长连接,既然有长连接,那么就对应的有端连接。通过http协议建立起来的连接是短连接,连接之后在短暂时间内这个连接就会断开(关于短连接请大家自己百度一下)。

既然,客户端和服务器端建立起了长连接,那么怎么知道长连接一直处于保持状态,而没有断开那?我们不能空口说它们之间保持了长连接,就一直保持着吧!两端是通过一种“心跳包”的机制来检测长连接是否处于保持状态。

注: “心跳包”就是服务器端和客户端约定好的一种数据。
所谓“心跳包”机制,其实就是服务器端按照固定的频率给客户端发送心跳包,客户端接受到心跳包之后做回应。如果服务器端发送了一个心跳包,客户端没有回应。服务器认为客服端已经不在了,就会断开长连接。

说明: 服务器只是在客户端长时间没有给服务器发送数据的情况下,才会发心跳包。
比如我们制定固定频率为30秒,即:服务器每隔30秒给客户端发送一个心跳包。假如服务器和客户端互相欢快的传递数据已经超过30秒,但是此时在30秒的时候并不会发送心跳包。
为什么不会发送心跳包??
因为发送心跳包的时间,是从客户端最后一次传递数据给服务器的时间开始计算的,比如,客户端最后一次给服务器传递数据是 10点05分05秒,从此刻开始计算,如果到05分35秒的时候,客户端没有给服务器端传递数据,那么服务器就会发送心跳包给客户端,客户端接受到心跳包做回应,告诉服务器长连接处于保持中,但是如果在05分34秒的时候,客户端给服务器端传递了数据,那么此时就会从05分34秒从新开始计算,再间隔30秒....


0 0
原创粉丝点击