quic如何做路径mtu探测的

3 篇文章 1 订阅

路径mtu探测在基于udp的程序中很有用,如果大了,会引起ip层分片,导致容易丢包。小了,网络利用率不高。

quic做mtu探测是根据,可以设置ip层包不分片来做的。如果超过了mtu大小会丢失。

所有工作是在定时器里做的,封装为ping包

while(condition){
    send  current_mtu_pkg_size   //定时器做的
    
    if(error)
        break;

    收到,更新
    max_mtu_pkg_acked_size;  //这个就是当前最大的pmtu

    current_mtu_pkg_size  增加

    if(timeout)
        break;
}

另外附上设置ip包头DF位代码

int UDPSocketPosix::SetDoNotFragment() {
    DCHECK_NE(socket_, kInvalidSocket);
    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);

#if !defined(IP_PMTUDISC_DO)
        return ERR_NOT_IMPLEMENTED;
 #else
    if (addr_family_ == AF_INET6) {
    int val = IPV6_PMTUDISC_DO;
    if (setsockopt(socket_, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &val,
        sizeof(val)) != 0) {
        return MapSystemError(errno);
    }

    int v6_only = false;
    socklen_t v6_only_len = sizeof(v6_only);
    if (getsockopt(socket_, IPPROTO_IPV6, IPV6_V6ONLY, &v6_only,
        &v6_only_len) != 0) {
    return MapSystemError(errno);
    }

    if (v6_only)
        return OK;
    }

    int val = IP_PMTUDISC_DO;
    int rv = setsockopt(socket_, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));
    return rv == 0 ? OK : MapSystemError(errno);
    #endif
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前进的蜗牛啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值