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的最大值是由两个值来决定的MSS
和SO_SNDBUF
。