近来项目中使用websocket,于是来研究一番。websocket传输协议有两个部分,握手和数据传输
握手
GET / HTTP/1.1 HOST: <IP>:<PORT> Sec-Websocket-Version: 13 Sec-Websocket-Key: <KEY> Connection: keep-alive, Upgrade Upgrade: websocket
之后服务端会返回类似下面的数据
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: <ACCEPT_KEY> Sec-WebSocket-Version: 13 Server: swoole-websocket-server
校检连接
这里可以对accept key进行校检,确定服务器确实是websocket服务器,校检算法为
sha1(KEY+‘258EAFA5-E914-47DA-95CA-C5AB0DC85B11’),将得到的一串字符串用16进制表示,之后再进行base64编码。
base64_encode(pack('H*', sha1(KEY.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
发送数据
websocket数据使用帧序列传输
来一张图
下面介绍的是这个数据包的含义。
FIN:长度1位,表示是否是最后一帧,为1则表示最后一帧,为0则表示还有后续帧
RSV(1-3):每一个1位,保留位。目前为0,如果服务端与客户端没有协商,那么非0则认为是一个错误的帧
opcode:表示帧格式,占4位,格式如下
0x00,表示继续帧 0x01,表示文本帧 0x02,表示二进制帧 0x03-0x07,保留的未定义非控制帧 0x08,连接关闭帧 0x09,表示ping 0xA,表示pong 0xB-0xF,用于保留的控制帧
MASK,1位,定义负载数据是否使用掩码,1为使用掩码,0为不使用掩码
Payload Length,7位,7+16位,7+64位,定义负载数据的长度,以字节为单位。这部分如果为0-125,则负载长度则就是这段定义的长度,如果为126,之后的 Extend payload Length 16位将作为负载长度,如果为127,那么之后的Extend payload Length 64位将作为负载长度。
负载数据长度为扩展数据长度+应用数据长度,扩展数据可以为0
Masking-key ,0 或者 32位,mask位设为0,则该字段缺失(不过协议要求,所有的帧都需要使用mask)
Payload data,负载数据=扩展数据+应用数据
Extension data,可以是客户端和服务端协商的长度,如果没有则为0
Application data,需要发送的真正的应用数据
你可能还喜欢下面这些文章
signal作用是为信号注册一个处理器。这里的“信号”是软中断信号,这种信号来源主要有三种:程序错误:比如除0,非法内存访问。外部信号:终端Ctrl-C产生的SIGINT信号,定时器产生的SIGALERM。显示请求:kill函数发送的任意信号。当kill一个进程的时候,默认会发送SIGTERM信号,此时这个信号只有默认处理操作(SIG_DFL),直接中断进程执行。如果此时该进程正在执行一个任务,直接终止该进程会导致任务没有完成。这个时候为SIGTERM信号注册一个信号处理函数就十分有必要。介绍typedef void (*sighandler_t) (int);sighandler_t sig
来熟悉熟悉ftp命令,对于服务器之间的文件传输太有用啦,不会怎么能行呢!先来看看基础的命令,包括了连接,列出列表,下载,上传,断开这最基础的命令,会这些,在使用ftp命令行就毫无压力啦!1. 连接ftp服务器格式:ftp [hostname| ip-address]a)在linux命令行下输入:ftp 192.168.1.1b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。2.列出文件列表以及切换目录这部分其实和linux并无区别,分别是ls,和cd列出目录列表ls切换当前目录cd dir3. 下载文件下载文件通常用get和mget这两条命令。a) get格式:get [
编译步骤gcc 与 g++ 分别是 gnu 的 c & c++ 编译器。gcc/g++ 在执行编译工作的时候,总共需要4步:预处理,生成 .i 的文件[预处理器cpp]将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]连接目标代码, 生成可执行程序 [链接器ld]参数详解-x language filename参数含义为指定文件所使用的语言。根据约定,C语言的后缀名称为”.c”,而 C++ 的后缀名为”.cpp”或”.cc”,但如果你的源代码后缀不约定的那几种,那么需要使用-x参数来指定文件所使用的语言。这
vsftpd的配置文件/etc/vsftpd/vsftpd.conf主配置文件/usr/sbin/vsftpdVsftpd的主程序/etc/rc.d/init.d/vsftpd启动脚本/etc/pam.d/vsftpdPAM认证文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户)/etc/vsftpd/ftpusers禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对
在使用mysql的客户端之后,手动输入语句的机会减少太多,比如mysql的alter语句竟然想不起来怎么用了,于是重新学习一下。alter是用来修改表结构的语句。既然是修改,那么可分为增加,修改,删除这几种。大致的操作如下ALTER TABLE 表名称 操作(ADD|DROP|CHANGE|RENAME) 操作内容列操作相关1.增加列ALTER TABLE table_name ADD new_column_name VARCHAR(255) NOT NULL2.删除列ALTER TABLE table_name DROP a_column3.修改列ALTER TABLE table_name
赞赏微信赞赏
支付宝赞赏