1.HTTPHTTP是一种超文本传输??协议,英文写作HyperTextTransferProtocol,建立在TCP协议之上。http的两端是client和server,就是经典的B/S模式。另外,这里的B表示浏览器。浏览器成为http代理,用户的行为会通过浏览器转化为http请求报文发送给服务器。服务器也是S,它会处理请求,然后将响应消息发送给代理,也就是浏览器。浏览器解析响应消息后,将用户界面显示给用户。这里我们看到在基于http或者https的B/S模式中国,浏览器只负责发送消息、接收消息、解析消息、显示界面,服务器端负责处理http请求和发送http响应。TCP的全称是TransmissionControlProtocol,属于OSI模型上的传输层协议。七层协议示意图如下:TCP是面向连接的协议,其显着特点是在传输前需要3次握手才能形成一个会话。只有在会话形成后,服务器和客户端才能相互发送数据。在创建会话的过程中,服务端和客户端分别提供一个套接字,这两个套接字共同构成一个连接。服务器和客户端通过套接字实现两者之间的连接操作。http网络通信的所有报文信息如下,报文分为四部分。$curl-vhttp://127.0.0.1:1337//第一部分:就是经典的TCP三次握手,这样就建立了连接*即将connect()到127.0.0.1端口1337(#0)*尝试127.0.0.1...*connected*Connectedto127.0.0.1(127.0.0.1)port1337(#0)//第二部分:客户端完成握手后,向服务器端发送请求报文。>GET/HTTP/1.1>用户代理:curl/7.24.0(x86_64-apple-darwin12.0)libcurl/7.24.0OpenSSL/0.9.8rzlib/1.2.5>主机:127.0.0.1:1337>接受:*/*>//第三部分:服务端处理完成后,向客户端发送响应内容,包括响应头和响应体。和<的部分。在响应消息中,有一个消息体,是HelloWorld。2、如果WebSocket使用websocket,网页客户端只需要一个TCP连接就可以完成双向通信。当服务端和客户端通信频繁时,不需要频繁断开连接,重新发送请求。可以有效地使用连接。特点如下:(1)基于TCP协议,服务器端实现相对容易。(2)与HTTP协议有很好的兼容性。默认的端口也是80和443,而且握手阶段使用的是HTTP协议,所以在握手的时候不容易屏蔽,可以通过各种HTTP代理服务器。(3)数据格式比较轻,性能开销小,通信效率高。(4)可以发送文本或二进制数据。(5)没有同源限制,客户端可以和任何服务器通信。(6)协议标识符为ws(如果加密则为wss),服务器URL为URL。Websocket和HTTP有以下优点:客户端和服务端只建立一个tcp连接,可以使用的连接更少。websocket服务端可以向客户端推送数据,远比HTTP请求响应方式灵活高效。多了一些轻量级的协议头来减少数据量~~~~websocket分为握手和数据传输两部分。握手是使用http执行的。1)WebSocket握手客户端建立连接时,通过HTTP发起请求报文。如下图:GET/chatHTTP/1.1Host:server.example.com//请求服务器升级协议为WebSocketUpgrade:websocketConnection:Upgrade//用于安全验证Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==//指定子协议和版本号Sec-WebSocket-Protocol:chat,superchatSec-WebSocket-Version:13处理请求后,服务器响应以下消息:HTTP/1.1101SwitchingProtocolsUpgrade:websocketConnection:UpgradeSec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol:chat这个消息会告诉客户端正在更换协议,更新为应用层协议websocket,新的协议应用在当前socket上。其余字段分别表示服务器根据Sec-WebSocket-Key和选择的子协议生成的字符串。客户端会验证Sec-WebSocket-Accept的值,如果成功,则开始下一次数据传输。2)WebSocket数据传输握手成功后,当前连接将不再进行http交互,而是启动websocket的数据帧协议,实现客户端与服务端的数据交互。协议升级过程如下:当客户端调用send()发送数据时,服务端触发onmessage(),当服务端调用send()发送数据时,客户端的onmessage()触发,当我们调用send()在发送一个数据时,协议可能会将这个数据封装成一帧或多帧数据,然后一帧一帧地发送出去。出于安全原因,客户端发送的数据帧需要被屏蔽。一旦服务端收到未屏蔽的帧,比如中途拦截,就会关闭连接。服务器发送给客户端的数据帧不需要屏蔽。如果客户端收到屏蔽的数据帧,连接也会关闭。传输的帧类型分为两类:数据帧(Dataframe)和控制帧(Controlframe)。数据帧可以携带文本数据或二进制数据;控制帧包括Close帧和Ping/Pong帧。在websocket中数据帧的定义中,每8位为一列,也就是一个字节,每一位都有其含义:fin,如果这一帧是最后一帧,则此fin为1,其他情况为0.rsv1、rsv2和rsv3都是一位长,用于标识扩展名。这些值在有延期协商时可能为1,在其他情况下为0。opcode,4位长,可表示0~15的值,用于说明当前数据帧,0表示附加数据帧,1表示文本数据帧,2表示二进制数据帧,8表示发送一个数据帧withconnectionclosed,9表示ping数据帧,10表示pong数据帧,其他值暂时未定义。ping数据帧和pong数据帧用于心跳检测。当一端发送ping数据帧时,另一端必须发送pong数据帧作为响应,告知另一端本端仍处于响应状态。Ping/Pong帧:Ping帧和Pong帧用于保持连接或诊断对端是否在线。这两个帧的发送和接收没有向WEB应用暴露接口,是由实现WebSocket协议的底层应用(如浏览器)实现的。masked,表示是否进行掩码处理,1位长度,client发送给server时为1,server回传给client时为0。payloadlength:一个7、7+16或7+64位长的数据,标识数据的长度。如果该值介于0和125之间,则该值为数据的实际长度。如果是126,那么后面16位的值就是数据的真实长度。如果是127,那么后面64位的值就是数据。实际长度。makingkey,当masked为1时,这里是一个32位长的数据位,用于解密数据。payloaddata,我们的目标数据,位数是8的倍数。客户端发送消息时,需要构造一个或多个数据帧协议消息。比如我们发送一个helloworld,比较短,不需要划分多个数据帧,而且是文本方式发送。它的payload长度为96(12字节*8位/字节),二进制表示为110000。所以消息应该是:fin(1)+res(000)+opcode(0001)+masked(1)+payloadlength(1100000)+maskingkey(32bits)+payloaddata(helloworld!encryptedbinary)服务器回复到yakexi,不需要mask,形式如下:fin(1)+res(000)+opcode(0001)+masked(0)+payloadlength(1100000)+payloaddata(yakexi的二进制)连接isclosed任一端向另一端发送关闭帧以关闭连接。在关闭连接时,通常会有一个关闭连接的状态码(statuscode)。常见状态码的含义如下:1000连接正常关闭1001端点离线,例如服务器宕机,或者浏览器已离开该页面1002端点因协议错误断开连接1003端点因接收到不可接受的数据类型而断开连接1004保留1005保留1006端点异常关闭1007端点接收到的数据帧类型不一致,关闭连接1008连接因数据违规而关闭1009接收到的消息数据是toolargeandtheconnectionisclosed1010ClientClosedbecausetheserverdidnegotiateanextension1011Theserverclosedtheconnectionbecauseitencounteredexception1015TLShandshakefailedandclosedtheconnection参考链接:https://developer.mozilla.org。..https://segmentfault.com/a/11...