HTTP协议与TCP/IP协议的关系

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。

长连接短连接操作过程

短连接的操作步骤是:

建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接

长连接的操作步骤是:

建立连接——数据传输 …(保持连接)… 数据传输——关闭连接

长连接和短连接的优点和缺点

长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。但是如果连接数比较多,会给服务器造成比较大压力。

短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

什么时候用长连接,短连接

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

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

推送服务

推送技术,又名反向AJAX,指的是一种基于Internet,将由中心或发布者发出消息传输给用户的技术。与之相对的是拉取(参见AJAX),这种情况下请求是由用户或客户端主动发起的。

所有的推送功能都是基于长连接的基础上的。

维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的。如果超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来说则断开与服务器的连接重新建立一个连接,对服务器来说只要断开这个连接即可。

在智能手机上的长连接心跳和在Internet上的长连接心跳有什么不同的目的呢?原因就在于智能手机使用的是移动无线网络,那么我们在讲长连接之前我们首先要了解无线移动网络的特点。

简单来说就是由于网络运营商为了节省信道资源,会在一台移动终端一段时间没有通信时关闭其关的链路。为了应对这种情况,移动应用不得不以远高于正常频率来发送心跳用以维护推送的长连接。

Android系统的推送和iOS的推送

ios长连接是由系统来维护的,iOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样做的好处是:

  1. 在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。
  2. 省电,不会出现每个应用都各自维护一个自己的长连接。
  3. 安全,只有在苹果注册的开发者才能够进行推送,等等。

Android的长连接是由每个应用各自维护的,而谷歌退出的和苹果类似的推送框架在国内无法使用的。

推送的常见方式

  1. 轮询(polling)
  2. 持久链接(binding)
  3. SMS方式

WebSocket

WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。

WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。

WebSocket的客户端API

// 创建一个Socket实例,ws表示WebSocket协议
var socket = new WebSocket('ws://localhost:8080'); // 打开socket
socket.onopen = function(event){ // 发送一个初始化消息
socket.send('hello socket') // 监听消息
socket.onmessage = function(event){
console.log('client reveived a meessage', event)
} // 监听Socket的关闭
socket.oncolse = function(event){
console.log('Client notified socket has closed', event)
} // 关闭Socket
socket.closd()
}

一个模拟聊天室websocket的例子:

在实际应用中,socket服务器端的代码可以是Python,node.js,java,php。在这里使用http://www.websocket.org/网站提供的,socket 
服务端。协议地址为:ws://echo.websocket.org/

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Websocket</title>
<style>
* {
margin: 0;
padding: 0;
} #outer {
box-sizing: border-box;
width: 60%;
height: 400px;
padding: 20px 200px;
background: black;
font-size: 20px;
color: #F8F8F8;
overflow-y: auto;
} #message {
width: 300px;
height: 20px;
margin-top: 10px;
margin-left: 100px;
margin-right: 50px;
} p {
margin: 10px 0;
} button {
background: none;
outline: none;
border: 1px solid #0b9ce1;
padding: 5px 15px;
margin: 0 8px;
border-radius: 5px;
}
</style>
</head>
<body>
<div id="outer">
<p>123</p>
<p>123</p>
</div>
<label><input id="message"></label>
<button id="send">发送</button>
<button id="quite">断开</button>
</body>
<script src="../lib/jquery.min.js"></script>
<script>
function log(msg) {
$('#outer').append('<p>' + msg + '</p>').scrollTop(500)
} function send() {
var text = $('#message').val();
if (!text) {
alert('Message can not be empty!');
return;
}
try {
socket.send(text);
log('Send : ' + text);
$('#message').val('').focus()
}
catch (e) {
log(e)
}
} function quit() {
log("Bye!");
socket.close();
socket = null;
} var socket = null;
function init() {
//声明host注意:是ws协议
var host = "ws://echo.websocket.org/"; try {
//新创建一个socket对象
socket = new WebSocket(host);
//将连接的状态信息显示在log
log('WebSocket - status ' + socket.readyState); //监听打开连接
socket.onopen = function (msg) {
log("Welcome - status " + this.readyState);
};
//监听当接收信息时触发匿名函数
socket.onmessage = function (msg) {
log("Received : " + msg.data);
};
//关闭连接
socket.onclose = function (msg) {
log("Disconnected - status " + this.readyState);
};
}
catch (e) {
log(ex)
}
$('#message').focus();
} $(function () {
init(); $("#message").keypress(function (e) {
if (event.keyCode === 13) {
send();
}
}); $('#send').click(function () {
send();
}); $('#quite').click(function () {
quite();
}); $("#outer").scroll(function(){
$(this)
})
}) </script>
</html>

更多关于socket io等的例子和方案看这里

参考

HTTP长连接和短连接 + Websocket的更多相关文章

  1. 长连接、短连接、长轮询和WebSocket

    //转发,格式待整理 2017-08-0519784View0 对这四个概念不太清楚,今天专门搜索了解一下,总结一下: 长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务 ...

  2. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  3. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

  4. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

  5. (转)HTTP 长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

  6. HTTP长连接和短连接

    1.HTTP协议的五大特点1)支持客户/服务器模式2)简单快速3)灵活4)无连接每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,断开连接.5)无状态协议不会记录服务器客户端状态. ...

  7. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  8. Http 和TCP的关系,TCP长连接和短连接有什么区别?

    HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...

  9. 【转】HTTP中的长连接和短连接分析

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

随机推荐

  1. STM32F0使用LL库实现Modbus通讯

    在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇将说明基于LL实现USART通讯. 1 ...

  2. java http post/get 服务端和客户端实现json传输

    注:本文来源于<java http post/get 服务端和客户端实现json传输> 最近需要写http post接口所以学习下. 总的还是不难直接上源码! PostHttpClient ...

  3. vertx的HttpServer模块

    Start HttpServer /** * 启动 HttpServer * multi instances 采用 synchronized防止线程安全问题 * addHandlers 方法是acto ...

  4. MySQL----下载安装

    MySQL 的官网下载地址:http://www.mysql.com/downloads/ 注意 1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持.2. M ...

  5. centos修改SSH端口并禁用root远程登录

    1.使用 root 用户执行以下步骤:只在 CentOS 6.5 下验证. 2.先查看下服务器端口号范围: # sysctl -a|grep ip_local_port_range 3.修改端口 vi ...

  6. 通过GIT_COMMIT进行代码回滚

    首先需要安装插件:conditional-buildstep A buildstep wrapping any number of other buildsteps, controlling thei ...

  7. MySQL 常用命令(Linux)

    一.查看MySQL服务 MySQL服务应该随开机自动启动的.正常情况下,查看开机自动启动的服务使用chkconfig命令,如下: chkconfig --list 实际mysql是否真正启动,是否真正 ...

  8. B. Menci 的序列

    题解: 首先subtask1直接状压暴力就好 subtask2我的处理和题解不太一样 仍然正向考虑 设i的时候有最高位为j,那么这个时候数一定越大越好(这个比较好yy) 然后$f[i][j]$搞个高精 ...

  9. 安卓获取签名SHA1

    Debug签名:D:\Java\jdk1.8.0_151\bin>keytool -list -v -keystore debug.keystore  无需密码 Relese签名:D:\Java ...

  10. Final Cut Pro X for Mac(FCPX专业视频剪辑工具)实用技巧篇!

    Final Cut Pro X for Mac是一款非常强大的专业视频剪辑工具,全球很多人都在用!现在小编给大家带来一些关于Final Cut Pro X for Mac的使用技巧,希望对大家以后的应 ...