请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于MTU,IP协议,TCP协议数据包的最大长度问题

老师好。学完TCP,IP,和数据链路层后,我对他们数据包的封装和最大传输长度的关系,以及对于大数据包(大于1500 bytes的数据)他们之间如何分片(packet) 很有兴趣。

首先,MTU长度是1500 (以下单位皆为byte字节),IP最大总长度是60000多,也就是说IP包的数据如果超过1500,就要在网络层进行分片。

然后,我在网上查到 https://www.cnblogs.com/jiangzhaowei/p/9273854.html
网络层分片不像传输层分片那样安全,容易丢包(这也是为什么UDP在传输层对数据报不做分片直接封装到网络层,网络层帮它分片容易丢失,所以UDP并不安全的原因?)
为了解决这个问题,TCP在传输层就给你分好片,也就是说窗口大概在1000左右(建立连接的三次握手的过程中,连接双方会相互通告MSS(Maximum Segment Size,最大报文段长度),MSS一般是MTU—IP首部(20)—TCP首部(20)~ 1460 B,每次发送的TCP数据都不会超过双方MSS的最小值,所以就保证了IP数据报不会超过MTU,避免了IP分片 —— 引自上面的链接),恰好分的和MTU差不多大,这样避免了网络层分片。这样理解正确吗?

但如此一来,如果用TCP传输,整个网络层65000多的最大长度就只塞了1000多Byte长度的数据。既然有那么多富足,并且不鼓励较大数据包在网络层分片,而鼓励传输层分片,那为何还要把IP协议里的最大长度设计的那么大呢?也设计成1500左右不是很好吗?

谢谢老师!!!

正在回答

1回答

很少在问答区看到思考这么深的问题呀,描述得这么认真的问题呀,再加上提问之前也搜索了不少资料,先点赞。

首先要说的是,数据帧的长度,特别是以太网帧的长度,肯定是不能过大的,因为过大的话,在传输过程就容易出错,准确率不高,重复传输影响效率。其次也不能过小,原因就不在展开了。

其次是IP报文的长度,IP报文总长度的字段共16个比特位,可以最大表示65535个字节,这与以太网帧的MTU 1500字节冲突,IP报文必须分包传送。

那为什么IP报文的总长度字段要设置16个比特位呢?这主要是历史原因:

计算机网络是诞生于美国军事基地的,早起的网络仅限于几台计算机互联,在那个时候,传输距离近,再者物理设备精良(军工产业),而传输的数据链路层协议,也不同于现在网络的以太网协议,是可以传输更大长度的数据帧的,事实上数据链路层,有超通道、令牌环等对于我们非常陌生的网络;现在主要存在于网络实验室等等,可以有更大的MTU。可以参考一下这张图。

https://img1.sycdn.imooc.com//szimg/5f0dc32e098ff4a606280351.jpg

希望对你有所帮助,加油!

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信