一个数据包的大小是好多?
程序员文章站
2022-04-21 18:17:34
一个数据包的大小是好多? 1、数据链路层对数据帧的长度都有一个限制,也就是链路层所能承受的最大数据长度,这个值称为最大传输单元,即MTU。以以太网为例,这个值通常是1500字节。2、对于IP数据包来讲,也有一个长度,在IP包头中,以16位来描述IP包的长度,也就是说,一个IP包,最长可能是65535 ......
一个数据包的大小是好多?
1、数据链路层对数据帧的长度都有一个限制,也就是链路层所能承受的最大数据长度,这个值
称为最大传输单元,即mtu。以以太网为例,这个值通常是1500字节。
2、对于ip数据包来讲,也有一个长度,在ip包头中,以16位来描述ip包的长度,也就是说,
一个ip包,最长可能是65535字节。
3、结合以上两个概念,第一个重要的结论就出来了,如果ip包的大小,起过了mtu值,那么就需要
分片,也就是把一个ip包分为多个,这个概念非常容易理解,一个载重5t的卡车,要拉10t的货,它
当然就得分几次来拉了。
4、ip分片是很多资料常讲的内容,但是我倒是觉得分不分片其实不重要,重要的是另一个东西。一个
数据包穿过一个大的网络,它其间会穿过多个网络,每个网络的mtu值是不同的。我们可以设想,如果
接受/发送端都是以太网,它们的mtu都是1500,我们假设发送的时候,数据包会以1500来封装,然而,
不幸的是,传输中有一段x.25网,它的mtu是576,这会发生什么呢?我想,这个才是我们所关心的。
当然,结论是显而易见的,这个数据包会被再次分片,咱开始用火车拉,到了半路,不通火车,只通汽车,
那一车货会被分为很多车……仅此而已,更重要的是,这种情况下,如果ip包被设置了“不允许分片标志”,那
会发生些什么呢?对,数据包将被丢弃,然事收到一份icmp不可达差错,告诉你,需要分片!
这个网络中最小的mtu值,被称为路径mtu,我们应该有一种有效的手段,来发现这个值,最笨的方法或许是先
用traceroute查看所有节点,然后一个个ping……
5、到了传输层,也会有一个最大值的限制,当然,对于只管发,其它都不管的udp来说,不再我们讨论之列。这里
说的是tcp协议。说到大小,或许会让人想到tcp著名的滑动窗口的窗口大小,它跟收发两端的缓存有关,这里讨论
的是传输的最大数据包大小,所以,它也不在讨论之列。
tcp的选项字段中,有一个最大报文段长度(mss),表示了tcp传往另一端的最大数据的长度,当一个连接立时,连接
的双方都要通告各自的mss,也就是说,它说是与tcp的syn标志在一起的。当然,对于传输来讲,总是希望mss越大越好,
现在超载这么严重,谁家不希望多拉点货……但是,mss总是有个限制的,也就是mtu-ip头长度-tcp头长度,对于以太网来讲
它通常是1500-20-20=1460,虽然总是希望它能很大(如1460),但是大多数bsd实现,它都是512的倍数,如1024……
6、回到分片上来,例如,在win2000下执行如下命令:
ping 192.168.0.1 -l 1473
按刚才的说法,1473+20(ip头)+8(icmp头)=1501,则好大于1500,它会被分片,但是,我们关心的是:
这个数据包会被怎么样分法?
可以猜想,第一个包是
以太头+ip头+icmp头+1472的数据;
那第二个分片包呢?
它可以是:
以太头+ip头+icmp头+1个字节的数据
或者是:
以太头+ip头+1个字节的数据
也就是省去icmp头的封装,当然,ip头是不可以省的,否则怎么传输了……
事实上,tcp/ip协议采用的是后一种封装方式,这样,一次可以节约8个字节的空间。ip包头中,用了三个标志来描述一个分片包:
1、分片标志:如果一个包被分片了,被置于1,最后一个分片除外;——这样,对于接收端来讲,可以根据这个标志位做为重组的重
要依据之一;
2、分片偏移标志:光有一个标志位说明“自己是不是分片包”是不够的,偏移标志位说明了自己这个分片拉于原始数据报的什么位置,
很明显,这两个标志一结合,就很容易重组分片包了。
3、不允许分片标志:如果数据包强行设置了这个标志,那么在应该分片的时候,…… err,刚才已经说过了
称为最大传输单元,即mtu。以以太网为例,这个值通常是1500字节。
2、对于ip数据包来讲,也有一个长度,在ip包头中,以16位来描述ip包的长度,也就是说,
一个ip包,最长可能是65535字节。
3、结合以上两个概念,第一个重要的结论就出来了,如果ip包的大小,起过了mtu值,那么就需要
分片,也就是把一个ip包分为多个,这个概念非常容易理解,一个载重5t的卡车,要拉10t的货,它
当然就得分几次来拉了。
4、ip分片是很多资料常讲的内容,但是我倒是觉得分不分片其实不重要,重要的是另一个东西。一个
数据包穿过一个大的网络,它其间会穿过多个网络,每个网络的mtu值是不同的。我们可以设想,如果
接受/发送端都是以太网,它们的mtu都是1500,我们假设发送的时候,数据包会以1500来封装,然而,
不幸的是,传输中有一段x.25网,它的mtu是576,这会发生什么呢?我想,这个才是我们所关心的。
当然,结论是显而易见的,这个数据包会被再次分片,咱开始用火车拉,到了半路,不通火车,只通汽车,
那一车货会被分为很多车……仅此而已,更重要的是,这种情况下,如果ip包被设置了“不允许分片标志”,那
会发生些什么呢?对,数据包将被丢弃,然事收到一份icmp不可达差错,告诉你,需要分片!
这个网络中最小的mtu值,被称为路径mtu,我们应该有一种有效的手段,来发现这个值,最笨的方法或许是先
用traceroute查看所有节点,然后一个个ping……
5、到了传输层,也会有一个最大值的限制,当然,对于只管发,其它都不管的udp来说,不再我们讨论之列。这里
说的是tcp协议。说到大小,或许会让人想到tcp著名的滑动窗口的窗口大小,它跟收发两端的缓存有关,这里讨论
的是传输的最大数据包大小,所以,它也不在讨论之列。
tcp的选项字段中,有一个最大报文段长度(mss),表示了tcp传往另一端的最大数据的长度,当一个连接立时,连接
的双方都要通告各自的mss,也就是说,它说是与tcp的syn标志在一起的。当然,对于传输来讲,总是希望mss越大越好,
现在超载这么严重,谁家不希望多拉点货……但是,mss总是有个限制的,也就是mtu-ip头长度-tcp头长度,对于以太网来讲
它通常是1500-20-20=1460,虽然总是希望它能很大(如1460),但是大多数bsd实现,它都是512的倍数,如1024……
6、回到分片上来,例如,在win2000下执行如下命令:
ping 192.168.0.1 -l 1473
按刚才的说法,1473+20(ip头)+8(icmp头)=1501,则好大于1500,它会被分片,但是,我们关心的是:
这个数据包会被怎么样分法?
可以猜想,第一个包是
以太头+ip头+icmp头+1472的数据;
那第二个分片包呢?
它可以是:
以太头+ip头+icmp头+1个字节的数据
或者是:
以太头+ip头+1个字节的数据
也就是省去icmp头的封装,当然,ip头是不可以省的,否则怎么传输了……
事实上,tcp/ip协议采用的是后一种封装方式,这样,一次可以节约8个字节的空间。ip包头中,用了三个标志来描述一个分片包:
1、分片标志:如果一个包被分片了,被置于1,最后一个分片除外;——这样,对于接收端来讲,可以根据这个标志位做为重组的重
要依据之一;
2、分片偏移标志:光有一个标志位说明“自己是不是分片包”是不够的,偏移标志位说明了自己这个分片拉于原始数据报的什么位置,
很明显,这两个标志一结合,就很容易重组分片包了。
3、不允许分片标志:如果数据包强行设置了这个标志,那么在应该分片的时候,…… err,刚才已经说过了
推荐阅读
-
两个dd写一样的循环代码,其中一个不被执行是吗?
-
在做一个图片展示网站。想知道图片是如何存的?url?还是直接上传到服务器然后拿到他的路径
-
PHP判断一个字符串是否是回文字符串的方法_PHP
-
开发一款app,php做服务端,有一个功能是附近的人和发布动态的时候发布自己的定位,php世界有啥好的方案去做这些吗?
-
有一个函数是读取mysql的资源 是一次读取全部 不用循环的函数!
-
请问一下,大家更新站点(包括数据库)是怎样的一个流程?
-
,系统的一个php数据对象,var_dump后,属性名居然是字符串类型的数字0()
-
javascript - ajax 传值一直传的是获取到的数据的最后一个值
-
php计算一个文件大小的方法,_PHP教程
-
一个流量并发很高的项目,优化是从什么时候开始的?