“带宽”的本质

打一个小广告,作者本人开发的一个集合优质编程教程与视频的网站(包含大量慕课网体系课与实战课),感兴趣的同学可以看一下,青苹网 www.qingp.net


“带宽”的本质是什么?
又是什么决定了“带宽”?

光纤

clipboard.png

互联网上两台电脑要相互通信,它们需要有一个物理连接,提供信号传输介质。这种物理层线路,常见的传导材料有铜线和光纤,我们常用的双绞线是铜线,它传输的是电信号,光纤传输的是光信号,但并不是说光纤对信号的传播速度就比铜线更快。

不管是电信号还是光信号,只要进入线路后,便能够进行快速的传播,这个速度称为传播速度,它的单位是“m/s”,即单位时间传播的距离。传播速度只与传播介质有关,铜线中电信号传播速度大约是2.3x10^8m/s,光纤中信号的传播速度大约为2.0x10^8m/s。

这或许有点奇怪,光在真空中的传播速度不是3.0x10^8m/s吗?的确是,它不仅仅只是可见光的传播速度,也是所有电磁波在真空中的传播速度,所有电磁波(包括可见光)在真空中的传播速度是常数,即是光速。

那为什么光纤中的光信号传播速度要低一些呢?这是因为光纤在传播光信号时,利用了光的全反射原理,所以光信号在光纤中实际传播距离要大于光纤的长度。也就是说,看起来这段光纤长度只有1m,但这个光信号实际上可能传播了2m或者3米甚至4米更多,也就是弯弯曲曲的传播花了更多的时间才传输完这实际的1m,那速度自然是慢了点。

由此可见,不同的传播介质中信号的传播速度几乎等于常量,恒定的,也就是说,不论数据发送装置(网卡)以多快的发送速度让数据以信号的形式进入物理线路,在物理线路中信号的传播速度几乎可以认为是一样快的并且恒定的。那为什么又还要使用价格更昂贵的光纤,这涉及到一个信号衰减的问题。

信号在传播介质中的衰减,与传播介质以及信号传播方式有着密切的关系。比如我们一般使用的双绞线,传输距离只能达到100m,更长的距离就需要通过中继器来延续信号,而且只能使用有限次的中继器,每次中继器转发信号又会消耗一些发送时间。光纤利用了光的全反射原理,微细的光纤封装在塑料套中,使得它能够弯曲而不影响光信号的传播。光纤中光的传导损耗比电信号在电线传导的损耗低的多,它的传输距离一般在数千米以上,所以光纤一般被用作长距离的传输,跨越太平洋的海底就是用的光缆。

带宽

我们一般说的100M带宽,全称应该是100Mbit/s,或者100Mbps,后面的bit/s经常省略。

如果数据要从主机进入线路,一般会经过以下这些环节。

  1. 应用程序首先将要发送的数据写入该进程的内存地址空间,通常在程序开发中这只需要一般的运行时变量赋值即可。
  2. 然后应用程序会通过系统函数接口(比如send()函数)向内核发出系统调用,内核会将这些数据从用户态内存区(进程的内存空间)复制到内核维护的一段称为内核缓冲区的内存地址空间。这块地址空间的大小通常是有限的,所有要发送的数据将以队列的形式进入这里,这些数据可能来自于多个进程,每块数据都有一块额外的记号来标记它们的去向。如果要发送的数据比较多,那么该系统调用需要多次进行,每次复制一定的数据大小,这个大小取决于网络数据包的大小以及内核缓冲区的承载能力。重复的系统调用体现在应用编程方面重复调用send()函数。
  3. 当数据写入内核缓冲区后,内核会通知网卡控制器前来取数据,同时CPU转而处理其他进程。网卡控制器接收到通知后,便根据网卡驱动信息得知对应内核缓冲区的地址,将要发送的数据复制到网卡缓冲区中。网卡缓冲区中的数据需要发送到线路中,同时释放缓冲区来获取更多要发送的数据。实际上只有二进制的信号才可以在线路中传输,因此这时就需要对数据进行字节到位的转换,这种转换就是将数据的每个位按照顺序依次发出。发送时,网卡会使用内部特定的物理装置来生成可以传播的各种信号,比如在使用铜线线路时,网卡会根据0和1的变化产生不同的电信号,而使用光钎线路时网卡会产生不同的光信号。

我们所讲的“带宽”是指数据的发送数度,准确说又分为“上行带宽”和“下行带宽”。上行带宽,又称出口带宽,就是本地电脑发送数据到外部的速度,上传文件的时候,本地能够以多块的速度把文件上传到远程服务器,这就取决于本地的上行带宽。下行带宽,也称为入口带宽,通俗的说就是下载速度。

不管是上行带宽还是下行带宽,这些数据都是网卡发送和接收的,而它在实际中能有多块的速度,取决于几个因素。

这里以上行带宽,即本地把数据发送出去的发送速度为例,这个发送速度能有多块,有如下几个因素:

  • 数据发送装置将二进制信号传送至线路的能力,也称信号传输频率。这个实际上就是指网卡理论上每秒最大能够发送多少的数据,这是第一关,决定了理论上最大发送速度。比如我们的百兆网卡,便是指网卡的最大发送速度为100Mbps,也就是网卡在1秒钟最多可以发出100Mb的数据,那么这个就决定了本地理论上的最高发送速度。
  • 线路对传输频率的支持程度。比如光钎一端的发射装置使用发光二极管(LED)或一束激光将光脉冲传输至光纤,光纤另一端的接收装置使用光敏元件检测脉冲,从而将光脉冲中包含的二进制信息转换成数据。数据传播介质的并行度,可以称为“宽度”,比如在光纤传播中,我们可以将若干条纤细的光纤组成光缆,这样可以在一个横截面上同时传输多个信号。也就是光纤越粗,组成光缆,那么这个通道就越宽,同一时刻能够容纳更多的电信号传输。
  • 网卡理论上可以每秒发送100Mb的数据,但实际上它每秒能够发送多少数据,直接决定性的,是由另一端数据接收装置对二进制信号的接收能力。如果另一端接收能力跟不上,那么这一端网卡就会主动降低数据的发送速度。而这种限制就主要是人为的。

为什么限制带宽

clipboard.png

限制这个“带宽”实际上是交换机,交换机可以限制入口速度和出口速度。

很多web站点都是托管在诸如阿里云等,它们会将我们的服务器主机连接到交换机以接入互联网。这时候我们服务器拥有自己的IP地址,当用户向这台服务器请求数据后,数据会从服务器流经交换机到达指定的路由器最后进入用户的电脑,而数据从服务器主机上发送出来,首先是发送到了交换机,交换机的需要进行存储和转发。也就是交换机从连接服务器的端口接收数据,存储到交换机内部的高速缓冲队列中,然后将其从连接路由器的端口发送出去,再经过路由器的转发进入另一个网络,依次重复这个过程直到数据进入用户的电脑。

如果全世界就只有这一台服务器,用户访问就只这一台服务器,那么这部分数据流经每个交换节点都会全心全意的做好转发工作,此时数据在各节点的发送速度都可以达到理论上设备所能达到的最大值。但实际上每处交换节点都有会同时转发来自其他主机的数据,这些不同主机的数据都会汇进交换机的转发队列,交换机按照转发队列中的顺序来交错的发送这些来自不同主机的数据,所以单从来自不同主机的数据而言,交换机将其中一个主机的数据转发出去的速度,要小于这个主机将数据发到这个交换机的速度。

clipboard.png

这个意思是说,比方,主机A会源源不断的发送数据到交换机,主机B和C也会源源不断的发送数据到交换机,它们会在交换机中排队,交换机只能按照队列来一个个处理,把主机A的数据发送出去,在后面排队的主机B的数据就等到很着急,A的数据发完了,然后下一个再发送主机B的数据,然后再按照队列顺序,将主机C的数据发送出去。也就是说主机C的数据是等的最长的,对于排队的这每个主机数据来说,它们每个都想最先最快的出门,但是门就这么点大,总有个先后顺序,那么这个交换机的上行带宽(出口带宽)就是个关键。

显然,这个交换机的出口带宽是有限的,它毫无疑问是个枪手货,并且互联网运营商不会白白的搭建网络,所以运营商在所有的基础交换节点上设置关卡,其中交换机就会对每个主机进行限速,也就是限制数据从你的主机流入交换机转发队列的速度,而只要流入交换机转发队列的数据,都会按照交换机的出口速度流入其他网络。这种关卡设置实际上等于限制了你的主机发送数据的速度,也就是限制了主机的出口带宽(上行带宽),而这种限制就是通过限制交换机对你主机的数据的接收速度,来将你的发送速度牢牢控制在手里,因为数据链路层的流量控制是通过控制接收方来实现的。

