关于HTTP
http的模型就是C/S模型,对数据的处理就是客户端发送申请,服务器接收申请进行响应的过程。因此本质上他是个半双工的、且通信只能由客户端发起的一种通信方式;
关于tcp粘包
一般有两种方式:一种是定义分隔符;一种是定义包头,通过包头的长度来进行边界确认。包头的话,一般包头的数据格式直接定义成为一个固定格式,在保证包头的数据格式正确的基础之上保证整体的http数据完整;
关于Http、WebSocket和Tcp
这三个协议,首先就是Http和Tcp,这两个协议一个是应用层的,一个是传输层的,一直是比较纠结的是Http明明是基于Tcp的应用层协议,然后资料上又说Http的交互只能是由客户端主动发起,服务器端进行响应这种模式;且Tcp又是可以进行全双工数据通信的,也没有Http的这种限制,为什么Http反而有了这种限制?无他,是因为协议,如果说确定一种仅仅是有限范围人群使用的通信方式的话,那么基于Tcp的通信方式是完全可以自由定义的,但是一旦是一个所有互联网人群需要遵循的话,就需要每个人都遵守这种规则,也就是Http协议,Http协议规定了客户端发起、服务器端响应的通信模型,在实现Http的时候就要遵守这个规则,否则就是无法正常通信的;
那么为什么Http定义这种模型,这就和服务器承担的职责有关了,服务器需要为全网络的人群提供服务,不可能会一直为某个客户端保持连接,他要尽可能多的为浏览器提供服务,因此就有了这种模型;
而有的浏览器需要保持长连接的功能,于是就有了WebSocket协议,至于为什么不直接使用Tcp,Tcp只是一种数据通信方式,并没有数据结构,纯粹的数据是没有意义的,本质上WebSocket就是基于Tcp的应用层协议;至于为什么WebSocket要间接的使用Http的格式来进行握手,原因就是Http已经是成熟的协议了,间接握手看起来是比较复杂的,但是重用了Http整体上看却是比较简单的。
当然,如果说是有限范围人员定义了一个协议,那这个协议完全就充当了应用层角色,tcp本质上就是个通信手段,这时候也就没http和websocket什么事了。
关于base64
base64本质上是为了缩减传输信息的一种数据压缩算法。就是二进制文件的64进制显示,且这个64进制可以用显示字符进行表示。比如要传输一个二进制文件,如果是直接以二进制的形式传输,那么3Byte数据就要24个字符传输,而使用64进制,那么只需要4个字符,至于为什么不直接使用ASCII码,因为ASCII码中有很多是控制字符,并不是可打印字符(可打印字符为95个),因此有了base64;
阻塞读取与非阻塞读取
不论是http还是weosocket,本质上的通讯都是tcp,首先要处理的就是如何针对tcp这样的流式数据提取http或websocket数据结构,在读取的时候有两种方式,一种是阻塞性的,一种是非阻塞性的;
主机在进行tcp数据收发的过程中有两个阶段,本质上就是内核关于套接字的缓冲区,需要将用户区数据进行收发的时候,首先使用系统调用将数据复制到内核的套接字缓冲区,接着由内核网络驱动完成数据收发,这个过程中如果使用了阻塞收发的话,在处理一个连接的时候就要等到数据完全读取或者完全发送完毕才能继续之后的连接操作,如果遇到一个大数据量的数据交互,等待网络发送完毕的过程中就会有服务器卡顿的问题,因此一般需要使用非阻塞操作,相应的程序复杂度也有一定程度的提升。
在使用非阻塞操作的时候,对于读取而言,需要对流式信息进行数据提取,且Http的属性是没有严格顺序的,每个消息头属性的结束为\r\n;整个消息头结束的时候会有一行空白行,即没有信息,一行中只有\r\n;通过这个规则可以提取出消息头,然后根据消息头的信息再去提取消息体的数据。
关于Web中一个新的协议的增加
首先,Web开发过程中,通信双方为服务器端与客户端;一个新的协议的增加并不是说直接在服务器端增加相应功能就可以了,他还需要浏览器的支持;
Web开发,就协议而言,就和一个本地程序开发一样,本地程序开发是面向编译器编程,Web开发是面向浏览器编程,尽管有协议规定,但个人认为还是要依据实际情况进行协议应用。
关于WebSocket为什么要有个FIN bit标志位
为了满足多帧的需求,当信息只需要单帧即可的时候,设置FIN;如果需要多帧传输,那么前面的所有帧FIN位设值为0,最后一帧设置为1,用来标识结束帧。
关于SHA1函数
SHA1函数在openssl中有支持,但是安装的时候要留意一下除了安装openssl之外,还需要安装openssl-dev,否则是没有对应的函数库的,如果用的是vscode,重启一下vscode就可以正常使用了。
sizeof和strlen的区别;
sizeof的话获取的是存储字符串的空间大小,strlen获取的是字符串的长度,比较容易失误的地方是在获取一个字符串常量长度的时候,使用sizeof会比strlen大一个Byte ( ‘\0’ ) ;
websocket协议格式
websocket协议帧捕获:可以通过百度WebSocket在线测试进行数据帧进行websocket帧测试;
webscoket如何验证客户端合法
通过http进行握手,握手完毕后正常的话说明对应服务器支持websocket通信,然后就可以按照上述的数据帧进行Websocket通信,
websocket明文与密文如何传输
基于上面的MASK flag进行标志
websocket如何断开
设置opcode那4个bit为0x8进行连接关闭