http://wushank.blog.51cto.com/3489095/1135060html
1、 msl、ttl及rtt的區別算法
一、 MSL 是Maximum Segment Lifetime英文的縮寫,中文能夠譯爲「報文最大生存時間」,他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。由於tcp報文 (segment)是ip數據報(datagram)的數據部分,具體稱謂請參見《數據在網絡各層中的稱呼》一文;
二、ip頭中有一個TTL域,TTL是 time to live的縮寫,中文能夠譯爲「生存時間」,這個生存時間是由源主機設置初始值但不是存的具體時間,而是存儲了一個ip數據報能夠通過的最大路由數,每經 過一個處理他的路由器此值就減1,當此值爲0則數據報將被丟棄,同時發送ICMP報文通知源主機。RFC 793中規定MSL爲2分鐘,實際應用中經常使用的是30秒,1分鐘和2分鐘等。
TTL與MSL是有關係的但不是簡單的相等的關係,MSL要大於等於TTL。
三、 RTT是客戶到服務器往返所花時間(round-trip time,簡稱RTT),TCP含有動態估算RTT的算法。TCP還持續估算一個給定鏈接的RTT,這是由於RTT受網絡傳輸擁塞程序的變化而變化服務器
四、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中的各類控制字段,接下來進行具體說明。網絡
2、TCP控制字段標誌:URG、ACK、PSH、RST、SYN、FINtcp
在TCP層,有個FLAGS字段,這個字段有如下幾個標識:SYN, FIN, ACK, PSH, RST, URG.
其中,對於咱們平常的分析有用的就是前面的五個字段。post
它們的含義是:spa
URG:Urget pointer is valid (緊急指針字段值有效).net
SYN: 表示創建鏈接指針
FIN: 表示關閉鏈接htm
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的錯誤,因此就返回錯誤(話說回來,第一次發送的數據實際上根本就沒有發 送成功,對方根本就沒接受它)