本文部分引用自:https://blog.youkuaiyun.com/q1007729991/article/details/69668576

MSS(Maximum Segment Size)
MSS,最大报文段长度;
在连接建立的时候,即在发送 SYN 段的时候,同时会将 MSS 发送给对方(MSS 选项只能出现在 SYN 段中),告诉对端它期望接收的 TCP 报文段数据部分最大长度;
MSS 保存在 TCP 首部的可选项中,下图中显示 MSS 的值为 1260;

MSS的作用
一般来说,TCP 报文段携带的数据当然是越多越好;
如果 TCP 报文段传输的数据只有一个字节,在 IP 层传输的数据报大小就是 40 + 1 = 41 字节(至少 20 字节的 IP 头 + 20 字节的 TCP 头 + 1 字节数据);这样网络的利用率就只有 1/41; 传输 n 字节的数据利用率就是 n/(n+40),显然 TCP 报文段传输的数据如果越大,网络利用率就越高;
但是实际上并非如此。因为网络传输数据时,数据是最终是要交付到链路层协议上的,也就是说最后要封装成“帧”;
二型以太网(Ethernet Type 2)中规定,帧的大小不能超过 1518 个字节(14 字节的帧头 + 4 字节帧校验和 + 最多 1500 字节数据);
所以 IP 数据报的大小如果超过了 1500 字节,要想交付给链路层就必须进行“分片”;“分片”指的是一个 IP 数据报太大,需要拆分成一个一个的小段,变成多个 IP 数据报;
这种分片显然是不利的,有一定的开销。为了避免分片开销,我们希望 IP 数据报的大小不超过 1500 字节。除去 IP 数据报的首部 20 字节,也就是希望 TCP 报文段不超过 1480 字节。再减去 TCP 报文段首部 20 字节,也就是 TCP 携带的数据不超过 1460 字节;而这个1460就是MSS;

实际上,链路层对这种帧数据长度的限制称为最大传输单元(Maximum Transmission Unit, MTU);不同的链路层协议,对 MTU 的值也有所规定,通常这个值可以进行更改。使用命令 netstat -i 可以看到自己的网卡的 MTU 值;

MTU
MSS 是软件层的概念,它是由软件控制的MTU 是硬件(比如网卡出口)的属性,是指二层链路层帧携带的数据最大大小;每个网卡都有自己的MTU;

再举个例子,MTU 的大小就好像一座桥的承重吨位,而桥就相当于网卡;
事先给定 MSS,可以防止因为你货车载货过多,要进行分批运输;
如果不指定 MSS,一旦你货车超载,吨位超过桥的承重能力,你就得把货拆分成几批运过去,运过去之后你还得组装,这是得不偿失的;

MSS(Maximum Segment Size)是指TCP报文段的最大数据长度,通常在连接建立时通过SYN段告知对方。MSS的目的是避免IP数据报在链路层因超过MTU而进行分片,降低网络效率。理想情况下,TCP报文段数据部分不超过1460字节,以适应大部分链路层协议的1500字节帧限制。MTU是链路层的最大传输单元,不同网络设备可能有不同的MTU值,可以通过`netstat -i`命令查看。
1350

被折叠的 条评论
为什么被折叠?



