12月 05, 2010

TCP 協定

Sliding Window 是一個機制,就視窗在那邊滑呀滑的
可以控制的參就是 window size

來源端的 Sliding Window 稱為 Send Window
目的端的 Sliding Window 稱為 Receive Window

[Establish Connection]

0. 雙方皆處於『CLOSED』狀態

1. [Server 端]
當Server端發生『passive OPEN』的事件後,便會進行『create TCB』的動作,
並進入『LISTEN』的狀態。因為在Server端啟動『服務』(service),
並使用TCP協定時,是屬於被動的角色,所以在Server端對TCP的開啟,
稱之為『passive OPEN』,隨即便會在系統中,建立一個『傳輸控制區塊』
(Transmission Control Block,簡稱TCB),用來儲存Server端有關TCP的所有資訊。
也由於Server 端必須先進入『LISTEN』狀態才能接受Client端的連線請求

2. [Client 端]
當Client發生『active OPEN』事件後,即進行『create TCB and SYN』的動作,
並進入『SYN SENT』的狀態。因為在Client端使用TCP協定時,是屬於主動的角色,
所以在Client端對TCP的開啟,稱之為『active OPEN』,隨即便會在系統中,
建立一個『傳輸控制區塊』(Transmission Control Block, 簡稱TCB),
用來儲存Client端有關 TCP的所有資訊,同時也送出SYN同步訊息給Server端,
也就是進行『三向交握』的第一個動作

3. [Server端]
當Server發生『receive SYN』事件後,即進行『send SYN, ACK』的動作。
換言之,當Server端收到Client端傳送過來同步訊息SYN時,便會傳送SYN與ACK
給Client端,也就是進行『三向交握』的第二個動作

4. [Client端]
當Client發生『receive SYN, ACK』事件後,即進行『send ACK』的動作。
換言之,當Client端收到Server端回應的確認訊息ACK與同步訊息SYN時,
便會回應一個確認訊息ACK給Server端,也就是進行『三向交握』的第三個動作,
並進入『ESTABLISHED』狀態

5. [Server端]
當Server發生『receive ACK of SYN』事件後,不做任何動作,
直接進入『ESTABLISHED』狀態。換言之,就是在收到Client端回應的確認訊息
ACK後,不執行任何動作,直接進入『ESTABLISHED』狀態

[Close Connection]

0. 雙方皆已處於『ESTABLISHED』狀態。
1. A端的程式要準備關閉連線,會發生『CLOSE』的事件,進行『send FIN』的動作
進入『FIN WAIT-1』的狀態

2. 當 B 端『receive FIN』後,會進行『send ACK』的動作,
並進入『CLOSE WAIT』狀態。

3. 當 A 端發生『receive ACK of FIN』事件後,便直接進入『FIN WAIT-2』狀態。
換言之,收到 B 端回應的確認訊息ACK之後,不執行任何動作直接進入 FIN WAIT-2

4. 之後 B 端會發生『CLOSE』事件後,進行『send FIN』 進入『LAST ACK』狀態

5. 當 A 端發生『receive FIN』的事件後,便會進行『send ACK』的動作,
並進入『TIME WAIT』的狀態。

6. 當 B 端發生『receive ACK of FIN』事件,直接進入『CLOSED』狀態,
不執行任何動作。 B 的動作到此完成。

7. A 會在 TIME WAIT 狀態等待 [Timeout=2MSL] 事件後,便會執行[delete TCB]
進入[CLOSED]的狀態。換言之,就是A端等待2MSL(Max Segment Lifetime, 簡稱MSL)
時間過後,便將系統在『建立連線』階段所建立的 TCB 刪除,

2MSL:
TCP 的封包在傳輸時,不一定會同時到達;當"連線中止"後,有可能收到先前傳送
但延遲到達的封包。

若新連線在舊連線關閉後,又立刻建立起來(新舊用同 port),這樣會造成錯誤。
延遲到達的封包,應該是歸屬前個連線,現在卻送到新的連線。舊封包送給新連線。

所以 2MSL 表示,如果一條 TCP 連線之前已經用過了,為了避免已關閉連線
干擾到新建立的連線,規定連線關閉 2MSL 時間內,不可以建立相同連線。

MSL 這個單位是指 max segment lifetime 封包最長存活時間
在網路中封包只能存活 1 MSL ,現在等待 2MSL 可以放心了。

**

TCP 的 SYN 氾濫攻擊法(TCP SYN Flooding Attack)
1) Client端送出一個 SYN 的訊息給伺服端,要求連線。
2) 伺服端在收到,會做兩件事:
a. 回應 SYN-ACK 表示準備連線
b. 在 Queue 中建立一個 TCP Connection Entry,直到完成連線後才移除
3) 正常的 Client 收到 SYN-ACK 之後,會回應一個 ACK 表示連線正式建立完成。

SYN 攻擊,惡意連線不會做第3步,此時 server 會一直等,直到 timeout
才會移除該筆 tcp connection entry。每個伺服器的佇列能容納 TCP Connection Entry
個數有線,一旦佇列存滿後,後來的連線將會被丟棄(discard)

方法
偽造自己的IP Address為其他主機或是不存在的主機
進行三向交握,此時受攻擊者伺服器將會一直等待(wait)『三向交握』的
第三步驟ACK回應,直到逾時,形成『半開啟連線』(half-open connection)

**

在 TCP 封包內有 options 欄位,主要有幾種選擇性的功能可用:

1. MSS (maximum segment size)
連線建立時,用來指定 tcp payload 可以承載的最大 size ,這個值是不包含 HDR的
雙方在初始溝通後,會選定最小值,也就是 min(MSSa , MSSb)

{ 乙太HDR | [ IP HDR | (TCP HDR | TCP BODY) ] }

因為 TCP 是封裝再 IP 內,再丟給乙太,而乙太最大 payload 是 1500

所以 TCP payload = 1500 - IP HDR(20) - TCP HDR(20) = 1460

MSS = Transport 層最大 payload = 1460 byte (可以承載的 淨容量 就對了)

(註) MTU(Maximum Tansmission Unit)
則是代表 Data Link 層最大的 Payload (如果是乙太的話, MTU=1500)

沒有留言:

張貼留言