• 解决tcp 中分包问题


      MTU: Maxitum Transmission Unit 最大传输单元

      MSS: Maxitum Segment Size 最大分段大小

      

      在 Win 系统中,MTU 值默认是 1500。假设我们现在要传输 3000 字节的数据,只需要拆分成 2 个数据包就行了。

      而如果是 ADSL 接入方式,它的 MTU 值是 1492 的话,则 3000 字节的数据需要分为 3 个数据包传送。由于数据包的数量增多了,同时拆包组包都需要额外消耗时间,因此网速变慢也就不  足为奇了

      

    1,首先,我们必须明白什么才是最佳的 MTU 值。

        1)当本地 MTU 值 > 网络 MTU 值,网络会进行拆包,这样一来数据包数量增多,二来也增加了拆包组包的时间

        2)当本地 MTU 值 < 网络 MTU 值,虽然可以直接传输,但是却没有完全利用网络的性能,没有发挥出最大传输能力

    因此,设置最合适的本地 MTU 值,就是要让本地 MTU 值 = 网络 MTU 值。

    那么,怎样才能知道自己的当前网络环境的 MTU 值是多少呢?下面便来介绍测试方法。

    查询MTU

    ②在命令提示符窗口输入以下命令(建议直接复制,以免误将小写字母 l 写为数字 1),回车。

    ping -l 1472 -f www.baidu.com

    这条命令的意思是向 www.baidu.com(百度主页)发送一个探测请求,请求将一个不允许分割的 1472 字节的数据包发送出去。

    ⑥如此这般,通过不断修正数据包的大小,我们可以最终得到当前网络的 MTU 值。比如我这里,测试 1464 通过,但 1465 失败,所以我的网络 MTU 值为 1464。

    在此需要特别说明的是,当我们设置本地 MTU 值,必须牢记要将这个测得的值再加上 28,即 1464+28 = 1492。

    设置MTU

    1、查看自己当前网络的 MTU 值,请命令提示符下输入以下命令并回车:

      netsh interface ipv4 show subinterfaces

    2、要设置你正在使用网络的 MTU 值,请在命令提示符下输入以下命令并回车:

    netsh interface ipv4 set subinterface "需修改的连接名" mtu=值 store=persistent

    其中,需修改的连接名 和 值 要用相应的值来代替。例如,我这里需要输入:

    netsh interface ipv4 set subinterface "WLAN" mtu=1492 store=persistent

    在这里,我已经把要修改的地方用粗体字标出来了。

    另外,请大家注意,修改 MTU 值与查看不同,需要以管理员身份运行命令提示符。


    如果发现上面的不符合自己的要求

    我们首先要了解到,tcp协议中的重传机制,当达到重传次数限制的时候,也会出现分包的现象,这时候,我们就要设置次数的限制。其中windows 默认是5次,liunx 默认是15次。

     主要就是设置上面两个值,

    Windows中,下面注册表中,如果没有就创建

     

  • 相关阅读:
    线程基础之进程,线程,任务
    Jobs深入学习
    Quartz的API简介及Jobs和Trigger介绍
    Quartz入门及简单实现
    maven仓库配置阿里云镜像
    Activiti图表bpmn对应的xml文件
    Activiti流程设计工具
    Activiti的25张表
    subprocess.Popen指令包含中文导致乱码问题解决
    Qt5.9使用QWebEngineView加载网页速度非常慢,问题解决
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/11639889.html
Copyright © 2020-2023  润新知