1. 程式人生 > >關於傳輸層協議單個知識的通俗講義

關於傳輸層協議單個知識的通俗講義

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要向域名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協議層面修改這個值。

超載什麼的真是夠了....

問題1就不考慮服務端處理的時間了,每種業務都不一樣,解釋原理時考慮這些沒啥意義