絕大多數通訊協定接是以 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
若沒有三向交握,將無法與任何外部主機建立連線。
透過 Wireshark,來看一組三向交握的例子
位置發送一個 SYN 封包至欲連線端口 31.13.87.5 以建立連線,從 TCP header 中的 Flag 可得到此封包為 SYN 的標記,並且會從目標端口接收到 SYN, ACK 標記之封包,接著發送 ACK 標記的封包以完成連線確認。
TCP 協定封包傳輸:
封包在傳送間會設定計時器,
當網路延遲過久,發送端遲遲未接收到確認包時,
則會判定封包遺失,重新發送該封包,
若確認接收則會取消該封包計時器,繼續傳送下一個封包。
封包遺失情況:
由於接收端可能因為網路延遲,
導至傳送端重覆傳送相同封包,
因此傳送協定會為每個封包給予序號,
序號除了能供接收端進行封包排序外,
當接收端接收到相同序號封包時則會直接丟棄。
留言列表