TCP: SYN ACK FIN RST PSH URG 詳解

來源:互聯網
上載者:User

TCP的三向交握是怎麼進行的了:發送端發送一個SYN=1,ACK=0標誌的資料包給接收端,請求進行串連, 這是第一次握手;接收端收到請求並且允許串連的話,就會發送一個SYN=1,ACK=1標誌的資料包給發送端,告訴它,可以通訊了,並且讓發送端發送一個 確認資料包,這是第二次握手;最後,發送端發送一個SYN=0,ACK=1的資料包給接收端,告訴它串連已被確認,這就是第三向交握。之後,一個TCP連 接建立,開始通訊。

*SYN:同步標誌
同步序列編號(Synchronize Sequence
Numbers)欄有效。該標誌僅在三向交握建立TCP串連時有效。它提示TCP已連線的服務端檢查序列編號,該序列編號為TCP串連初始端(一般是客戶
端)的初始序列編號。在這裡,可以把TCP序列編號看作是一個範圍從0到4,294,967,295的32位計數器。通過TCP串連交換的資料中每一個字
節都經過序列編號。在TCP前序中的序列編號欄包括了TCP分段中第一個位元組的序列編號。

*ACK:確認標誌
確認編號(Acknowledgement Number)欄有效。大多數情況下該標誌位是置位的。TCP前序內的確認編號欄內包含的確認編號(w+1,Figure-1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有資料。

*RST:複位標誌
複位標誌有效。用於複位相應的TCP串連。

*URG:緊急標誌
緊急(The urgent pointer) 標誌有效。緊急標誌置位,

*PSH:推標誌
該標誌置位時,接收端不將該資料進行隊列處理,而是儘可能快將資料轉由應用處理。在處理 telnet 或 rlogin 等互動模式的串連時,該標誌總是置位的。

*FIN:結束標誌
帶有該標誌置位的資料包用來結束一個TCP回話,但對應連接埠仍處於開放狀態,準備接收後續資料。

=============================================================

三向交握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包時,會讓它通過(這絕對不是個
好主意). 而當狀態型防火牆收到此種包時,它會先在串連表中尋找是否屬於哪個已建串連,否則丟棄該包

===============================================================================

四次握手用來關閉已建立的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包。當你發現這些不正常的包時,肯定有人對你的網路不懷好意。

UDP (使用者資料包協議User Datagram Protocol)
TCP是連線導向的,而UDP是非串連的協議。UDP沒有對接受進行確認的標記和確認機制。對丟包的處理是在應用程式層來完成的。(or accidental arrival).

此處需要重點注意的事情是:在正常情況下,當UDP包到達一個關閉的連接埠時,會返回一個UDP複位包。由於UDP是非連線導向的, 因此沒有任何確認資訊來確認包是否正確到達目的地。因此如果你的防火牆丟棄UDP包,它會開放所有的UDP連接埠(?)。

由於Internet上正常情況下一些包將被丟棄,甚至某些發往已關閉連接埠(非防火牆的)的UDP包將不會到達目的,它們將返回一個複位UDP包。

因為這個原因,UDP連接埠掃描總是不精確、不可靠的。

看起來大UDP包的片段是常見的DOS (Denial of Service)攻擊的常見形式 (這裡有個DOS攻擊的例子,http://grc.com/dos/grcdos.htm ).

ICMP (網間控制訊息協議Internet Control Message Protocol)

同名字一樣, ICMP用來在主機/路由器之間傳遞控制資訊的協議。 ICMP包可以包含診斷資訊(ping, traceroute -
注意目前unix系統中的traceroute用UDP包而不是ICMP),錯誤資訊(網路/主機/連接埠 不可達 network/host/port
unreachable), 資訊(時間戳記timestamp, 位址遮罩address mask request, etc.),或控制資訊
(source quench, redirect, etc.) 。

你可以在http://www.iana.org/assignments/icmp-parameters中找到ICMP包的類型。

儘管ICMP通常是無害的,還是有些類型的ICMP資訊需要丟棄。

Redirect (5), Alternate Host Address (6), Router Advertisement (9) 能用來轉寄通訊。
Echo (8), Timestamp (13) and Address Mask Request (17) 能用來分別判斷主機是否起來,本地時間和位址遮罩。注意它們是和返回的資訊類別有關的。它們自己本身是不能被利用的,但它們泄露出的資訊對攻擊者是有用的。

ICMP訊息有時也被用來作為DOS攻擊的一部分(例如:洪水ping flood ping,死 ping ?呵呵,有趣 ping of death)?/p>

包片段注意A Note About Packet Fragmentation

如果一個包的大小超過了TCP的最大段長度MSS (Maximum Segment Size) 或MTU (Maximum Transmission Unit),能夠把此包發往目的的唯一方法是把此包分區。由於包分區是正常的,它可以被利用來做惡意的攻擊。

因為分區的包的第一個分區包含一個包頭,若沒有包分區的重組功能,包過濾器不可能檢測附加的包分區。典型的攻擊Typical attacks
involve in overlapping the packet data in which packet header is
典型的攻擊Typical attacks involve in overlapping the packet data in which
packet header isnormal until is it overwritten with different
destination IP (or port) thereby bypassing firewall rules。包分區能作為 DOS
攻擊的一部分,它可以crash older IP stacks 或漲死CPU串連能力。

Netfilter/Iptables中的串連跟蹤代碼能自動做分區重組。它仍有弱點,可能受到飽和串連攻擊,可以把CPU資源耗光。

握手階段:
序號 方向 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,傳輸資料時則是對方序號加上對方攜帶應用程式層資料的長度.如果從乙太網路包返回來計算所加的長度,就嫌走彎路了.
另外,如果對方沒有資料過來,則自己的確認號不變,序號為上次的序號加上本次應用程式層資料發送長度.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.