這是因為乙個tcp請求視窗在絕大部分情況下是1480*10/1024=14.45k
打個比方:
一輛卡車滿載量是14.45噸,那麼顯然在兩地直接運送15噸和28噸,時間是差不多的,因為都需要兩次往返,時間只差在裝卸那13噸貨物,而相比運輸時間,這算不了什麼。但運送14噸和15噸就不一樣了,14噸可以一次運完,15噸就需要兩次才行,多出來的一次往返會使時間增加幾乎一倍。
所以前端在優化靜態資源大小的時候,14k的倍數字置都是乙個坎。從25k吐了血優化到15k,可以節省流量,但是在載入速度提公升上,沒用。。。
2.不管你申請的頻寬多高,在建立運輸剛開始的時候,通常最多只能有大約200-300kb/s的速度,隨著時間推延,傳輸速度才會慢慢提公升到最大頻寬。當然了,最終能否取得最大頻寬取決於裝置等其他因素,這裡就不細講了。
原因在於tcp的慢啟動。
計算機a要向網域名稱m.com傳送100k的資料,dns和三次握手就不講了,最終a與計算機b建立了連線。
但是a與b並不是一條線直接連上的,中間會經過你的路由器,小區交換機,都會網路關....諸多中間節點後,才會最終到達對方伺服器。而a並不知道每個中間節點的快取承載量(節點不可能把快取全部用來傳送a的資料,那樣對其它計算機的請求不公平,例如,你家路由器10k快取,連著5臺手機,它如果把10k快取都留給你,其它4臺手機就都斷網了),也不知道b的快取容量,所以a不能第一次就把所有10k資料一口氣發出去
打個比方:
我要往港口發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.
那麼問題來了。為什麼a第一次傳送10個包?多發幾個不行嗎?
很遺憾,由於多且複雜的原因,這個值是目前業界能做到的最大值了,並且這也是從最初的4漲上來的。至少以目前的網路環境,增加首次請求的視窗數量的話,很容易造成丟包。
並且,無論你申請的寬頻是10m,還是20m,100m,200m,這個值都不會變,除非你和目標伺服器之間的鏈路全部受你控制,並且你對他們的效能有充分認識,那麼你可以從tcp協議層面修改這個值。
什麼是計算機?計算機的硬體系統組成有哪些?
q 什麼是計算機?a 計算機是一台能儲存程式和資料 並能自動執行程式的機器,是一種能對各種數位化資訊進行處理的工具。q 什麼計算機硬體系統的組成部分?a 計算機由運算器 控制器 儲存器 輸入和輸出五大基本部件組成。1 運算器 在計算機的功能是執行加 減 乘 除等算術運算,以及與 或 非 移位等邏輯運...
計算機視覺的演算法有哪些,具有哪些特點?
以大力出奇蹟為主。主要利用1billion的資料 512tpu 100小時以上的訓練方式得到5 以內的accuracy提公升。代表作有各大廠的 net。講求得其main idea即可。主要利用mnist,cifar等各種toy data 簡化假設 數學公式組合來得到聲稱可generalize至大規模...
計算機組成原理 馮 諾依曼計算機的特點有哪些?
當前計算機主要是基於馮諾依曼體系結構設計的 下圖為典型的馮諾依曼計算機結構框架圖。1.儲存器分為外儲存器和記憶體儲器,這裡所說的主要為記憶體儲器 記憶體儲器就是記憶體,也叫 主存 其功能為直接與cpu進行 資料交換 載入各種各樣的程式和資料供cpu central processing unit 直...