HTTP TCP/IP协议 与iOS推送

774 阅读6分钟

五层协议体系结构

HTTP协议的长连接和短链接

HTTP属于应用层的协议,在传输层使用TCP协议,网络层使用IP协议。IP协议主要用来解决网络路由和寻址问题,TCP协议主要解决在IP层之上的数据传输。

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码: Connection:keep-alive 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

TCP的长连接和短链接

TCP短链接

client向service发起连接请求,server接到请求,双方建立链接。client向Server发送消息,serve回复该消息,一次读写完成,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。

短连接的操作步骤是:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接

TCP长连接

client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

长连接的操作步骤是:建立连接——数据传输…(保持连接)…数据传输——关闭连接

TCP保活功能

保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务 器端检测到这种半开放的连接。

如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:

1.客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。

2.客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。

3.客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。

4.客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

iOS/Android推送服务器原理

  • 常见的推送实现方式

    1.轮询(Pull)方式:即轮询(polling),客户端不断的查询服务器,检索新内容。

    2.持久连接(Push)方式:即绑定(binding),客户端和服务器之间维持一个TCP/IP长连接,服务器向客户端push。

    3.SMS(Push)方式:服务器又新内容时,发送一条类似短信的信令给客户端,客户端收到后从服务器中下载新内容,也就是SMS的推送方式。

    iOS和Android的推送就是用第二种方式实现的。因为推送是由服务器主动向客户端发送消息,所以必须维持一个客户端和服务器的长连接,如果客户端和服务器不存在一个长连接,那么服务器是无法主动链接客户端的。

  • iOS和Android不同的是,iOS长连接是由系统来维护的,也就是说苹果的iOS系统在系统级别维护了一个客户端和苹果服务器的长链接,iOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为:

    1.在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。

    2.省电,不会出现每个应用都各自维护一个自己的长连接。

    3.安全,只有在苹果注册的开发者才能够进行推送,等等。

  • Android的长连接是由每个应用各自维护的,但是Google也推出了和苹果技术架构相似的推送框架,C2DM,云端推送功能,但是由于Google的服务器不在中国境内,其他的原因你懂的。所以导致这个推送无法使用,Android的开发者不得不自己去维护一个长链接,于是每个应用如果都24小时在线,那么都得各自维护一个长连接,这种电量和流量的消耗是可想而知的。虽然国内也出现了各种推送平台,但是都无法达到只维护一个长连接这种消耗的级别。

参考文章

HTTP长连接和短连接以及推送技术原理

关于HTTP协议,一篇就够了