网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1513|回复: 0
打印 上一主题 下一主题

[计算机硬件知识] 下载一个15k的文件和28k的文件哪个快?

[复制链接]

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

跳转到指定楼层
楼主
发表于 2021-3-25 17:26:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1,下载一个15K的文件,和下载一个28K的文件,时间其实几乎是一样的,但下载一个15K的文件和一个14K的文件,前者比后者耗时几乎多了一倍。这是因为一个TCP请求窗口在绝大部分情况下是1480*10/1024=14.45K。(为啥是这个值呢?下边2里会讲。)
打个比方,一辆卡车满载量是14.45吨,那么显然在两地之间运送15吨和28吨,时间是差不多的,因为都需要两次往返,时间只差在装卸那13吨货物,而相比运输时间,这算不了什么。但运送14吨和15吨就不一样了,14吨可以一次运完,15吨就需要两次才行,多出来的一次往返会使时间增加几乎一倍。
所以前端在优化静态资源大小的时候,14K的倍数位置都是一个坎。从28K吐了血优化到15K,可以节省流量,但在加载速度提升上,没卵用...
2,不管你申请的带宽有多高,在建立传输刚开始的时候,通常最多只能有大约200-300KB/S的速度,随着时间推延,传输速度才会慢慢提升到最大带宽。当然了,最终能否达到最大带宽取决于设备等其它因素,这里就不细讲了。
原因在于TCP的慢启动。容我举一个例子:
计算机A要向域名http://m.com发送100K的数据,dns和三次握手就不讲了,最终A与计算机B建立了连接。
但是A与B并不是一条线直接连上的,中间会经过你的路由器,小区交换机,城域网关...诸多中间节点后,才会最终到达对方服务器。而A并不知道每个中间节点的缓存承载量(节点不可能把缓存全都用来发送A的数据,那样对其它计算机的请求不公平,例如,你家路由器有10K缓存,连着5台手机,它如果把10K缓存都留给你,其它4台手机就断网了),也不知道B的缓存容量,所以A不能第一次就把所有100k数据一口气发出去。
打个比方:
我要往港口发100吨货出海,但港口容量可能只有20吨,我一口气发100吨势必造成港口堵塞,我只能1吨1吨地发。我不知道港口的具体容量,为了避免拥塞,我第一次发1吨试探一下,并且在司机回来之前,我不能再次发货;如果港口收到后,返回来的卡车司机告诉我港口可以接收更多的货物,那么我可以尝试一次发送2吨,再然后是一次3吨,4吨...直到达到港口的最大接收能力。但港口为什么不能第一次就直接告诉你他的最大接收能力呢?因为港口同时还在接收其它地方发来的货物,它的接收能力是动态变化的,你和港口之间只能每次运货时都进行一次协商,约定好下次能发多少吨货物。
用这个比方来对应的话,大概是这样的:
港口——目标服务器B
我——电脑A
运货路上的服务区——中间节点
每次发货吨数——每次发送的数据包大小
港口最大容量——目标服务器B的缓存

PS:如果我强行一次发送100吨货物,港口当次只能接收20吨,或者中途某个驿站只能接收10吨,剩下的货无处存放,可能就丢了。

到了TCP这儿,如果我第一次就把100K数据发出去,而中途某个节点的缓存只能分配给我20K,那剩下的80K就会堵塞在上一个节点,而上一个节点很容易把拥塞的请求忽略掉,于是就造成了传说中的丢包。所以A只能先“试探”一下,首次发包少发一点。在业界,这个值就是1480*10=14800字节,1480是一个TCP包的大小,10是窗口数量。打比方的话,1480相当于一个集装箱的容量,然后一次发10个集装箱。
所以,A向B发送的过程大概是这样的:
  • A发送10个TCP包给B;——发送了14K,剩余86K
  • B告诉A,没有丢包,10个包全部收到(这说明B可以接收至少10个包,中途的任意一个节点也可以缓存至少10个包),那么我们下次试试接收12个包,怎么样?
  • A说,好的,于是再次发送了12个包;——发送了17K,剩余69K
  • B告诉A,还是没有丢包,我们继续提高到14个包吧~
  • A说,好的,于是再次发送了14个包;——发送了20K,剩余49K
  • B告诉A,还是没有丢包,我们继续提高到16个包吧~
  • A说,好的,于是再次发送了16个包;——发送了22K,剩余27K
  • B告诉A,还是没有丢包,我们继续提高到18个包吧~
  • A说,好的,于是再次发送了18个包;——发送了25K,剩余2K
  • B告诉A,还是没有丢包,我们继续提高到20个包吧~
  • A说,好的,但是我们只剩下2K了呀~发两个包就够了。再跟上一个结束标记。——发送了2K,发送完毕。
  • B关闭连接。
于是,100K的请求,实际上是花了6次发送+5次返回(也就是5.5个往返)才完成的。OK,网络传输也是有时间的,我们管一次往返的耗时叫RTT。假设一次RTT耗时40毫秒,那么这100K耗时就是40*5.5=220毫秒。那么本次发送的带宽,就是100K/0.22s=454KB/S。
如果文件不是100K,而是10M,花费的次数就远不止5.5次。假设每次都增加2个窗口,并且RTT稳定在40ms,大家有兴趣可以算一下10M需要多少次发送,多长时间。
所以,我们在下载时,总会看到下载速度从一个比较小的速率开始慢慢往上涨。

那么问题来了。为什么A第一次要发送10个包?多发几个不行吗?
很遗憾,由于多且复杂的原因,这个值是目前业界能做到的最大值了,并且这也是从最初的4涨上来的。至少以目前的网络环境,增加首次请求的窗口数量的话,很容易造成丢包。
并且,无论你申请的宽带是10M,还是20M,100M,200M,这个值都不会变,除非你和目标服务器之间的链路全都受你控制,并且你对它们的性能有充分认识,那么你可以从TCP协议层面修改这个值。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2025-1-3 08:28 , Processed in 0.034403 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表