close
相較於 UDP 來說,TCP 屬於較安全的通訊協定,

絕大多數通訊協定接是以 TCP 方式做連結,

在每次封包來往皆會有一組傳輸與確認的訊息,

可以避免因為丟包所產生的影響,但相對的傳輸速度較慢, 

少部分像 Youtube 或 skype 影像會議等,為了確保速度而選擇使用 UDP 協定。

其中在開啟與目標 IP 的連結前,TCP 協定會先與目標 IP port 進行三向交握來做連結確認。


三向交握(Three Way Handshake):

先以一個例子來作說明,

小明今天撥了一組電話號碼打到小華家

接通後...

小明:喂,請問小華在嗎?

小華:我就是,來電顯示是小明的電話號碼,請問你是小明嗎?

小明:對呀,就是我

上面這三句就很像 TCP 進行連結前確認的三向交握對話

在與目標 IP 建立連結前,TCP 協定會先丟一個小封包給目標 IP,

這個用來測試的封包會帶有 [ SYN ](Synchronize, 同步)的旗幟(flag),

等目標 IP 收到這個 [ SYN ] 封包後則會回傳一個帶有 [ SYN, ACK ](Acknowledge, 確認)的封包,

告訴我們目標 IP 有收到囉!!

這時我們會在發送一個 [ ACK ] 的封包給目標 IP,即完成了整個三向交握。

整個過程就像下圖,圖片取自 https://blog.jason.party/7/three-way-handshake

Three-way-Handshake1.png

若沒有三向交握,將無法與任何外部主機建立連線。 

透過 Wireshark,來看一組三向交握的例子

Image.png

位置發送一個 SYN 封包至欲連線端口 31.13.87.5 以建立連線,從 TCP header 中的 Flag 可得到此封包為 SYN  的標記,並且會從目標端口接收到 SYN, ACK 標記之封包,接著發送 ACK 標記的封包以完成連線確認。

端口在接收到 ACK 包時會先連接追蹤發包的來源,若沒有連接追蹤,防火牆會無法判斷 ACK 包是屬於哪個已經建立的連結,一般封包過濾 (Ipchains) 會讓他直接通過,會有資訊安全方面疑慮,而狀態型防火牆會檢查連接表中是否有對應的連結位置,若找不到則丟棄該包。
 

TCP 協定封包傳輸:

TCP 封包傳送會有接收確認訊息,如下圖及說明。
 
正常傳送情況:

Image.png

封包在傳送間會設定計時器,

當網路延遲過久,發送端遲遲未接收到確認包時,

則會判定封包遺失,重新發送該封包,

若確認接收則會取消該封包計時器,繼續傳送下一個封包。

 

封包遺失情況:

Image2.png

由於接收端可能因為網路延遲,

導至傳送端重覆傳送相同封包,

因此傳送協定會為每個封包給予序號,

序號除了能供接收端進行封包排序外,

當接收端接收到相同序號封包時則會直接丟棄。


 
四向交握(Four Way Handshake)
Four-way Handshake 是用來關閉連線,封包的發送順序如下:
 
1. (B) --> [ ACK/FIN ]--> (A)
2. (B) <-- [ ACK ]<-- (A)
3. (B) <-- [ ACK/FIN ]<-- (A)
4. (B) --> [ ACK ]--> (A)
 
從上述四個程序中可看出,TCP 在關閉連線亦必需是雙向確認,各發送一組 ACK/FIN 使對方確認關閉,
通常有四個,若只看到兩個可能是為了使連線 Keep-Alive,若有其他傳輸需求時可繼續連線,而不必重新建立。
 
僅有 FIN 標記的封包通常被認為是惡意的
 

 

連接復位(Resetting a Connection)
 
(A) --> [ RST ]--> (B)
 
連接復位也是用來關閉連線的一種方式,較快速,
藉由發送 RST (Reset) 包,不帶 ACK 旗幟,且不必等到接收方發送 ACK 包,即單方面立即關閉連線
 

 
常見的惡意攻擊封包像是帶有 [ SYN/FIN ]、[ SYN/RST ]、[ SYN/FIN/PSH ]、[ SYN/FIN/RST ]、[ SYN/FIN/RST/PSH ] 旗幟的封包
還有像是 TCP 封包若不帶任何旗幟 [ NULL ] 也可能是帶有惡意。
 
 
參考來源:
 中勝拼圖 Jason Puzzle - TCP 三向交握 https://blog.jason.party/7/three-way-handshake
 

 

有任何問題或有錯誤麻煩不吝指教,感謝。
By Lach
arrow
arrow
    全站熱搜

    Lachlan 發表在 痞客邦 留言(0) 人氣()