您的当前位置:首页正文

哪些因素决定TCP网络Segment的大小

来源:花图问答

1.问题描述

这段时间在分析直播APP的RTMP协议推流的Chunksize的值的大小,为了能达到一个最优的值,进行了抓包分析,用wireshark抓包分析的时候发现,不管chunksize设置有多大,每次抓包抓到的数据最大都是1200字节,所以就很奇怪,是不是TCP/IP协议在传输时有其他的限制。

2.问题分析

通过网上查找资料,首先回顾一个叫MTU和MSS的概念,这个以前在网络基础课里面学过,不过有些忘了。

MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小

这里MTU的来源是指以太网传输每次的最大传输长度是1518字节,去掉以太网的头部+尾部一共18字节,所以,以太网能承载的最多是1500字节。这就是MTU的值。再去掉IP首部20字节,TCP首部最小20字节,那么TCP能传输的最多就是1460字节。所以也可以说TCP的MTU是1460。

MSS:是TCP网络三次握手时客户端和服务端互相发送协商出来的一个值,是作为TCP传输时承载的最大长度,那么这个值<=MTU的。所以MSS是限制TCP网络的segment值的一个因素。在RTMP推流过程中,通过抓最开始的TCP握手包就发现,客户端发送给服务端的TCP包的MSS是1460,但服务端回给客户端的是1200,那最终协商的是以较小值为准,1200。这就能解释为啥每次抓包的数据都是1200了。

但除了上面的MSS决定TCP的segment大小以外,还有一个参数也决定了,就是TCP的发送窗口的大小。如果执行下面的代码

int sendbuf = 128;
int len = sizeof(sendbuf);

//设置发送缓冲区大小
setsockopt(socketFd, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof(sendbuf));

SOCKET设置SO_SNDBUF这个参数,那就TCP的segment最大值就是128了。

3.结论

决定TCP每次发送的Segment的最大值是由两个值来决定的MSSSO_SNDBUF