美文网首页ijkplayer秘籍TCP
哪些因素决定TCP网络Segment的大小

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

作者: e6dcbd6ead6a | 来源:发表于2017-04-22 20:41 被阅读67次

    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

    相关文章

      网友评论

      • 瑾_9235:Alex,您好,我是深圳Insta360的HR,看到您写的一些东西呐,感觉蛮赞的。不知道您最近考不考虑工作机会呢?我们总部在深圳,2014年成立,目前是C轮的状态,公司打造的全景相机品牌目前已经成为VR全景相机领域的全球领跑者,在全球市场的份额占比超过20%,全球出货量第二。已有两年实现盈利,初步计划19年上市。如果您考虑机会希望可以跟我联系

      本文标题:哪些因素决定TCP网络Segment的大小

      本文链接:https://www.haomeiwen.com/subject/zgzszttx.html