网络通信协议设计

发布时间 2023-07-22 10:37:01作者: Alpha205

《网络通信协议》

1. 背景

  在计算机体系中,存在着很多的网络通信协议;通信协议的实际上就是一段数据,通信双方按照提前约定的规则去进行编码解码,达到传输数据的目的;例如,TCP/IP是目前计算机设备最常用的通信协议;TCP/IP实际上是一个协议族,包含一组协议,其中靠近应用层且最常用的协议是TCP和UDP。

  TCP是流式协议,即协议的内容是流水一样的字节流,内容与内容之间没有明确的分解标志,需要人为的给这些内容划分边界;例如,A与B进行TCP通讯,A发送两个数据包给B,大小分别为100个字节,200个字节,对于A来说,作为发送方,是知道如何划分这两个数据包的界限的,但是对于B来说,可能一次,或者多次受到A发送的数据包,例如先收到50字节,后受到250字节,或者先收到200字节,后收到100字节,因此B是无法知道应该将受到的多少个字节的数据包作为一个有效的数据包;而规定每次将多少个字节作为有效的数据包,就是协议格式需要定义的内容;

一个简单的例子:

// 发送端发送数据
char buf[] = "the quick brown fox jump over a lazy dog";
int sendBytes = send(socket, buf, strlen(buf), 0);
char recvBuf[50] = {0};
int recvBytes = recv(socket, recvBuf, 50, 0);
printf("recevice content: %s\n", recvBuf);

上述的简单代码在本机上一般会执行的比较好,接收端会如期打印出发送端发送的内容;但是这样的代码在局域网或者公网环境下会出问题,接收端打印出的内容可能不完整,或者出现乱码,不完整是因为发送端可能分多次发送数据,导致接收端接收不完整的情况下进行数据打印;乱码出现的原因为,接收端不仅接收到了完整的字符串内容,还接受到了下一个字符串的部分内容;这就导致接收缓冲区被填满,在printf的时候知道碰到"\0"才结束,导致内存越界

2. 粘包问题

  在进行网络通信时,一般会出现粘包,丢包,和包乱序问题;