前言
在前面手撕tcp/udp的部分中,我们收发的消息全部都是一个string;但在我们的日常中,收发的消息并没有如此单一,就比如我给小明发一条微信,发送的消息里就包含着文字,头像框等。所以多元化的消息的收发是如何实现的呢?答案是序列化/反序列化+协议定制。下面牢蒯将带领大家搞懂这一切。
一.序列化/反序列化,与协议
所谓的协议定制,本质其实就是在定制双方(server和client)都能认识的,符合通信和业务需要的结构化数据。所谓的结构化数据,其实就是struct 或者 class。
注意一点!message属于协议的子集,并不完全等同于协议!
struct message 只是协议里定义的数据结构(报文格式);
完整通信协议 = 报文结构 + 序列化/反序列化规则 + 分包规则(长度前缀/分隔符) + 字节序约定 + 校验、错误处理等。
所以它确实只是协议的一个子集。
发送数据时将这个结构体按照⼀个规则转换成字符串,这叫序列化;接收到数据的时候再按照相同的规则把字 符串转化回结构体,这叫反序列化。
那么我们传输message时,是否可以不进行序列化/反序列化,直接将message这个结构体转成二进制进行传输呢?
答案是可以的,但是不推荐,因为虽然s端和c端网络部分的代码是一样的,但是它们所属的操作系统不一样,因而内存对齐的方式也不一样,这就会导致在重构message对象时,出现很大的差异。
二.再度理解read,write,recv,send和tcp为何支持全双工
1.read/write并非将数据写入网络/从网络读取数据,而是与缓冲区间进行数据拷贝操作!
2.主机间通信的本质:将发送方发送缓冲区的数据,拷贝到接收方的接受缓冲区里。
整个拷贝的流程是:
3.之所以支持全双工,是因为接收消息的双方主机均含有一对独立的发送缓冲区和接受缓冲区(同一对的两个缓冲区之间相互独立,互不干扰)。