go-server 一个在学习中形成的socket服务
https://blog.csdn.net/zboyco/article/details/104314488
golang socket 实现分析(一)
https://www.cnblogs.com/zongjiang/p/6569342.html
//发起连接请求
func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time, cancel <-chan struct{}) error {
switch err := connectFunc(fd.sysfd, ra); err {
//异常处理
....
}
}
打造一款属于自己的go语言socket框
https://blog.csdn.net/try_mistake/article/details/82344022
https://blog.csdn.net/try_mistake/article/details/82344087
当然想要打造一款socket框架,这么点是完全不够的!
一款完善的socket框架包括有:
- 分包处理
- 协议封装
- 框架路由
- session管理
go socket Fd family
tcp例子
https://www.cnblogs.com/yin5th/p/9274495.html
client连接强制断开,未释放socket。client过一段时间time_wait就消失了。
而server报错:read from connect failed, err: EOF。此时server连接已经被释放.
关于字节序
https://blog.csdn.net/aslackers/article/details/78742491
Go中处理大小端序的代码位于 encoding/binary
,包中的全局变量BigEndian用于操作大端序数据,LittleEndian用于操作小端序数据,这两个变量所对应的数据类型都实行了ByteOrder接口:
crc校验
https://blog.csdn.net/xlhcgd/article/details/44980005
sendCrc := crc32.ChecksumIEEE(sendBytes)
socket传送二进制流的一些总结
https://www.cnblogs.com/zhugaopeng/p/9688882.html
心跳包
客户端和服务器之间会有定时心跳检测连接的存活,默认30s来一次。tcp的关闭是通过FIN包来通知对方的,如果因为网络问题,对方连FIN包都收不到,那么即使一边关闭了套接字,另一边可能还以为连接正常。所以心跳检测存活机制在长连接应用里非常普遍。如果客户端连续发了三次心跳都没有收到服务器的回复,那么就认为连接已经关闭。服务器也会有连接存活检测,如果一个客户端连接90s内没有任何消息进来,那么也认为该连接已经断开。服务器不会主动发送心跳消息。
解决这个问题的办法是保活。服务端发送心跳包,客户端接受到之后进行回应。客户端告诉服务器,还在线,不要断开连接。如果客户端长时间没有回应,服务器断开与此客户端的连接,减少资源占用。
3. 提高二进制流的传输效率
直接传输二进制流不是一个高效的行为,也不是一个安全的行为。直接发送一个二进制流很容易被截获,从而导致信息泄露。
提高二进制流传输效率的办法就是加密压缩再发送。服务器加密压缩,客户端解密解压缩。可采取两种方式:
1)整体压缩,分段发送
2)分段压缩,分段发送
要求不是很高的话,采取方式一比较好。简单粗暴。。
, 利用OpenSSL库对Socket传输进行安全加密(RSA+AES)
// 1. 利用RSA安全传输AES生成密钥所需的Seed(32字节)
// 2. 利用AES_encrypt/AES_decrypt对Socket上面的业务数据进行AES加密/解密 //
// * 理论上只需要AES就能保证全部流程,但由于AES加密所需要的AES-KEY是一个结构 // * 这个一个结构,如果通过网络进行传输,就需要对它进行网络编码,OpenSSL里面没有现成的API // * 所以就引入RSA来完成首次安全的传输,保证Seed不会被窃听 // * 同样,只使用RSA也能完成全部流程,但由于RSA的处理效率比AES低, // * 所以在业务数据 传输加密上还是使用AES // ---