欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MTU(2) 进阶/思考

程序员文章站 2024-03-24 22:27:34
...

MTU(2) 进阶/思考


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);