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. source ~/.bash_profile 只生效一次 解决方案

    在~/.zshrc文件最后,增加一行: source ~/.bash_profile

  2. P2419 [USACO08JAN]牛大赛Cow Contest(dfs走天下/)

    题目描述 FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:).在赛场上,奶牛们按1..N依次编号.每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就 ...

  3. EtherNet/IP 协议结构

    一.Ethernet/IP 协议 将标准的TCP/IP以太网延伸 到工业实时控制并和通用工业协议(CIP)结合,将很好地帮助用户获得更加开放集成的工业自动化和信息化的整体解决方案.EtherNet/I ...

  4. clearTimeout方法在IE上的兼容问题

    今天在修改公司项目的bug时发现一个问题,出错代码如下: clearTimeout(); setTimeout(function(){ // 具体业务逻辑 },100); 这段代码在chrome.fi ...

  5. 2018年最新JAVA面试题总结之JavaWeb(2)

    转自于:https://zhuanlan.zhihu.com/p/39522575 1.tomcat的优化方式?回答:Tomcat的优化我准备从三方面来说: 第一部分: 内存优化Tomcat的默认内存 ...

  6. 饮冰三年-人工智能-Python-26 Django 学生管理系统

    背景:创建一个简单的学生管理系统,熟悉增删改查操作 一:创建一个Django项目(http://www.cnblogs.com/wupeiqi/articles/6216618.html) 1:创建实 ...

  7. eclipse中alt+/失效的几种解决方法

    1.次方法用于没有一点提示的情况:依次打开eclipse上面的windows ——preferences ——java ——editor —— content assist ,在右上方有一行“sele ...

  8. Celery初识及简单实例

    Celery是一个“自带电池”的任务队列.易于使用,可以轻易入门,它遵照最佳实践设计,使产品可以扩展,或与其他语言集成,并且它自带了在生产环境中运行这样一个系统所需的工具和支持.本文介绍基础部分: 选 ...

  9. 创建自己的library类库包并使用webpack4.x打包发布到npm

    创建自己的library类库包并使用webpack4.x打包发布到npm 我们在开发过程中,可能经常要使用第三方类库,比如jquery.lodash等.我们通过npm,下载安装完之后,就可以使用了,简 ...

  10. 网络远程唤醒 WOL Magic Packet

    Magic Packet Magic Packet白皮书介绍: The basic technical details of Magic Packet Technologyare simple and ...