作為網(wǎng)絡(luò)管理員,很多時間必然會耗費在修復慢速服務器和其他終端。但用戶感到網(wǎng)絡(luò)運行緩慢并不意味著就是網(wǎng)絡(luò)問題。
解決網(wǎng)絡(luò)性能問題,首先從TCP錯誤恢復功能(TCP重傳與重復ACK)和流控功能說起。之后闡述如何發(fā)現(xiàn)網(wǎng)絡(luò)慢速之源。最后,對網(wǎng)絡(luò)各組成部分上的數(shù)據(jù)流進行概況分析。這幾張內(nèi)容將會幫助讀者識別,診斷,以及排查慢速網(wǎng)絡(luò)。
更多信息
接下來的內(nèi)容,較多是黑白圖片了。雖然看起來有點不爽,但還是很值得一看。
TCP錯誤恢復功能:
TCP的錯誤恢復功能是定位,診斷及修復網(wǎng)絡(luò)延時的最佳工具。延時可以在單程也可以往返方向測量。高延時是網(wǎng)絡(luò)管理員的頭號大敵。本節(jié)我們討論TCP高延時是如何導致序列號和確認號亂序的。
TCP重傳:
主機報文重傳是TCP最基本的錯誤恢復功能,它的目的是防止報文丟失。
報文丟失的可能因素有很多種,包括應用故障,路由設(shè)備過載,或暫時的服務宕機。報文級別速度是很高的,而通常報文丟失是暫時的,因此TCP能夠發(fā)現(xiàn)和恢復報文丟失顯得尤為重要。
決定報文是否有必要重傳的主要機制是重傳計時器(retransmission timer),它的主要功能是維護重傳超時(RTO)值。當報文使用TCP傳輸時,重傳計時器啟動,收到ACK時計時器停止。報文發(fā)送至接收到ACK的時間稱為往返時間(RTT)。對若干次時間取平均值,該值用于確定最終RTO值。在最終RTO值確定之前,確定每一次報文傳輸是否有丟包發(fā)生使用重傳計時器,下圖說明了TCP重傳過程。
當報文發(fā)送之后,但接收方尚未發(fā)送TCP ACK報文,發(fā)送方假設(shè)源報文丟失并將其重傳。重傳之后,RTO值加倍;如果在2倍RTO值到達之前還是沒有收到ACK報文,就再次重傳。如果仍然沒有收到ACK,那么RTO值再次加倍。如此持續(xù)下去,每次重傳RTO都翻倍,直到收到ACK報文或發(fā)送方達到配置的最大重傳次數(shù)。
最大重傳次數(shù)取決于發(fā)送操作系統(tǒng)的配置值。默認情況下,Windows主機默認重傳5次。大多數(shù)Linux系統(tǒng)默認最大15次。兩種操作系統(tǒng)都可配置。
示例如下圖:
TCP重傳過程發(fā)送的第一個報文如下圖所示(圖片不很清楚,已經(jīng)盡力了):
這是一個TCP PSH/ACK報文①,包含648字節(jié)數(shù)據(jù)②,從10.3.30.1發(fā)送至10.3.71.7。這是一個典型的數(shù)據(jù)報文。
在通常情況下,第一個報文發(fā)送之后很快會收到TCP ACK報文。然而,在這個case里,第二個是重傳報文??梢栽赑acket list面板里看到。Info欄清楚的標明“TCP Retransmission”,報文以黑色背景紅色字體標出。下圖是Packet List面板中的重傳示例(仍然不清楚,但可參見上圖):
也可以在Packet Details和Packet Bytes面板中查看來確定是否是重傳報文,如下圖所示:
注意此報文與源報文相同(除了IP標識和checksum字段)。要驗證這一點,比較兩個報文的Packet Bytes①。
在Packet Details面板,注意到重傳報文在SEQ/ACK Analysis下面有些額外的信息②。這些信息是由Wireshark提供的而并非報文本身。SEQ/ACK Analysis告訴我們這確實是一個重傳報文,RTO值是0.206秒,此時的RTO是基于報文1的時間增量。
檢查剩下的報文會得到類似的結(jié)果,不同之處只有IP標識和checksum,以及RTO值。要使報文之間的時間間隔形象化,在Packet List面板中查看Time欄,如下圖所示。這里可以看到RTO值的翻倍增長關(guān)系。
TCP重復ACK以及快速重傳:
重復ACK是指在接收方收到亂序報文時,所發(fā)出的一類TCP報文。TCP使用報文頭的序列號和確認號以有效保證數(shù)據(jù)按照發(fā)送的順序接收和重組。
當TCP連接建立以后,握手過程中交換的一個最重要的信息是初始序列號(ISN)。一旦連接雙方設(shè)定了ISN之后,接下來發(fā)送的報文所包含的序列號增加一個數(shù)據(jù)載荷值。
假設(shè)有個主機ISN是5000,發(fā)送500字節(jié)報文至接收方。一旦報文接收之后,接收端回復一個ACK號為5500的TCP ACK報文,基于以下公式:
Sequence Number In + Bytes of Data Received = Acknowledgment Number Out
按照上述計算結(jié)果,返回發(fā)送端的確認編號實際上是接收端希望收到的序列號。示例如下圖:
數(shù)據(jù)接收方通過序列號來檢查報文丟失。接收方通過追蹤接收到的序列號,能夠確認序列號是否亂序。當接收方收到一個不正常的序列號,它會假設(shè)傳輸過程中有報文丟失。為了正確重傳數(shù)據(jù),接收方必須擁有丟失報文,所以它發(fā)送包含有丟失報文正確序列號的ACK報文,以便發(fā)送方重傳此報文。
當重傳主機從發(fā)送端接收到3個重復ACK時,它會假設(shè)此報文確實在傳送中丟失,并且立即發(fā)送一個快速重傳。一旦觸發(fā)了快速重傳,所有正在傳輸?shù)钠渌麍笪亩急环湃腙犃兄?,直到快速重傳報文發(fā)送為止。過程如下圖所示:
承接上文的彩圖:
本例中第一個報文如下圖:
重傳報文同樣可以通過Packet List面板的Info欄觀察到。報文呈現(xiàn)黑色背景紅色字體。這個報文的SEQ/ACK Analysis截面告訴我們這可能是一個快速重傳幀。(標識報文為快速重傳的信息不是報文本身所包含的內(nèi)容,而是Wireshark的功能)。最后一個報文是接收到快速重傳的ACK。
更多建議: