程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> TCP協議學習總結,tcp協議總結

TCP協議學習總結,tcp協議總結

編輯:C#入門知識

TCP協議學習總結,tcp協議總結


小分享:我有幾張阿裡雲優惠券,用券購買或者升級阿裡雲相應產品最多可以優惠五折!領券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03


 

1.傳輸全雙工通信,即 一個鏈接 雙向通信 互不影響

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

  含義是:

  SYN表示建立連接,

  FIN表示關閉連接,

  ACK表示響應,

  PSH表示有 DATA數據傳輸,

  RST表示連接重置。

3.TCP建立鏈接需要三次握手:

 

  

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

  (如何理解:客戶端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,傳輸數據時則是對方序列號加上對方攜帶應用層數據的長度.如果從以太網包返回來計算所加的長度,就嫌走彎路了.
另外,如果對方沒有數據過來,則自己的確認號不變,序列號為上次的序列號加上本次應用層數據發送長度.

 

參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved