TCP協議學習總結

 

1.傳輸全雙工通訊,即 一個連接 雙向通訊 互不影響html

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

  含義是:服務器

  SYN表示創建鏈接,網絡

  FIN表示關閉鏈接,spa

  ACK表示響應,.net

  PSH表示有 DATA數據傳輸,htm

  RST表示鏈接重置。blog

3.TCP創建連接須要三次握手:接口

 

  

  1). C -> S  標誌位:SYN = 1 , ACK = 0 ,隨機序列號:seq:10000 io

  (如何理解:客戶端C 本身隨機一個序列號seq發送給服務端 ;發送標識 SYN = 1 & ACK = 0 表示要求創建連接)

  發送報文:SYN=1,ACK=0,SEQ=10000 

 

  2). S -> C  標誌位:SYN = 1 , ACK = 1 ,隨機序列號:seq:20000,ack:10000 +1

   (如何理解:服務端S 接到 SYN = 1 & ACK = 0 標識的報文後, 本身隨機一個序列號seq,並將客戶端的seq+1 做爲ack發送給客戶端 ;發送 標識 SYN = 1 & ACK = 1 表示已收到新連接請求,請繼續握手)

  發送報文:SYN=1,ACK=1,SEQ=20000,ack=10001

 

 

  3). C -> S 標誌位:SYN = 0 , ACK = 1 ,序列號:seq:10001,ack:2000+1

  (如何理解:客戶端C 接到 SYN = 1 & ACK = 1 標識的報文後, 檢查收到ack是否是等於本身第一發送的seq +1,若是正確則將服務端的seq+1 做爲ack發送給客戶端 ;發送 標識 SYN = 0 & ACK = 1 表示客戶端已與服務端確認連接,此時連接成功,能夠傳輸數據。)

 

 

 

 

 

  內容參考引用:

    http://blog.csdn.net/onlyou930/article/details/7386484

    http://www.cnblogs.com/azraelly/archive/2012/12/25/2832393.html

  PS1:

 在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接。  第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;  第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務 器進入SYN_RECV狀態;

 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據

 

PS2:

 

三次握手Three-way Handshake

一個虛擬鏈接的創建是經過三次握手來實現的

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位

這就是爲什麼鏈接跟蹤很重要的緣由了. 沒有鏈接跟蹤,防火牆將沒法判斷收到的ACK包是否屬於一個已經創建的鏈接.通常的包過濾(Ipchains)收到ACK包時,會讓它經過(這絕對不是個 好主意). 而當狀態型防火牆收到此種包時,它會先在鏈接表中查找是否屬於哪一個已建鏈接,不然丟棄該包

四次握手Four-way Handshake

四次握手用來關閉已創建的TCP鏈接

1. (B) --> ACK/FIN --> (A)

2. (B) <-- ACK <-- (A)

3. (B) <-- ACK/FIN <-- (A)

4. (B) --> ACK --> (A)

注意: 因爲TCP鏈接是雙向鏈接, 所以關閉鏈接須要在兩個方向上作。ACK/FIN 包(ACK 和FIN 標記設爲1)一般被認爲是FIN(終結)包.然而, 因爲鏈接尚未關閉, FIN包老是打上ACK標記. 沒有ACK標記而僅有FIN標記的包不是合法的包,而且一般被認爲是惡意的

鏈接復位Resetting a connection

四次握手不是關閉TCP鏈接的惟一方法. 有時,若是主機須要儘快關閉鏈接(或鏈接超時,端口或主機不可達),RST (Reset)包將被髮送. 注意在,因爲RST包不是TCP鏈接中的必須部分, 能夠只發送RST包(即不帶ACK標記). 但在正常的TCP鏈接中RST包能夠帶ACK確認標記

請注意RST包是能夠不要收到方確認的?

無效的TCP標記Invalid TCP Flags

到目前爲止,你已經看到了 SYN, ACK, FIN, 和RST 標記. 另外,還有PSH (Push) 和URG (Urgent)標記.

最多見的非法組合是SYN/FIN 包. 注意:因爲 SYN包是用來初始化鏈接的, 它不可能和 FIN和RST標記一塊兒出現. 這也是一個惡意攻擊.

因爲如今大多數防火牆已知 SYN/FIN 包, 別的一些組合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明顯,當網絡中出現這種包時,很你的網絡確定受到攻擊了。

別的已知的非法包有FIN (無ACK標記)和"NULL"包。如同早先討論的,因爲ACK/FIN包的出現是爲了關閉一個TCP鏈接,那麼正常的FIN包老是帶有 ACK 標記。"NULL"包就是沒有任何TCP標記的包(URG,ACK,PSH,RST,SYN,FIN都爲0)。

到目前爲止,正常的網絡活動下,TCP協議棧不可能產生帶有上面提到的任何一種標記組合的TCP包。當你發現這些不正常的包時,確定有人對你的網絡不懷好意。

 

PS3: 數據傳輸階段:

序號  方向    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,傳輸數據時則是對方序列號加上對方攜帶應用層數據的長度.若是從以太網包返回來計算所加的長度,就嫌走彎路了. 另外,若是對方沒有數據過來,則本身的確認號不變,序列號爲上次的序列號加上本次應用層數據發送長度.

相關文章
相關標籤/搜索