17
Socket 和 Websocket @ 和和 2015 和 3 和 10 和

Socket 和 web socket

Embed Size (px)

Citation preview

Page 1: Socket 和 web socket

Socket 和 Websocket@ 洪涛 2015 年 3 月 10 日

Page 2: Socket 和 web socket

TCP/IP 互联网协议簇

Tcp 传输控制协议在因特网协议族( Internet protocol suite )中, TCP 层是位于 IP 层之上,应用层之下的中间层。

Ip 网际协议根据源主机和目的主机的地址传送数据;IP 定义了寻址方法和数据报的封装结构。这个协议家族的两个核心协议,包括 TCP (

传输控制协议)和 IP (网际协议)。

Page 3: Socket 和 web socket

TCP

创建通路三次握手,初始化参数,比如序号。

数据传输为保证可靠性和强壮性:使用序号,对收到的TCP报文段进行排序以及检测重复的数据;使用校验和来检测报文段的错误;使用确认和计时器来检测和纠正丢包或延时。

位 IP 层之上,于应用层( http 协议应用层协议的一中)之下。

将应用层的数据分组并加序号和确认号。

Page 4: Socket 和 web socket

Socket or Websocket

Page 5: Socket 和 web socket

Socket And Socket API

Socket pair标识网络中的主机和进程127.0.0.1:80

Socket API在 TCP/IP 协议实现应用中, Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。C, PHP, Java 等都有对应的实现。

Socket API list

Page 6: Socket 和 web socket

Function Description

socket 创建一个新的确定类型的套接字,类型用一个整型数值标识(文件描述符),并为它分配系统资源

bind 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和 IP 地址。

listen 用于服务器端,使一个绑定的 TCP 套接字进入监听状态。connect 用于客户端,为一个套接字分配一个自由的本地端口号。 如果

是 TCP 套接字的话,它会试图获得一个新的 TCP 连接。accept 用于服务器端。 它接受一个从远端客户端发出的创建一个新的

TCP 连接的接入请求,创建一个新的套接字,与该连接相应的套接字地址相关联。

send 和 recv 用于往 / 从远程套接字发送和接受数据。close 用于系统释放分配给一个套接字的资源。 如果是 TCP ,连接

会被中断。

Socket API list (1)

Page 7: Socket 和 web socket

Function Description

select 用于修整有如下情况的套接字列表: 准备读,准备写或者是有错误。

gethostbyname和gethostbyaddr

用于解析主机名和地址。

poll 用于检查套接字的状态。 套接字可以被测试,看是否可以写入、读取或是有错误。

getsockopt 用于服务器端,使一个绑定的 TCP 套接字进入监听状态。setsockopt 用于为指定的套接字设定一个特定的套接字选项。close 用于系统释放分配给一个套接字的资源。 如果是 TCP ,连接

会被中断。

Socket API list (2)

Page 8: Socket 和 web socket

Example nodeserver.js

var net = require('net');

var server = net.createServer(function(c) { //'connection' listener console.log('client connected'); c.on('end', function() { console.log('client disconnected'); }); c.write('hello\r\n'); c.pipe(c);});server.listen(8124, function() { //'listening' listener console.log('server bound');});

Page 9: Socket 和 web socket

Example nodeclient.js

var net = require('net');var client = net.connect({port: 8124}, function() { //'connect' listener console.log('connected to server!'); client.write('world!\r\n'); });client.on('data', function(data) { console.log(data.toString()); client.end();});client.on('end', function() { console.log('disconnected from server');});

Page 10: Socket 和 web socket

En,HowAbout

Websocket

Page 11: Socket 和 web socket

Why websocket?

互联网需要 Web 实时应用在线游戏、在线证券、设备监控、新闻在线播报、 RSS 订阅推送等等websocket 之前 , 有轮询( Polling )和 Comet 方案

Polling 和 Comet 增加了编程实现的复杂度增加了服务器端的负载

So, Html5 websocket come!!!!

Dai,Hongtao
轮询:这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的最大问题是,当客户端以固定频率向服务器发起请求的时候,服务器端的数据可能并没有更新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。长轮询:长轮询是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者时间过期,通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提高。流:流技术方案通常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进用户体验,同时这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。
Dai,Hongtao
在实际的应用中,为了模拟比较真实的实时效果,开发人员往往需要构造两个 HTTP 连接来模拟客户端和服务器之间的双向通讯,一个连接用来处理客户端到服务器端的数据传输,一个连接用来处理服务器端到客户端的数据传输,这不可避免地增加了编程实现的复杂度,也增加了服务器端的负载,制约了应用系统的扩展性。
Page 12: Socket 和 web socket

What is websocket

Websocket 规范通过一个 http 请求发起,附加头信息Upgrade: WebSocket”, 升级 http 协议,建立 websocket 链接

WebSocket 服务器端实现Kaazing WebSocket Gateway — 一个 Java 实现的 WebSocket Servermod_pywebsocket — 一个 Python 实现的 WebSocket ServerNetty — 一个 Java 实现的网络框架其中包括了对 WebSocket 的支持node.js — 一个 Server 端的 JavaScript 框架提供了对 WebSocket 的支持

WebSocket 客户端实现HTML5 WebSocket

Page 13: Socket 和 web socket

Websocket 浏览器支持

浏览器支持 支持情况Chrome Supported in version 4+

Firefox Supported in version 4+

Internet Explorer Supported in version 10+

Opera Supported in version 10+

Safari Supported in version 5+

Page 14: Socket 和 web socket

Example nodewsapp.js

// npm install websocket

var WebSocketServer = require('websocket').server;

new WebSocketServer({ httpServer: server});

Page 15: Socket 和 web socket

Example nodeclient.html

var wsServer = 'ws://localhost:8124';var websocket = new WebSocket(wsServer);

websocket.onmessage = function (evt) { onMessage(evt) };websocket.onerror = function (evt) { onError(evt) };

function onMessage(evt) { console.log('Retrieved data from server: ' + evt.data);}function onError(evt) { console.log('Error occured: ' + evt.data);}

Page 16: Socket 和 web socket