MTU(2) 进阶/思考

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

猜你喜欢

转载自blog.csdn.net/lqy971966/article/details/108571910
MTU