专栏首页专注网络研发细说TCP的MSS选项(2)

细说TCP的MSS选项(2)

上周因为发烧没办法坚持每“周一”更 —— 再次感叹“每周一更”这个名字,先给大家道声抱歉。

在上一篇细说TCP的MSS选项(1)中给出的了影响MSS的因素:一般都是由出口路由的MTU决定。但这只是TCP的syn报文的情况,今天就要分析syn+ack报文中的MSS的情况。

首先我们做个实验,检测本地的MTU是否会影响到对端的MSS。

  1. 本地的出口网卡MTU默认为1500时,访问www.baidu.com。抓包结果如下:

我本地出口网卡的MTU为1500,减去40,即syn报文中MSS值,1460。 而百度服务器回复syn+ack报文的mss为1400。

  1. 使用ifconfig设置本地网卡的MTU为1000时,再次访问www.baidu.com。抓包结果如下:

我本地出口网卡的MTU为1000,减去40,即syn报文中MSS值,960。 而百度服务器回复syn+ack报文的mss值也为960?!

从这个测试结果看,syn+ack报文的MSS值还要受到syn报文的MSS值影响,可能会取本地计算结果的MSS值和syn报文中的MSS值中的较小值。

为了确定这个结果,让我们从内核源码中寻找答案。函数tcp_make_synack是用于生成syn+ack报文,其中

tcp_mss_clamp用于获得syn+ack报文的mss值。

而tcp_mss_clamp仅是使用user_mss(该TCP套接字配置的MSS选项)与抽口dst的MSS进行对比。只有设置了user_mss,且其值又小于dst的MSS时,才会使用user_mss,否则syn+ack报文就是dst的MSS值——也就是前文中所述,出口路由的MTU-40。

这样分析,syn+ack报文的MSS值,在通常情况下,也是由出口网卡的MTU决定,即MTU-40。那么为什么我修改本地的MTU,会影响到百度服务器的syn+ack报文中的MSS值呢? —— 说实话,我为这个问题困扰了半天,来回的翻看内核的相关代码,担心遗漏了其它情况。但是内核回复syn报文的逻辑还是相对清晰的,从入口函数tcp_v4_conn_request开始,直到tcp_v4_send_synack,只有这个函数与syn+ack的MSS值相关。这时,就要相信自己对代码的分析没有问题。

原始内核产生的syn+ack中的MSS同样只跟出口dst的MTU有关。

为了验证自己的想法,在本地用nc来做个简单的服务端,进行测试。抓包结果如下:

客户端的网卡MTU依然是1000,所以syn报文中的MSS还是960。但是syn+ack报文中的MSS没有变化,仍然是默认MTU1500-40,即1460。通过简单的测试,真相也就大白了。

总结一下:

  1. 标准的内核syn+ack报文中的MSS也是由出口路由的MTU-40;
  2. 目前百度公司对syn+ack的MSS做了自己的修改,会取syn报文的MSS和其实际MSS的较小值;BAT中只有百度做了这个修改,其它互联网公司如sina,sohu也没有做这个修改。
  3. 关于百度对MSS的这个修改,我觉得见仁见智。从RFC中的MSS定义上看,MSS是单向生效的。但一般来说,PMTU的值双向基本相同,所以百度做这个修改,是为了更好的兼容性,保证TCP的双方通信正常。当发现对端有较小的MSS值,本端也做最谨慎的处理,判断PMTU会小于本地的MTU。

专注于网络技术开发,坚持“每周一更”~

本文分享自微信公众号 - LinuxerPub(LinuxerPub),作者:glinuxer

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TCP的MTU Probe和MSS(1)

    在前面两篇文章中,我们研究了在TCP三次握手时MSS选项的值:一般情况下,都是由出口路由的MTU大小决定:MTU-40。也就是说,TCP在握手阶...

    glinuxer
  • Linux数据报文的来龙去脉

    作为网络领域的开发人员,我们经常要与Linux的数据报文打交道,一定要搞清楚数据报文是从何而来,又是如何离去。以前针对这个主题写过一些文章(主要是从源码角度),...

    glinuxer
  • VSZ与RSS

    使用ps命令查看进程的内存使用情况时,有3列输出,分别是%MEM、VSZ和RSS,其中VSZ全称为Virtual Memory Size,RSS...

    glinuxer
  • 病毒分析快速入门(二)--实战QuasarRAT

    样本可从app.any.run获取,使用邮箱免费注册后,便可以下载该沙箱的公开样本

    Gcow安全团队
  • PC 预测编码 论文

    Representation Learning with Contrastive Predictive Coding https://arxiv.org/pdf...

    用户1908973
  • 【译】Chrome的新功能:CSS概述

    这是Chrome中一个实验性的新奇功能,我们可以通过这个能力来获取一个网站上CSS的使用情况——从使用了哪些色值到未使用的声明数量,甚至是已定义的媒体查询总数等...

    腾讯IVWEB团队
  • P2023 [AHOI2009]维护序列

    老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部...

    attack
  • SAP FI/CO 成本中心类型与功能范围

    SAP中成本中心类型(Cost CenterType)和功能范围(Function Area)是两个常见并且容易接触到的概念。这两个概念与费用核算、成本核算、财...

    matinal
  • SAP FI/CO 成本中心类型与功能范围

    SAP中成本中心类型(Cost CenterType)和功能范围(Function Area)是两个常见并且容易接触到的概念。这两个概念与费用核算、成本核算、财...

    matinal
  • 57.Qt-qRegisterMetaType

    在定义信号槽的时候,传递的参数类型如果是自定义类型(自定义class类,或者enum类等),

    张诺谦

扫码关注云+社区

领取腾讯云代金券