kcp icon indicating copy to clipboard operation
kcp copied to clipboard

ikcp_send 在流模式下为何也要限制127个MSS呢?

Open colinsusie opened this issue 1 year ago • 3 comments

阅读源码发现在stream=1的时候,ikcp_send 做数据分段发现如下代码:

	if (len <= (int)kcp->mss) count = 1;
	else count = (len + kcp->mss - 1) / kcp->mss;

	if (count >= (int)IKCP_WND_RCV) return -2;

即使流模式也会限制分段的数量,感觉似乎没必要;这样上层大于127就要自己分成多次调用ikcp_send。 有其他的原因吗?

colinsusie avatar Oct 28 '24 04:10 colinsusie

因为 kcp 不是流式的,窗口需要容纳下一个完整的消息才行。

skywind3000 avatar Oct 29 '24 02:10 skywind3000

@skywind3000 非流模式我能理解,一个完整消息需要在窗口之内。 但流模式的frg似乎一直都是0,每次从KCP接收只返回一个segment。

现在上层发送过大的包也要分成多次调用ikcp_send;而流模式接收的时候并不是按发送多少次就接收多少次,是一个个segment接收。这样在流模式下限制包大小好好像不是很必要?

colinsusie avatar Oct 29 '24 03:10 colinsusie

stream 模式这里或许可以检测发送窗口, 另外这个IKCP_WND_RCV是128,限制大小为mss127,但是协议设计上限制的 mss255

brevin-yoke avatar Feb 25 '25 10:02 brevin-yoke