一直想把这个流程整理一下。

包结构:

对(datacrc+protoID+dataSize)组成的byte[] 进行crc计算而得到

对(数据内容)进行crc计算而得到

协议号

数据内容的字节长度

数据内容

字段

headcrc

datacrc

protoID

dataSize

data

类型

uint

uint

ushort

ushort

byte[]

字节数

4

4

2

2

dataSize

  1. crc校验

问:TCP协议中,底层做了校验,那通信时我们还有必要再进行有CRC或者其他校验吗?

答:tcp 是可靠的, 就是有重传, 校验, 有序等保证. 在字节流层次, 你不用验证了.

但是协议层可靠不代表应用层可靠, 应用层数据校验只能自己做CRC/MD5/SHA1

因为tcp是基于流的,一个报文可能分多个包发送,你自己要要验证报文的完整性

TCP 的校验只能保证物理电路上如果出错, 可以发现并通过重传来修正. 但是对人为的对包恶意的修改是无法校验的。如果是安全要求比较高的地方, 最好还是自己再校验下.

问:为什么选crc ?

答:CRC(Cyclic Redundancy Check,循环冗余校验)

其校验准确度较之普通的奇偶校验、校验和等方法更高,当然计算也略微复杂;

较之MD5、SHA1等算法,CRC安全性和准确度方面又略显不足,

但计算较之这两者明显简单,效率更高。

所以如果仅仅针对网络数据的一致性校验,即收发端数据的是否一致

(因为在Socket编程里,单次收到数据的长度和发送数据的长度即使在阻塞模式下,也不一定是相同的,这个依赖于网络环境,虽然TCP协议保证了数据的完整性和一致性,但像人为对数据进行了分片的这种情况,在收到数据时视情况还是有必要进行一下校验),

针对这种校验要求,CRC32是明显足够,也不会带来很大的计算负担。

2.加密,解密

介绍:

不可逆加密:md5 ,sha1,加密后就不能解密,只能用于存储密码和校验文件变动,不能用网络通讯

可逆对称加密DES3DESAES

可逆非对称加密 RSA

选定:对称加密:DES  非对称加密:RSA

.net有封装好的,DESCryptoServiceProvider, RSACryptoServiceProvider

流程:

一般流程为:先用非对称加密去加密对称加密的密钥(对称加密的密钥比较短,可视为不怎么耗时,然后再用对称加密去加密数据。

也就是说:

客户端用RSA生成公钥和私钥,发送公钥给服务器,服务器用收的公钥对3DES的key进行加密后,发还给客户端,客户端用私钥进行解密得到3DES的key,之后就可以用此key来进行加密解密。

3.数据内容形式:json, protobuf-net, protobuf-java, pbc, pb-lua-gen, sproto

选定:Client:pbc   Server: protobuf-java (我的服务器是java写的)

文档:网络通讯包结构(crc校验,加解密)的更多相关文章

  1. 2.Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)-

    转自:https://blog.csdn.net/a214919447/article/details/55260411 SOAP(Simple Object Access Protocol,简单对象 ...

  2. 多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

    老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧.确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如.但我一直没有停止过用 ...

  3. Python读取word文档(python-docx包)

    最近想统计word文档中的一些信息,人工统计的话...三天三夜吧 python 不愧是万能语言,发现有一个包叫做 docx,非常好用,具体查看官方文档:https://python-docx.read ...

  4. XML文档部署到Tomcat服务器上总是加载出错

    config.xnl 起初文档路径是在src/Dao/config.xml 在Dao目录下BaseDao类中,解析config.xml文件路径 path="/Dao/config.xml&q ...

  5. 使用JDK中的安全包对数据进行加解密

    本文以使用DES对称加密算法为例使用jdk对数据进行加密解密. 首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部.Provider 可能实现的服 ...

  6. scapy基础-网络数据包结构

    网络层次模型,数据包的组成是学习scapy的基础,下文主要关注模型中各个层次的用途,ethernet II和ip包数据结构.    1.五层模型简介 名称 作用 包含协议 应用层 面向程序对程序的传输 ...

  7. [ Laravel 5.5 文档 ] 官方扩展包 —— 全文搜索解决方案:Laravel Scout

    简介 Laravel Scout 为 Eloquent 模型全文搜索实现提供了简单的.基于驱动的解决方案.通过使用模型观察者,Scout 会自动同步更新模型记录的索引. 目前,Scout 通过 Alg ...

  8. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  9. 【Win10 应用开发】自适应Toast通知的XML文档结构

    老规矩,在开始之前老周先讲个故事. 话说公元2015年7月20日,VS 2015发布.于是,肯定有人会问老周了,C#6有啥新特性,我学不来啊.学不来的话你应该检讨.老周比较保守地计算一下,学会C# 6 ...

随机推荐

  1. Siddhi CEP Window机制

    https://docs.wso2.com/display/CEP400/SiddhiQL+Guide+3.0#SiddhiQLGuide3.0-Window https://docs.wso2.co ...

  2. js 金额格式化

    //格式化金额 function fmoney(s, n) { n = n > 0 && n <= 20 ? n : 2; s = parseFloat((s + &quo ...

  3. show()与showDialog()的区别

    A.WinForm中窗体显示  显示窗体可以有以下2种方法:  Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如下: 1.在 ...

  4. WampServer Mysql配置

    WAMP:Windows下的Apache+Mysql+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件.可点击此处下载WampServer,然后,按照提示安装WAMP.需要说 ...

  5. Gradle 1.12用户指南翻译——第三十章. CodeNarc 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  6. ajax基本原理与案例

    一.什么是Ajax AJAX即“Asynchronous Javascript And XML”( 异步 JavaScript和XML),AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互 ...

  7. python(元组,不可修改序列)

    元组也是序列,区别于列表,它不可更改,语法简单只要加逗号隔开即可 1.1,2,3 (1,2,3) 2.42, (42,) 3.3*(40+2) 126 3*(40+2,) (42,42,42) 4.x ...

  8. kafka快速开始

    Step 1: Download the code Step 2: Start the server Step 3: Create a topic Step 4: Send some messages ...

  9. Go语言基础之变量和常量

    Go语言基础之变量和常量 变量和常量是编程中必不可少的部分,也是很好理解的一部分. 标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名.常量名.函数名等等. Go语 ...

  10. ZeroMQ总结

    Socket types Thread safety: ZeroMQ的socket是非线程安全的,并且ZeroMQ本身不建议在多个线程中传递同一个Socket,即使保证了线程同步.   Socket ...