TCP協議細節學習

TCP協議中包含ip信息麼

TCP協議中並不包含ip信息,ip信息是在第三層處理的,TCP中處理的是端口信息

MSS的值是如何計算的

TCP協議中可選的MSS(Maximum Segment Size,最大報文長度))參數,一般使用MTU代替,值為1460。這個值是怎麼來的呢?

Maximum Transmission Unit,縮寫MTU,中文名是:最大傳輸單元。

假設MTU值和IP數據包大小一致,一個IP數據包的大小是:65535,那麼加上以太網幀頭和為,一個以太網幀的大小就是:65535 + 14 + 4 = 65553,看起來似乎很完美,發送方也不需要拆包,接收方也不需要重組。

那麼假設我們現在的帶寬是:100Mbps,因為以太網幀是傳輸中的最小可識別單元,再往下就是0101所對應的光信號了,所以我們的一條帶寬同時只能發送一個以太網幀。如果同時發送多個,那麼對端就無法重組成一個以太網幀了,在100Mbps的帶寬中(假設中間沒有損耗),我們計算一下發送這一幀需要的時間:

( 65553 * 8 ) / ( 100 * 1024 * 1024 ) ≈ 0.005(s)

在100M網絡下傳輸一幀就需要5ms,也就是說這5ms其他進程發送不了任何數據。如果是早先的電話撥號,網速只有2M的情況下:

( 65553 * 8 ) / ( 2 * 1024 * 1024 ) ≈ 0.100(s)

100ms,這簡直是噩夢。其實這就像紅綠燈,時間要設置合理,交替通行,不然同一個方向如果一直是綠燈,那麼另一個方向就要堵成翔了。

既然大了不行,那設置小一點可以麼?

假設MTU值設置為100,那麼單個幀傳輸的時間,在2Mbps帶寬下需要:

( 100 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 ≈ 5(ms)

時間上已經能接受了,問題在於,不管MTU設置為多少,以太網頭幀尾大小是固定的,都是14 + 4,所以在MTU為100的時候,一個以太網幀的傳輸效率為:

( 100 - 14 - 4 ) / 100 = 82%

寫成公式就是:( T - 14 - 4 ) / T,當T趨於無窮大的時候,效率接近100%,也就是MTU的值越大,傳輸效率最高,但是基於上一點傳輸時間的問題,來個折中的選擇吧,既然頭加尾是18,那就湊個整來個1500,總大小就是1518,傳輸效率:

1500 / 1518 = 98.8%

100Mbps傳輸時間:

( 1518 * 8 ) / ( 100 * 1024 * 1024 ) * 1000 = 0.11(ms)

2Mbps傳輸時間:

( 1518 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 = 5.79(ms)

總體上時間都還能接受

因此,1500,是一個折中的結果而已,這就是為啥路由器上一般都設置成這個值。

另外,如果使用PPPoE協議(ADSL),就需要設置成更小的值,為啥呢,。

PPPoE協議頭信息為:

| VER(4bit) | TYPE(4bit) | CODE(8bit) | SESSION-ID(16bit) | LENGTH(16bit) |

這裡總共是48位,也就是6個字節,那麼另外2個字節是什麼呢?答案是PPP協議的ID號,佔用兩個字節,所以在PPPoE環境下,最佳MTU值應該是:1500 - 4 - 2 = 1492

說回來,MTU的值的計算,需要從1500中減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes,最後就得到了1460。

四次揮手的原因

TCP連接是全雙工的,即一端接收到FIN報時,對端雖然不再能發送數據,但是可以接收數據,所以需要兩邊都關閉連接才算完全關閉了這條TCP連接。

TIME-WAIT狀態

主動關閉的一方收到對端發出的FIN報之後,就從FIN-WAIT-2狀態切換到TIME-WAIT狀態了,再等待2MSL時間才再切換到CLOSED狀態。這麼做的原因在於:

確保被動關閉的一方有足夠的時間收到ACK,如果沒有收到會觸發重傳。

有足夠的時間,以讓該連接不會與後面的連接混在一起。

TIME-WAIT狀態如果過多,會佔用系統資源。Linux下有幾個參數可以調整TIME-WAIT狀態時間:

net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉。

net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。

net.ipv4.tcp_max_tw_buckets = 5000表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。默認為180000,改為5000。

然而,從TCP狀態轉換圖可以看出,主動進行關閉的鏈接才會進入TIME-WAIT狀態,所以最好的辦法:儘量不要讓服務器主動關閉鏈接,除非一些異常情況,如客戶端協議錯誤、客戶端超時等等。


分享到:


相關文章: