👉 体系化学习:
— 特色专栏 —
/ /
/ /
/ /
/ /
/ /
大家好,我是民工哥!
网络基础知识,可以说是每个程序员必备的基础中的基础知识点。
曾就有人面试遇到面试官问过他一个问题: 1000Mbps 换算成 MB/s 是多少 ?
他回:除以8后的得数。
面试官:呵呵一笑,除以 8 ?想简单了吧?
那么 到底是多少呢?有知道的吗,评论区打出来你的答案 。
为了让更的读者朋友们不再闹出笑话,今天就来科普一下。
如何理解Mbps与MB/s?
在网络传输的时候,往往会用到 Mbps 这个单位,GbE or 1 GigE 的网卡现在很流行,这个东西被大家叫做「 千兆网卡 」。
同时,大家特别习惯用 GB 或者 MB 来描述一个磁盘的大小。这个叫做 Gigabyte 或者 Megabyte 。
但描述文件大小(或者讨论磁盘空间)的时候,我们通常还会用GiB或者MiB来描述。
GB和GiB的对比实际上就是上面标的关系了,
KB
、
MB
、
GB
、
TB
来自于10进制三位分割的计数法,也就是每隔三位数加进一个逗号,这是对应了欧美那边的计算方法,这个来源于「短级差制(short scale)」,本意是指1000个前数,例如
1billion= 1000 million
,也就是10亿= 1000个百万。但是这种计数方法本身会带来困扰。如果敏感一点的读者看到了「
短级差制
」,一定会想到「
长级差制
(long Scale)」,长级差制是以百万(10的6次方)来作为下一个级别的,在长级差制之内1billion 代表的意思就是「万亿」了,代表100万个百万,也就是10的12次方。
无论是短级差制还是短级差制在欧洲都在用,这件事就会引起混乱,于是国际标准化组织就依照短级差短方式定义了一套标准化的词头计数方式,以10的3次方为级,这也就是我们现在的千、兆、吉、太、拍、艾、泽……的计数方法了。
同理,在二进制中,我们会以2的
n*10
次方来计算数字的大小,于是就有一个二进制的词头,写法和国标的词头类似,只不过在英文中把后两位依据发音习惯替换成了bi,例如Giga被改成了Gibi、Tera被改成了Tebi,我们说的MB(megabyte),也被改成了mebibyte,也就是简写的MiB。
回到留言的问题:1000Mbps的网络,换算为MB是多少,首先我们先搞清楚
1000Mbps
是什么,前面说了是是GbE,这个东西叫做「吉比特以太网(Gigabit Ethernet)」 注意这里面用的是Giga,说明是
10进制
计算的,也就是一秒钟可以传输1,000,000,000个比特。
怎么深层理解网络传输?
我们都知道的是 一个字节(Byte)是由8个比特(Bit) 组成。按理论上来说,1000Mbps的网络传输带宽在一秒钟之内可以传递125MegaByte的数据。
但是,我们得知道,在网络传输的时候并不是光传输你所需要的数据, 在传输的过程中还需要将数据改变成网络数据包,所谓的打包数据就是在各个网络层为数据增加相应的标记信息 。
这些信息对传输文件本身这件事并不会有太大的意义,只是为了能够完成网络传输。这时候,你在文件管理器中传输文件的时候看到的速度就已经不是网卡的速度了,而是在传输后层层打包后的净文件流数据获取速度。
因此,有的人就在问, 为什么明明是千兆网卡,传输速度却不会达到125MB/秒 ?
这里损失的一部分速度就是
打包数据包所占用的传输流量
。
所以速度达不到125MB/秒并不是网络的问题,而是正常现象。
那么有没有可能让传输速度进一步提高,尽量接近125MB/秒的极限呢?也是可以的。我们就得从
数据链路层
的以太网帧来入手了。
提升网络传输性能的方法?
之前给大家讲过以太网帧,其中有一个
MTU设置
,叫做最大传输单元(MaximumTransmissionUnit),每个以太网帧可以被定义为一个传输单元。
以太网所定义的一个帧的大小为1538
。
在网络设备上开始传输的时候设备会先发出7个字节的先导码,然后按照固定的格式分节来传输后面的数据。
这个过程叫做一个传输单元,最终一个帧会以四个字节的校验码结束 。其中最多会在Data这一节承载1500字节的数据。
如果我们把 一个帧当作一辆卡车 的话是这样的:
车头、车架、车轮都是数据包的封装结构,车厢就是数据包中的数据 。
即便是数据再少,车头、车架、车轮也是精简不掉的。
但我们可以尽量的增加车厢的大小,让一趟车尽量的运送更多的货物。这就是降低了每次传输数据包的损耗率。
所以,我们可以知道的传输速率是可以计算出来的,大致上
效率=真正的传输数据内容/帧大小
,因此可以计算在一个MTU为1500的以太网上的效率计算则是
1500/(1500+38)=97.53%
,这还是干净的以太网帧,如果我们在交换机上附带了Vlan等设置,我们就需要再加入VLan的封包子节数。还拿卡车做例子就是这样的感觉:
一辆卡车被作为货物装入另一辆卡车。
这时候Vlan的四个字节的标记也得加进去,就成了
1500/(1500+38+4)=97.28%
。
所以说,在网络传输效率上, 一般以千兆太网是可以做到975.3Mbps的真实传输效率的,如果加了VLan可以做到972.8Mbps的传输效率 。当然了,这是理论最高数值。
这个数值除以8是不是就算是网络能传文件的字节数了呢?还不是!
一般我们用SMB做文件分享和传输,这是TCP协议集里面的一个协议:
看——也有包头、控制、基础数据等等一系列的额外内容在里面。
因此
975.3Mbps 除以8 的121.9MB/秒
也不会是一个文件传输的真实数值,还得打折扣。
还是卡车,这个SMB是卡车车厢里面的货物而已但不是你的文件。
例如这辆卡车里面装的是苹果笔记本电脑,你要的也是一台苹果笔记本电脑,但是只要不是买二手,大部分电脑运送的时候还是有包装箱的,这个包装箱的一包就是SMB传输的数据包。
而在你的购买行为里面却默认只是要层层包装里面的一台电脑。多余的东西实际上都是运输损耗。
了解这些背景信息,你就会发现,带宽1000Mbps不变的情况下,你需要 降低附带的这些协议包的损耗 。怎么办?加大车厢!
换一个更大车厢一次性装更多的数据就好了。这里就要用到交换机上的 巨型帧 了,是指 MTU大于 1500 的帧 。按照规范来说,巨型帧(jumbo frames)可以设置到9000字节。这个大小远远突破了IEEE 802.3以太网协议的限制。它可以做到在一个封装好的以太网帧中最多传输9000字节的数据,也就是MTU=9000。
我们按照之前的效率算法来计算一下就可以知道
效率=9000/(9000+38)= 99.58%
,比起默认以太网的97.53要多压榨出了一些网络传输性能。
但是,要知道的是网络上不仅仅只是来回交换文件传输数据包的内容,还会不停的 传输一些小包指令 。
这时候一个巨大的帧内有可能只传输一些极小的负载。例如一辆大集装箱卡车里面只装了一小件货物:
和卡车司机的困扰一样,以太网要传输小包数据实际上也会占用相同的以太网帧大小。于是 十几个字节的数据在巨型帧的交换机上也得占用几百倍的传输带宽 。这样就会导致网络的性能不增反降。
一般的做法是 将两种交换机分离开,专门做大型数据传输的使用设置好巨型帧的交换机进行传输 ,而一般的小指令小数据包的传输会利用普通的MTU设置为1500的以太网交换机进行传输。
这就把存储的网络和普通业务网络进行分离。为了配合存储需求,也就出现了iscsi等专门跑在以太网上的存储协议。当然了,也有一些光纤通道交换机专门跑存储业务。这就有点脱离开大家经常用到的以太网的范畴了。
来源:知乎
公众号读者专属技术群
构建高质量的技术交流社群,欢迎从事后端开发、运维技术进群( 备注岗位,已在技术交流群的请勿重复添加微信好友 )。主要以技术交流、内推、行业探讨为主,请文明发言。 广告人士勿入,切勿轻信私聊,防止被骗。
扫码加我好友,拉你进群
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下 「 在看 」 ,加个 「 星标 」 ,这样每次新文章推送才会第一时间出现在你的订阅列表里。 点 「 在看 」 支持我们吧!