1. 程式人生 > >一次由於 MTU 設置不當導致的網絡訪問超時

一次由於 MTU 設置不當導致的網絡訪問超時

amp 顯示 com 網絡 ans oot 傳輸 assemble ext

轉自:http://weibo.com/ttarticle/p/show?id=2309404140904511340923

API 服務正常,但是調用總是超時。api端日誌顯示,響應速度很快。

???

現象

Server A 調用本機的接口,能正常返回。調用Server B的接口,總是超時。被調用接口是能正常執行的,而且有執行日誌記錄。
Server C 調用Server B的接口也能正常返回

分析

根據以上,基本可以排除是Server B接口服務的問題導致超時。很有可能 Server A 與 Server B之間的網絡有問題。抓包分析如下:

Server A 調用 Server B接口時,抓包情況如下:

技術分享

?

可見,在調用Server B的接口時,重試很嚴重。見上圖的黑色行。

當 MTU 值或者 MSS 值設置不合適時,會導致這樣的問題出現。
首先,查看當前 MTU 的值是多少:
linux 下查看方式如下:

技術分享

?

再看這個 MTU 值設置多少合適。使用 ping 命令檢測。

技術分享

?-s 參數說明包的大小。Specifies the number of data bytes to be sent.
後面的 IP 可以設置為 任何一個可以 ping 通的 IP。
當返回值如下時,表示包的大小設置的過大,可以調小:

技術分享

?

當出現如下的結果時,說明包大小設置的正常了。

技術分享

?

解決

經過上面的 ping 測試,我們可以知道 原先的 MTU 值為 9001,設置的過大。應該改成 2000.
有多種修改的方式,下面就介紹一種。

技術分享

?設置完成後,再次抓包,情況如下:

技術分享

?

可見重傳消失了。

擴展

MTU && MSS

MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: 就是TCP數據包每次能夠傳輸的最大數據分段。為了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時 候往往用MTU值代替(需要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方 提供的MSS值得最小值確定為這次連接的最大MSS值。

wireshark 中的 CP segment of a reassembled PDU

數據超出了TCP的最大MSS時,主機會通過發送多個數據包來傳送 這些數據(註意:這些包並未被分片)。對wireshark來說這些對相應同一個查詢命令的數據包被標記了“TCP segment of a reassembled PDU”

問題,wireshark如何識別多個數據包是對同一個查詢數據包的響應? wireshark是根據sequence number來識別,這些數據包ACK number是相同的,當然number的數值與查詢數據包中的next sequence number也是一樣的。

一次由於 MTU 設置不當導致的網絡訪問超時