TCP控制字段標誌:URG、ACK、PSH、RST、SYN、FIN

在TCP層,有個FLAGS字段,這個字段有如下幾個標識:SYN, FIN, ACK, PSH, RST, URG.
其中,對於咱們平常的分析有用的就是前面的五個字段。
服務器

它們的含義是:網絡

URG:Urget pointer is valid (緊急指針字段值有效)tcp

SYN: 表示創建鏈接spa

FIN: 表示關閉鏈接指針

ACK: 表示響應orm

PSH: 表示有 DATA數據傳輸ip

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數據包內容被傳遞。get

      TCP產生 RST響應的狀況(屬於硬錯誤):it

       四次握手不是關閉 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的錯誤,因此就返回錯誤(話說回來,第一次發送的數據實際上根本就沒有發送成功,對方根本就沒接受它)

相關文章
相關標籤/搜索