网络通讯实战
- socket:可理解为四元组关联的一个数字,具有唯一性,socket在unix上是一个文件描述符
- 发包:
- 包头结构:
- 报文总长度Len:包头+包体
- 消息类型:这个包需要用服务器的哪个函数处理。(服务器端有个(函数名:消息码)向量)
- crc32校验码:确保数据包的数据没有被修改过
-
ccrc32类
-
Get_crc():给你一段buff,也就是一段内存,以及内存长度,计算出一个crc32值
-
客户端的包头就有这个crc32的值了 =》 服务器也用同样的算法计算crc32的值(根据包体计算),并和包头的crc32比较
-
有点类似摘要算法
-
-
注意字节对齐问题
-
如客户端发送的数据结构体长度是8字节,结果由于字节对齐问题,服务端收到16字节,包头包体读取混乱
-
采用一字节对齐,不会进行填充。 #pragma pack(1)
-
-
大小端问题:发包时需要本地序转网络序,收包时网络序转本地序。
-
数据分片问题:MTU
-
比如最大1.5k,我要发1M的数据,需拆分成66个包(分片)
-
这66个分片可能走的网络路径都不一样,每个分片可能被再次分片(不过TCP本身会处理这个问题)
-
-
send():
-
只负责发送到 发送缓存区
-
while循环发送:比如我想发1000个字节,发送缓存区满了,只发了100字节,那么就得while循环发送
-
- 包头结构:
-
收包:
-
先收包头
-
如果包头没收完,只收了5字节,那我需要一个指针,指向后半部分包头的存储位置 buff[8],*precvbuf
-
我们要求,客户端连接后,有义务主动给服务器发包,服务器接收包头+包体,并在前面加一个消息头 (如是否过期、连接池中的序号)
-
内存攻击:消息头+包头+包体需要重新 new 内存,如果我想攻击你,我发个包头,将Len设为2000字节。这块内存需要在断开连接后,自己释放。=》但不是有MTU吗?呃,难道MTU无心之中解决了这个问题。。。
-
-
收包体ÿ
-