MTU(2) 进阶/思考
程序员文章站
2024-03-24 22:27:34
...
MTU 和 MSS
https://blog.csdn.net/lqy971966/article/details/103831538
1. 问题:
做某个项目时,进行间通信时候出现了一个 MTU 的问题。
我之前设置发消息最大值是8192U减去消息头,当发要送消息大于8192的时候,就发送8192,不大于就发送小于8192的部分。
但是因为底层 MTU 大小的限制 1480.导致消息分片。第一个分片有消息头,但是后面由于截断了。没有了消息头。
接收端就无法通过消息头判断消息类型,大小。(消息封装之前是这么封装的)
结果就是: 后续报文接收失败。
2. 原因:
因为对方每收到一个消息都会检查消息头里面的信息MSG_SOCK_SEND_MSG_S,进行消息长度检查,然后再提取消息内容。
但是,因为MTU得限制,导致第一个包后续的包都没有了消息头,只有消息内容,导致消息传递失败。
typedef struct tagMsgSockSendMsg
{
UINT uiFragID; /* 分片ID */
UINT uiFragOffset; /* 偏移 */
UINT uiFragDataLen; /* 分片数据长度 */
UINT uiDataLen; /* 数据总长度 */
}MSG_SOCK_SEND_MSG_S;
3. 解决:
将消息减小至 1024即可。
socket底层进行mtu分片 1480
//#define MSG_SOCK_MAX_LEN 8192U
#define MSG_SOCK_MAX_LEN 1024U
uiSendDataLenMax = MSG_SOCK_MAX_LEN - sizeof(MSG_SOCK_SEND_MSG_S);