传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
我的服务器开发选用32位的CRC校验来检验数据是否有误,CRC校验原理就不过多介绍。
CRC校验代码#include运行结果#include using namespace std; typedef unsigned int uint; uint POLYNOMIAL = 0xEDB88320; int have_table = 0; double pi = 3.14159265359; uint table[256];//CRC校验码表 //⽣成table void make_table() { int i, j, crc; have_table = 1; for (i = 0; i < 256; i++) for (j = 0, table[i] = i; j < 8; j++) table[i] = (table[i] >> 1) ^ ((table[i] & 1) ? POLYNOMIAL : 0); } //校验 uint crc32(uint crc, char* buff, int len) { if (!have_table) make_table(); crc = ~crc; for (int i = 0; i < len; i++) crc = (crc >> 8) ^ table[(crc ^ buff[i]) & 0xff]; return ~crc; } int main() { uint crc; char buf[20] = { "adecs" }; cout << hex << crc32(crc, buf, strlen(buf)) << endl; printf("%08Xn", crc32(crc, buf, strlen(buf))); return 0; }
CRC校验码会因为buf数据的不同而变化,如果在传输过程中,数据有变化,则发送端和接收端的校验码会有差异,以此来检查数据在传输过程中是否有损坏。
如果有需要详细代码,可以下载以下资源
(48条消息) CRC-32,CRC-8校验c++实现.pdf-C++文档类资源-CSDN文库



