MSS是Maxitum Segment Size 最大分段大小的缩写,意为TCP数据包每次能够传输的最大数据分段,是TCP协议里面的一个概念。MSS值所表示的是TCP报文的净载荷数据大小。通过设置其大小可以达到与设置MTU值一样的效果,都是为了避免主机发送的数据包大小超过网络链路MTU值而造成数据包被丢弃的情况。但是在实际情况中,该MSS值在TCP协议中实现的时候往往被MTU所代替。其实现原理是:一些TCP实现只有当目的主机在一个非直接连接网络上才发送MSS选项,pc上网或者别的一些tcp连接,PC会与目的地的IP地址,协商一次mss参数,作为自己发送数据包的参考。mss参数就是告诉对端本端最大支持不分片的数据包大小,只含净荷。

在后续的部分中,将会通过一个简单的实验进一步学习理解MTU及TCP-MSS的原理及应用。

1、MTU

先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC。由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes,最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。 小于64Bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于这些小于64Bytes的“碎片”,MAC子层就会在数据字段的后面填充以满足整个数据帧长不小于64字节,以便传输。

为什么以太网规定会规定数据帧长度不小于64字节?

以太网是不可靠的,这就意味着发送者并不知道自己发出的数据对端是否收到,但如果它发出的数据包出现错误,则会进行重传。什么时候会发生错误,发生错误是指什么呢,以太网是如何检测到错误的?

以太网的错误主要是发生碰撞,碰撞是指两台机器同时监听到网络是空闲的,同时发送数据,就会发生碰撞,碰撞对于以太网来说是正常的。非常有名的CSMA/CD就是用来检测冲突的。假设A检测到网络是空闲的,开始发数据包,尽力传输,当数据包还没有到达B时,B也监测到网络是空闲的,开始发数据包,这时就会发生碰撞,B发现发生碰撞,开始发送碰撞信号,所谓碰撞信号,就是连续的01010101或者10101010,十六进制就是55或AA。这个碰撞信号会返回到A,如果碰撞信号到达A时,A还没有发完这个数据包,A就知道这个数据包发生了错误,就会重传这个数据包。但如果碰撞信号会返回到A时,数据包已经发完(在数据包比较短的情况下),则A不会重传这个数据包。

以太网为什么要设计这样的重传机制。首先,以太网不想采用连接机制,因为会降低效率,但他又想有一定的重传机制,因为以太网的重传是微秒级,而传输层的重传,如TCP的重传达到毫秒级,应用层的重传更达到秒级,我们可以看到越底层的重传,速度越快,所以对于以太网错误,以太网必须有重传机制。要保证以太网的重传,必须保证A收到碰撞信号的时候,数据包没有传完,要实现这一要求,A和B之间的距离很关键,也就是说信号在A和B之间传输的来回时间必须控制在一定范围之内。IEEE定义了这个标准,一个碰撞域内,最远的两台机器之间的round-trip time 要小于512bit time.(来回时间小于512位时,所谓位时就是传输一个比特需要的时间)。这也是我们常说的一个碰撞域的直径。

512个位时,也就是64字节的传输时间,如果以太网数据包大于或等于64个字节,就能保证碰撞信号到达A的时候,数据包还没有传完。

再来看一下这个512bit time是如何得来的?

先看一下一个比较古老但流行一时的标准:10BASE5,一种以太网标准,该标准用于使用粗同轴电缆、速度为10Mbps的基带局域网络,在总线型网络中,最远传输距离为500米。网络节点装有收发器,该收发器插在网卡上的15针连接单元接口(Attachment Unit Interface)中,并接到电缆上。也作thick Ethernet,ThickNet,ThickWare。另见coaxial cable,Ethernet,指的是使用标准的(粗)50Ω基带同轴电缆的10Mbit/s的基带以太网规范。它是IEEE802.3基带物理层规范的一部分,在每个网段上的距离限制是500m,整个网络最大跨度为2500m,每个网段最多终端数量为100台,每个工作站距离为2.5m的整数倍。

上面提到的这个碰撞域的来回时间其实就是当时依据10M网络的标准来定义的,10BASE5允许最远的两个工作站间距离2.5公里 ,电子信号在2.5公里來回时间约为51.2us。

根据CSMA/CD,最小封包以51.2us计算和10Mbps计算:51.2us * 10Mbps = 512 bit = 64 byte。

这就是为什么以太网要最小64个字节的历史原因了,一个是基于CSMA/CD的需要,另外一个就是依据了当时10M网络的标准进行了计算和定义。

以太网帧最大不能超过1518bytes,这也是一个规定,但没有上述的这些限制,之所以规定为1518,主要是考虑到传输效率正确率吧。

由于以太网EthernetII最大的数据帧是1518Bytes,这样,除去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC(FCS)校验部分4Bytes。那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。

例 :ICMP包

项目

内容

长度(字节)

备注

