kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp

WebSocket协议

https://zhuanlan.zhihu.com/p/145628937

概念

WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议。

WebSocket 是双向通讯,有状态,客户端一(多)个与服务端一(多)双向实时响应(客户端 ⇄ 服务端)。

WebSocket 是应用在浏览器的 Socket (是 Socket 模型接口的实现),Socket 是一个网络通信接口 (通信规范)。

WebSocket协议端口是80。

WebSocket SSL协议端口是443。

Socket是TCP/IP协议的网络数据通讯接口(一种底层的通讯的方式)。

Socket是IP地址和端口号的组合。例如:192.168.1.100:8080。

版本

RFC 6455 规范 是大多数浏览器实现的 WebSocket API 协议。

工作原理

  1. 用户打开Web浏览器,并访问Web站点。

  2. Web浏览器(客户端)与Web服务端建立连接。

  3. Web浏览器(客户端)能定时收发Web服务端数据,Web服务端也能定时收发Web浏览器数据。

WebSocket协议不受同源策略影响。

请求消息体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 请求头部分
# [请求方式] [资源路径] [版本]
GET /xxx HTTP/1.1
# 主机。
Host: server.example.com
# 协议升级。
Upgrade: websocket
# 连接状态。
Connection: Upgrade
# websocket客户端生成的随机字符。
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
# websocket协议的子协议,自定义字符,可以理解为频道。
Sec-WebSocket-Protocol: chat, superchat
# websocket协议的版本是13。
Sec-WebSocket-Version: 13

响应消息体

1
2
3
4
5
6
7
8
9
10
11
# 响应头部分
# [版本] [状态码]
HTTP/1.1 101 Switching Protocols
# 协议升级。
Upgrade: websocket
# 连接状态。
Connection: Upgrade
# WebSocket服务端根据Sec-WebSocket-Key生成的随机字符。
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
# WebSocket协议的子协议,自定义字符,可以理解为频道。
Sec-WebSocket-Protocol: chat

Upgrade字段仅限HTTP/1.1版本协议,不适合HTTP/2.0版本协议。

101 Switching Protocols 是HTTP协议状态码,不是websocket协议状态码。

状态码

连接成功状态码

101:HTTP协议切换为WebSocket协议。

连接关闭状态码

1000:正常断开连接。

1001:服务器断开连接。

1002:websocket协议错误。

1003:客户端接受了不支持数据格式(只允许接受文本消息,不允许接受二进制数据,是客户端限制不接受二进制数据,而不是websocket协议不支持二进制数据)。

1006:异常关闭。

1007:客户端接受了无效数据格式(文本消息编码不是utf-8)。

1009:传输数据量过大。

1010:客户端终止连接。

1011:服务器终止连接。

1012:服务端正在重新启动。

1013:服务端临时终止。

1014:通过网关或代理请求服务器,服务器无法及时响应。

1015:TLS握手失败。

连接关闭状态码是WebSocket对象的onclose属性返回的。

其他状态码不常用,所以就不列举说明。


server.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#coding:utf-8
import socket
addr = ('192.168.8.107', 88)
fd = socket.socket()
fd.bind(addr)
fd.listen(5)
while True:
	conn,addr = fd.accept()
	rcv = conn.recv(4096)
	rarr = rcv.split('\r\n\r\n', -1)
	if len(rarr) != 0:
		print(rarr[0])
		#file_data = rarr[1]
		status = "HTTP/1.1 101 Switching Protocols\r\n"
		headers = "Upgrade: websocket\r\nConnection: Upgrade\r\nDate: Sat, 1 Mar 2021 12:33:44 GMT\r\nContent-Type: text/plain\r\nPragma:no-cache\r\n\r\n"
		send_data = status + headers
		conn.send(bytes(send_data))
		while True :
			rcv = conn.recv(100)
			print(rcv)
			conn.send("jjjjjj" + rcv)
	conn.close()

client.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#coding:utf-8
import socket
import time
addr = ('192.168.8.107', 88)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
	ret = s.connect(addr)
except socket.error as msg:
	print (msg)
print (ret)
strs="GET /test.txt HTTP/1.1\r\nHost:test.com\r\nUpgrade: websocket\r\nConnection: Upgrade\r\n\r\n"
tt = s.send(strs)
print (tt)
while True:
	rstrs="kkkkkkkkkkkkkkkkk"
	s.send(bytes(rstrs))
	time.sleep(1)
	t=s.recv(100)
	print (t)
s.close()

强制保存只读类型文件的方法

https://www.jb51.net/article/102265.htm

底行命令模式执行:

1
2
3
4
5
6
:w !sudo tee %

w 表示保存文件
! 表示执行外部命令
tee linux命令,这个有点复杂,可以查看linux命令帮助
% 在执行外部命令时,%会扩展成当前文件名;这个%区别于替换时的%,替换时%的意义是代表整个文件,而不是文件名

上述方式非常完美的解决了不能保存只读文件的问题,但毕竟命令还是有些长,为了避免每次输入一长串的命令,可以将它映射为一个简单的命令加到 .vimrc 中:

