昨天看 netstat 的時候,我看到一個狀態叫做:
ESTABLISHED
意思是連線已經建立。
但我還是不知道連線到底是怎麼建立的?
總不可能電腦直接大喊:
「我要開始傳資料囉!」
然後對方就莫名其妙開始收。
所以今天來認識一個常聽到的東西:
TCP。
TCP 是一種比較「有禮貌」的傳輸方式。
在真正傳資料之前,它會先確認對方是否存在、能不能溝通。
最常聽到的就是:
三向交握 Three-Way Handshake (也有人翻譯三次握手)
名字聽起來很怪,但其實可以想成聊天前的確認。
大概像這樣:
我:「哈囉,可以講話嗎?」
對方:「可以,我聽到了,你也聽得到我嗎?」
我:「聽得到,那我們開始吧。」
換成 TCP 的說法就是:
SYN:我想建立連線SYN-ACK:我收到,也同意連線ACK:確認收到,那開始傳資料完成之後,連線才會進入 ESTABLISHED。
這讓我覺得滿有趣的。
以前我以為打開網站,就是瀏覽器直接把資料丟出去。
但其實在真正看到網頁之前,電腦已經默默做了很多事情。
先查 DNS。
找到 IP。
透過 Gateway 出門。
找到對方的 Port。
然後 TCP 先打招呼。
最後才開始傳資料。
所以一個看起來很簡單的「打開網頁」,背後其實是一連串流程。
可以再打開命令提示字元,輸入:
netstat -ano
然後找看看有沒有:
ESTABLISHED
如果有,代表你的電腦正在和某個地方保持連線。
因此 ESTABLISHED 不是憑空出現的,它背後代表 TCP 已經完成打招呼。
TCP 在傳資料前,會先確認雙方能不能溝通。
這就像真正開始聊天以前,先確認對方有沒有聽到。
也難怪資安裡常常會提到連線狀態,因為它可以幫我們判斷:
誰正在連?
連線有沒有成功?
對方是不是一直在嘗試建立連線?
明天我們來看另一種比較不囉嗦的傳輸方式。
它不像 TCP 會先打招呼,而是直接把資料丟出去。
Day 8:UDP:不等你回我,我先丟了再說。