Packet Length

1516

数据包总长度

Ethernet Header

Destination

6

目的MAC及源MAC分别为48Bit,分别占6字节

Source:

6

Protocol Type:

2

IP Header

Header Length:

20

IP报头

ICMP

ICMP Type

8

ICMP报头

ICMP Data Area:

1470

ICMP净载荷长度

FCS

4

帧校验序列号

About MTU,TCP-MSS (转)的更多相关文章

  1. IP分片和TCP分片 MTU和MSS(转)

    IP分片和TCP分片 MTU和MSS(转) 访问原文:http://blog.csdn.net/keyouan2008/article/details/5843388 1,MTU(Maximum Tr ...

  2. tcp netstat用法 TIME_WAIT状态解析 MTU以及MSS

    带着问题写博客 问题1:使用netstat查看有源TCP连接的状态时,经常会看到established状态,那么还有哪些状态,这些状态是如何变化的呢? 问题2:TIME_WAIT状态存在的必要? 问题 ...

  3. MTU 和 MSS 关系、 IP分片、TCP分段

    从四层模型:链路层,网络层,传输层,应用层说 一 .以太网V2格式数据帧 : 链路层 Destination   Source  Type  DataAndPad  FCS 6            ...

  4. 在linux内核中修改TCP MSS值

    MTU: Maxitum Transmission Unit 最大传输单元 MSS: Maxitum Segment Size 最大分段大小 MSS最大传输大小的缩写,是TCP协议里面的一个概念.MS ...

  5. pppoe-环境下的mtu和mss

    路由器上在宽带拨号高级设置页面会有设置数据包MTU的页面 数据包MTU(字节):1480 (默认是1480,如非必要,请勿修改) PPPoE/ADSL:1492 ,可以尝试修改为1492 MTU: M ...

  6. 关于ASA的TCP MSS

    About the TCP MSS The TCP maximum segment size (MSS) is the size of the TCP payload before any TCP a ...

  7. TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系 (转载)

    首先说明:数据报的分段和分片确实发生,分段发生在传输层,分片发生在网络层.但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生. 1,MTU( ...

  8. 原 TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系

    首先说明:数据报的分段和分片确实发生,分段发生在传输层,分片发生在网络层.但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生. 1,MTU( ...

  9. 【TCP协议】MTU和MSS详解

    需要注意的是,区别两种帧封装格式:802标准帧和以太网帧 1,在802标准定义的帧格式中,长度字段是指它后续数据的字节长度,但不包括C R C检验码.RFC 1042(IEEE 802) 2,RFC ...

  10. MTU,MSS基本概念

    传输层: 对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515: 对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment ...

随机推荐

  1. android 对View的延时更换内容

    一.当ImageView按下时可以跟换一张按下效果的图片进行显示,使用postDelayed即可以让view在规定时间后执行run()中的内容 img.setImageResource(R.drawa ...

  2. Erlang 从入门到精通(三) 改变工作目录

    对于初学者来书,经常会碰到下面的错误: no such file or directoryerror 提示找不到文件,这时候就需要将文件放到工作目录下,或者直接修改工作目录到文件所在位置. 右键ERl ...

  3. java 线性规划 和lingo 比较

    model:max=13*A+ 23*B; 5*A + 15*B <480 ; 4*A + 4 *B <160 ; 35* A + 20 *B <1190 ; end Variabl ...

  4. python random

    import randoma = random.randrange(0,5)print(a)本来很正常的一段代码,用pycharm就报错,控制台就可以运行,原来random 和自带的random 同名 ...

  5. (转)在MAC上查找和设置$JAVA_HOME

    最近升级了MAC OS,装了JDK7 for mac,在这里下载JDK7 for mac,装完之后发现在默认的路径下找不到JDK7的HOME,如下所示: $ which java /usr/bin/j ...

  6. sql server 分页存储过程

    ----------------------分页存储过程------------------------------------------------------------------------ ...

  7. ajax访问服务器返回json格式

    使用ajax访问服务器返回多条数据,比如返回一个表中的所有数据,页面该如何处理呢?如何获取数据呢?一直不会用ajax返回json格式,今天研究了下,分享给大家~ 首先需要引用服务,点击项目右键,添加引 ...

  8. Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005.

    Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} fai ...

  9. Win7(32bit)下Qt5.5.0和OpenCV2.4.9环境的搭建

    之前一直基于Windows平台(Win 7 32bit)使用VS2010做OpenCV的开发,现在开始学习在Windows 下使用Qt做OpenCV的开发.本文主要讲述Windows平台下(Win 7 ...

  10. Daily Scrum 12.18

    对于老师课上所问为什么燃尽图(图如下)的完成小时数增加的问题,我们的理解是完成小时数是完成迭代2所需要的总共时间,当加入任务的时候,也就是蓝色部分增长的时候,完成小时数就会增加. 今日大家都在做编译实 ...