MSL、TTL和RTT簡介
1、MSL是Maximum Segment Lifetime英文的縮寫,中文可以譯為“報文最大生存時間”,他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。因為tcp報文(segment)是ip數據報(datagram)的數據部分,具體稱謂請參見《數據在網絡各層中的稱呼》一文,
2、而ip頭中有一個TTL域,TTL是time to live的縮寫,中文可以譯為“生存時間”,這個生存時間是由源主機設置初始值但不是存的具體時間,而是存儲了一個ip數據報可以經過的最大路由數,每經過一個處理他的路由器此值就減1,當此值為0則數據報將被丟棄,同時發送ICMP報文通知源主機。RFC 793中規定MSL為2分鍾,實際應用中常用的是30秒,1分鍾和2分鍾等。
2MSL即兩倍的MSL,TCP的TIME_WAIT狀態也稱為2MSL等待狀態,當TCP的一端發起主動關閉,在發出最后一個ACK包后,即第3次握手完成后發送了第四次握手的ACK包后就進入了TIME_WAIT狀態,必須在此狀態上停留兩倍的MSL時間,等待2MSL時間主要目的是怕最后一個ACK包對方沒收到,那么對方在超時后將重發第三次握手的FIN包,主動關閉端接到重發的FIN包后可以再發一個ACK應答包。在TIME_WAIT狀態時兩端的端口不能使用,要等到2MSL時間結束才可繼續使用。當連接處於2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設置SO_REUSEADDR選項達到不必等待2MSL時間結束再使用此端口。
TTL與MSL是有關系的但不是簡單的相等的關系,MSL要大於等於TTL。
3、 RTT是客戶到服務器往返所花時間(round-trip time,簡稱RTT),TCP含有動態估算RTT的算法。TCP還持續估算一個給定連接的RTT,這是因為RTT受網絡傳輸擁塞程序的變化而變化
4、 2MSL即兩倍的MSL,TCP的TIME_WAIT狀態也稱為2MSL等待狀態,當TCP的一端發起主動關閉,在發出最后一個ACK包后,即第3次握 手完成后發送了第四次握手的ACK包后就進入了TIME_WAIT狀態,必須在此狀態上停留兩倍的MSL時間,等待2MSL時間主要目的是怕最后一個 ACK包對方沒收到,那么對方在超時后將重發第三次握手的FIN包,主動關閉端接到重發的FIN包后可以再發一個ACK應答包。在TIME_WAIT狀態 時兩端的端口不能使用,要等到2MSL時間結束才可繼續使用。當連接處於2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設置 SO_REUSEADDR選項達到不必等待2MSL時間結束再使用此端口。對於TCP中的各種控制字段,接下來進行具體說明。
二、TCP控制字段標志:URG、ACK、PSH、RST、SYN、FIN
在TCP層,有個FLAGS字段,這個字段有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.
其中,對於我們日常的分析有用的就是前面的五個字段。
它們的含義是:
URG:Urget pointer is valid (緊急指針字段值有效)
SYN: 表示建立連接
FIN: 表示關閉連接
ACK: 表示響應
PSH: 表示有 DATA數據傳輸
RST: 表示連接重置。
其中,ACK是可能與SYN,FIN等同時使用的,比如SYN和ACK可能同時為1,它表示的就是建立連接之后的響應,如果只是單個的一個SYN,它表 示的只是建立連接。TCP的幾次握手就是通過這樣的ACK表現出來的。但SYN與FIN是不會同時為1的,因為前者表示的是建立連接,而后者表示的是斷開 連接。RST一般是在FIN之后才會出現為1的情況,表示的是連接重置。一般地,當出現FIN包或RST包時,我們便認為客戶端與服務器端斷開了連接;而 當出現SYN和SYN+ACK包時,我們認為客戶端與服務器建立了一個連接。PSH為1的情況,一般只出現在 DATA內容不為0的包中,也就是說PSH為1表示的是有真正的TCP數據包內容被傳遞。
TCP產生 RST響應的情況(屬於硬錯誤):
四次握手不是關閉 TCP連接的唯一方法. 有時,如果主機需要盡快關閉連接(或連接超時,端口或主機不可達),RST (Reset)包將被發送. 注意在,由於RST包不是TCP連接中的必須部分, 可以只發送RST包(即不帶ACK標記). 但在正常的TCP連接中RST包可以帶ACK確認標記
1. syn發送到服務器主機,但是目的端口並未運行。則產生一個ECONRFUSED錯誤。客戶端立即返回。比如telnet 192.168.1.55 8889,條件:55主機在局域網上並且可達(也可以換成可以到達的網絡ip地址),但是8889這個端口並未使用(可能服務器已經關閉),則服務器(對 方主機tcp內核)發送一個rst相應給客戶端,於是客戶端立即關閉。 注意一下,如果輸入的網絡ip不可達的話,客戶端將會持續發送syn,最后產生一個etimeout的錯誤,大概75秒左右。這個時候客戶端的默認網關 (192.168.1.1 211.2.2.2)因為找不到下一路由,路由器(或者再過幾跳的路由器)會產生一個EHOSTUNREACH響應給客戶端(注 意,ENETUNREACH和EHOSTUNREACH通常被認為是一個錯誤,因為ENETUNREACH一般當作已過時),由於這是個軟錯誤(有可能是 網絡暫時不通造成的)。客戶端會重發syn直到超時。
所以會有 telnet 192.168.1.55 8888 主機存在,但是端口未開,ECONRFUSED錯誤,立刻返回
telnet 192.168.1.56 * 主機不存在,UNROUTETOHOST錯誤,立刻返回
telnet 211.1.1.5 * 主機不存在,etimeout錯誤
2. 最簡單的情況,服務器主動發送rst給客戶端關閉連接。客戶端read write直接返回rst錯誤。
3. 服務器收到一個不存在的連接返回rst響應。比如,服務器重啟之后,先前的一個已連接的客戶端毫不之情的情況下,這就是半閉連接(跟半開連接最大的不同是,半閉連接是不能使用的,半開連接可以使用)。
此時,如果客戶端read的話(接收緩沖無數據)產生一個EPEERRST錯誤
如果客戶端write的話且發送數據小於發送緩沖區剩余容量時,第一次write成功,第二次write或者read的時候就會產生一個 EPEERRST的錯誤。因為write發送數據是直接把要發送的數據拷貝到內核的tcp發送緩沖區就立刻返回成功的。當然拷貝之前會先檢查一下tcp連 接有無錯誤。所以第二次發送或者接收的時候,發現連接上已經有了EPEERRST的錯誤,所以就返回錯誤(話說回來,第一次發送的數據實際上根本就沒有發 送成功,對方根本就沒接受它)