我们可能有了解过万维网超文本传输协议,其中会有大概四层的分类,下面主要是来了解一下传输层中的tcp udp协议,那么你们知道tcp udp数据包长度限制是指什么吗?
首先我们一起来分别看看tcp和udp有关数据包的限制问题。
tcp:数据收发的操作是从应用程序调用write将要发送的数据交给协议栈开始的。
首先呢,协议栈并不关心应用程序传来的数据会是什么样的内容。应用程序在调用write的时候会指定发送数据的长度,其实在协议栈看来,要发送的数据其实就是一定长度的二进制字节序列。其次呢,协议栈并不是说一收到数据就马上发送出去的,而是会将数据存放在内部的发送缓冲区里面,并且等待应用程序的下一段数据,因为在发送大量的小包就会导致网络效率的下降,这样的话,需要在数据积累到一定量的时候再发送出去,这个时候就会产出我们会常遇到的问题(粘包)那么至于要积累多少数据才能发送呢?那第一个判断要素就是每个网络包能容纳的数据长度,协议栈其实会根据一个叫作MTU的参数来进行判断。
MTU:一个网络包的最大长度,是以太网中一般为1500个字节。MSS:在除去头部之后,一个网络包所能容纳的tcp数据的最大长度。tcp和IP的头部加起来一般会是40个字节,因此MTU减去这个长度就是MSS,就是1460。另一个判断要素就是时间,暂时就不讨论了。然而IP包的最大长度为65535个字节,其实从理论上来说,tcp的数据包大小只要小于IP的载荷能力就可以了,IP头20B,tcp包头20B,其实最大负载为65535- 20-20=65495字节,然而以太网层MTU为1500个字节,此时超过了以太网和通信线路的最大传输长度,因此需要让IP模块使用分片功能拆分之后再传输,接收端的ip模块在进行组合,发生组包错误时,该包就会被重传,用来保证可靠传输。所以为了避免ip模块分片再组合发送的错误影响传输效率,那么为了达到最佳的传输效能,最好是避免在ip模块分片,因此客户端的tcp数据包一般小于MSS1460。
udp:可发送的数据最大长度是 IP包的最大长度减去IP头部和udp头部的长度。但是,这个长度与 MTU、MSS 却不是一个层面上的概念。
MTU和MSS是基于以太网和通信线路上网络包的最大长度来计算的,然而IP包的最大长度是由IP头部中的“全长”字段去决定的。“全长”字段的长度是16比特,这样说来从 IP协议规范来看,IP包的最大长度为65 535个字节,再减去IP头部和UDP头部的长度,就是udp协议所能发送的数据最大长度。如果说不去考虑可以选择字段的话,一般来说IP头部为20个字节,udp头部为8个字节,因此udp的最大数据长度是 65507个字节。当然了,这么长的数据其实已经超过了以太网和通信线路的最大传输长度,因此的话需要让 IP模块使用分片功能拆分之后再去传输。分片有时候会带来组包错误,这样的话udp的包长度最好不要超过MTU值,一般不建议超过1K。
那么以上及是有关tcp udp数据包长度限制的所有内容了,如果还想了解java一些知识问答,关注本站消息即可哦。