TCP的幾種狀態: (SYN, FIN, ACK, PSH, RST, URG)

在TCP層,有個FLAGS字段,這個字段有如下幾個標識:SYN, FIN, ACK, PSH, RST, URG.安全

其中,對於咱們平常的分析有用的就是前面的五個字段。 它們的含義是: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包時,咱們認爲客戶端與服務器創建了一個鏈接。tcp

PSH爲1的狀況,通常只出如今 DATA內容不爲0的包中,也就是說PSH爲1表示的是有真正的TCP數據包內容被傳遞。 TCP的鏈接創建和鏈接關閉,都是經過請求-響應的模式完成的。接口

TCP三次握手: TCP(Transmission Control Protocol)傳輸控制協議 TCP是主機對主機層的傳輸控制協議,提供可靠的鏈接服務,採用三次握手確認創建一個鏈接:io

位碼即tcp標誌位,有6種標示:SYN(synchronous創建聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認號碼)隨機數

三次握手詳解以下: 一個虛擬鏈接的創建是經過三次握手來實現的服務器端

  1. (B) –> [SYN] –> (A) 假如服務器A和客戶機B通信. 當A要和B通訊時,B首先向A發一個SYN (Synchronize) 標記的包,告訴A請求創建鏈接. 注意: 一個 SYN包就是僅SYN標記設爲1的TCP包(參見TCP包頭Resources). 認識到這點很重要,只有當A受到B發來的SYN包,纔可創建鏈接,除此以外別無他法。所以,若是你的防火牆丟棄全部的發往外網接口的SYN包,那麼你將不能讓外部任何主機主動創建鏈接。
  2. (B) <– [SYN/ACK] <–(A) 接着,A收到後會發一個對SYN包的確認包(SYN/ACK)回去,表示對第一個SYN包的確認,並繼續握手操做. 注意: SYN/ACK包是僅SYN 和 ACK 標記爲1的包.
  3. (B) –> [ACK] –> (A) B收到SYN/ACK 包,B發一個確認包(ACK),通知A鏈接已創建。至此,三次握手完成,一個TCP鏈接完成 Note: ACK包就是僅ACK 標記設爲1的TCP包. 須要注意的是當三此握手完成、鏈接創建之後,TCP鏈接的每一個包都會設置ACK位 握手階段: 序號 方向 seq ack 1  A->B 10000 0 2 B->A 20000 10000+1=10001 3 A->B 10001 20000+1=20001 解釋: 1:A向B發起鏈接請求,以一個隨機數初始化A的seq,這裏假設爲10000,此時ACK=0 2:B收到A的鏈接請求後,也以一個隨機數初始化B的seq,這裏假設爲20000,意思是:你的請求我已收到,我這方的數據流就從這個數開始。B的ACK是A的seq加1,即10000+1=10001 3:A收到B的回覆後,它的seq是它的上個請求的seq加1,即10000+1=10001,意思也是:你的回覆我收到了,我這方的數據流就從這個數開始。A此時的ACK是B的seq加1,即20000+1=20001 數據傳輸階段: 序號  方向      seq ack size 23 A->B 40000 70000 1514 24 B->A 70000 40000+1514-54=41460 54 25 A->B 41460 70000+54-54=70000 1514 26 B->A 70000 41460+1514-54=42920 54 解釋: 23:B接收到A發來的seq=40000,ack=70000,size=1514的數據包 24:因而B向A也發一個數據包,告訴B,你的上個包我收到了。B的seq就以它收到的數據包的ACK填充,ACK是它收到的數據包的SEQ加上數據包的大小(不包括以太網協議頭,IP頭,TCP頭),以證明B發過來的數據全收到了。 25:A在收到B發過來的ack爲41460的數據包時,一看到41460,正好是它的上個數據包的seq加上包的大小,就明白,上次發送的數據包已安全到達。因而它再發一個數據包給B。這個正在發送的數據包的seq也以它收到的數據包的ACK填充,ACK就以它收到的數據包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長,沒數據項)。 其實在握手和結束時確認號應該是對方序列號加1,傳輸數據時則是對方序列號加上對方攜帶應用層數據的長度.若是從以太網包返回來計算所加的長度,就嫌走彎路了. 另外,若是對方沒有數據過來,則本身的確認號不變,序列號爲上次的序列號加上本次應用層數據發送長度.
相關文章
相關標籤/搜索