1
2
" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %

这样,简单的运行:w!!即可。命令后半部分> /dev/null作用为显式的丢掉标准输出的内容。

vim高亮查找

https://www.cnblogs.com/students/p/8808524.html

用vim时,想高亮显示一个单词并查找的方发,将光标移动到所找单词.

1
2
3
4
5
1: shift + "*"  向下查找并高亮显示

2: shift + "#"  向上查找并高亮显示

3: "g" + "d"    高亮显示光标所属单词,"n" 查找!

DES 3DES AES Blowfish 对称加密算法比较

https://blog.csdn.net/nightelve/article/details/16865773

随着数据安全性要求的日益提升,我们越发需要将数据进行加密。在接下来的内容里,我将对比一些常用的对称加密算法:DES(Data Encryption),3DES(Triple DES),AES(Advanced Encryption Standard)以及Blowfish(效能最高)。

介绍

计算机加密技术分为对称加密,及非对称加密两种技术.

对称加密技术基本的实现是:数据发送方和数据接收方共享一个密钥,进行数据加密和解密工作。但是他也有个问题,就是一旦密钥被第三方获取,数据安全性就无法保证。

非对称加密技术中,数据发送方和接收方利用不同的密钥进行数据加密及解密工作。简言之,就是密钥1只能被用来加密数据,与此同时,密钥2用来解密数据。然而这种加密技术容易导致被人利用,通过频繁更新密钥进行攻击。所以说,我们需要把这两种算法结合使用,来构建一个更加强健的加密技术。

下面将对比DES (数据加密标准), 3DES (三重DES), AES (高级加密标准) and Blowfish(河豚鱼)这几种数据加密技术.

DES

数据加密标准是IBM提出的,第一个基于Lucifer算法的加密技术。作为第一个加密标准,自然会带有些许瑕疵漏洞使其不是特别的安全。

3DES

三重DES是DES的加强版,提供了DES的三重安全性。他和DES使用同样的算法,只是做了三次加密来提升安全级别。

AES

高级加密标准是由美国国家标准技术研究院(NIST)提出的,旨在取代DES加密技术。(作者所知道的)针对AES唯一的破解方式就是暴力破解。

Blowfish

Blowfish由Bruce Schneier发明的一种在世界范围被广泛使用的加密方式。Blowfish使用16到448位不同长度的密钥对数据进行16次加密。这样黑客们基本不可能对其进行解密。直到现在(作者发文时),还没有针对blowfish的破解(B. Schneier)

效能对比

根据对比结果,我们发现AES和Blowfish遥遥领先于其他几种加密方式。

底下是一组针对大约256MB尺寸数据进行加密的测试(此测试在Windows XP SP1操作系统,P4 2.1GHz CPU):

ctags使用

1
--exclude[=pattern] :将模式pattern指定的文件/文件夹添加到排除列表中。可使用任意次。

https://blog.csdn.net/foreverling/article/details/80329586

1 查看ctags支持的语言

1
ctags --list-languages

2 查看语言和扩展名的对应关系

1
ctags --list-maps

3 查看ctags可以识别和记录的语法元素

1
ctags --list-kinds

单独查看可以识别的C++的语法元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[chuxing@hostname ~]$ ctags --list-kinds=c++
c  classes
d  macro definitions
e  enumerators (values inside an enumeration)
f  function definitions
g  enumeration names
l  local variables [off]
m  class, struct, and union members
n  namespaces
p  function prototypes [off]
s  structure names
t  typedefs
u  union names
v  variable definitions
x  external and forward variable declarations [off]

4 对当前目录下所有ctags支持的语言格式文件生成tags

1
ctags -R *

缺点很明显,tags会非常大,tags生成会非常慢,而且代码跳转会卡顿。

5 只对特定文件生成tags

1
ctags `find -name "*.h"`

6 使用tags

6.1 tag命令

用于跳转到指定的tag。例如:tag tagname 使用这个命令可以跳转到tagname的定义处,即使它在另一个文件中。

6.2 快捷键Ctrl+] 取出当前光标下的word作为tag的名字并进行跳转。

6.3 tags命令 列出曾经访问过的tag的列表

6.4 快捷键Ctrl+T 跳转到前一次的tag处。

6.5 stag命令 stag tagname 分割当前窗口,并且跳转到指定的tag。

6.6 快捷键Ctrl+W+] 分割当前窗口,并且跳转到光标下的tag。

6.7 同名tag, 如果存在多个同名的tag,tag命令会给出一个tag的列表,可以通过键入tag的序号来选择tag;也可以通过tselect来过滤tag,如::tselect tagname

如果要在多个tag间移动,可以使用如下命令:

1
2
3
4
:tfirst             go to first match
:[count]tprevious   go to [count] previous match
:[count]tnext       go to [count] next match
:tlast              go to last match

如果没有指定[count],默认是1。

7 其他

如果是多个tags文件,可以通过设置tags选项来引入更多的tags文件。例如: :set tags=./tags, ./../tags, ./*/tags

使用tag命令时,可以输入部分tag名,然后使用Tab键进行补全。