如果一台主机独享10Mb带宽,也就是10Mbit/s的数据发送速度,换算的话就是1250kb/s,这种情况下,如果交换机的出口带宽是100Mb,那么交换机的设置应该保证来自广播域内其他主机的数据发送速度综合不超过90Mbit/s,以保证该主机任何时刻都可以以10Mbit/s的速度发送数据,这才叫独享带宽,它独享的是交换机的一部分出口带宽(上行带宽)。为了保证每台主机的独享带宽,那么这个交换机最多就只能允许10台主机连到这个交换机。

以上所说的这些发送速度(带宽)都是针对从发送端发出的所有数据而言,也就是上行带宽,但是这些数据往往来自于主机的多个进程,而且也要发往五湖四海不同目的地,比如北京上海深圳三个用户通过http同时下载主机上的数据文件,这些数据不分你我地夹杂在一起从主机进入交换机,当它们进入某城市的交换节点时,大家就会分道扬镳分别前往三个不同的目的地。从各个目的地的角度而言,单位时间接收到的数据一定比从服务器发出的数据少,这种从最终端体验到的速度一般称为“下载速度”,准确说是下行速度,用户端下载速度无论如何都小于服务器端的发送速度,在刚才的例子中,即便是三个目的地的下载速度总和也一定小于服务器对这些数据的发送速度。

对于家用带宽的限制也一样,宽带服务商会在你家接入的交换机上进行带宽限制,比如安装的是1Mb独享带宽,那么交换机连接到你家电脑的端口,将会以1Mbit/s的速度接收来自服务器的数据,然后再发送给你的主机,无论服务器发送数据有多块,也无论你的主机网卡是100Mb/s还是更高,但实际上每秒能够接收多少,就是交换机每秒发送过来的1M的数据。当然,你的下载速度是受到运营商交换机的限制,但是要访问的远程站点的服务器的数据发送速度基本不变,因为它发出的数据不只是到这一家,它会以它的最高速度源源不断的发送数据往五湖四海,只不过当前你主机的交换机自己减慢了对它的接收速度,远程服务器的发现你这里的交换机接收速度比较慢,那么它就会降低发往你这里交换机的频率,而以它自己最高的速度,优先把数据发往其他地区其他用户的交换机。


Lee Tsang
javascript

d

719 声望
11 粉丝
0 条评论
推荐阅读
一文搞懂浏览器缓存
浏览器缓存除了http设置,还有一种是在HTML页面中加入<meta http-equiv="Pragma" content="no-chache">,这个就是告诉浏览器不缓存当前页面,每次访问都要重新从服务器获取。但是只有部分浏览器支持,另外...

hebe700阅读 984

Chrome 103支持使用本地字体,纯前端导出PDF优化
在前端导出PDF,解决中文乱码一直是一个头疼的问题。要解决这个问题,需要将ttf等字体文件内容注册到页面PDF生成器中。但是之前网页是没有权限直接获取客户机器字体文件,这时就需要从服务器下载字体文件或者提示...

葡萄城技术团队3阅读 13.9k

HTTP,WebSocket 和 聊天室
在涉及到网络层面的相关内容时,不免会联系到 HTTP、TCP、WebSocket 等,但相信大部分人都并不是很清楚其中的一些关系和概念,特别是需要你去做语言表述时,网上有不少优秀的资料和文章,但知识仍需要自己去消化...

熊的猫3阅读 397

封面图
抓包分析 TCP 握手和挥手
首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务。在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂。反复思考过...

mghio2阅读 788

封面图
基于QUIC协议的HTTP/3,你了解多少?
前言了解一下HTTP发展史:HTTP/0.9-HTTP/1.0-HTTP/1.1-HTTP/2.0多个TCP连接 {代码...} Keep-alive {代码...} 管线化 {代码...} 多路复用 {代码...} {代码...} 并行多路复用的请求和响应不会相互阻塞尽管传输多个...

Henryk2阅读 1.2k评论 1

gitlab-ce将https修改为http
索性我们禁用gitlab的https功能,将期恢复为http。后期我们再在部署一个nginx进行数据转发,然后在nginx上起用https并设置证书。这样应该就规避了gitlab的证书错误问题。

myskies1阅读 650

设计模式那些事(3)——使用建造者模式封装go的http库
{代码...} 具体实现 {代码...} 使用 {代码...}

爆裂Gopher1阅读 771

封面图

d

719 声望
11 粉丝
宣传栏