前面提到 TCP/IP 模型,TCP 和 IP 兩個協定可說是現今網路架構的最重要的協定之二。
TCP 在 OSI 及 TCP/IP 模型中都是屬於傳輸層的協定,而在傳輸層其實也有另一個廣泛被使用的協定,叫做 UDP(User Datagram Protocol,使用者資料報協定),做的事情略有不同。
聊完了 IP 之後,我們接著來看看這兩大傳輸層協定,先從 TCP 開始。
回顧一下 TCP 的全稱:Transmission Control Protocol 傳輸控制協議,這個協定故名思義就是在控制傳輸的大小事。
在 IP,網路層這個階段,基本上只管我從哪來、我往哪去?但是封包不見了、裡面的資料壞掉了,IP 一概不管。這時候 TCP 就起到至關重要的作用了!確保連線的可靠性就是其主要任務,它有一系列的手段去確保資料能夠送到對方手中,
IP 不可靠的部分,就留給 TCP 做了,包括確保資料抵達目的地、資料的順序一致(這是由於一份資料可能會被切成數份傳送)、資料沒有損壞、流量的控制等等。
TCP 會在兩個端點間建立一個連線(稱做 Socket Connection)來確保雙方的溝通順暢,就像是一條電話專線一樣。在這個連線之中,會在來源及目的各指定一個連接埠(Port),作為確認這個連線的編號。
由於 TCP 是基於 IP 的上面一層,TCP 的連線都會在同一個 IP Address 下,可以理解為都與同一台設備進行連線。但兩個設備間的連線可能不只一個,就會需要編號來分開不同的連線。用 Port(港口,計算機領域譯成連接埠)來命名編號,就像是在同一個地區(同一個 IP Address)有不同的港口。
*TCP Socket Connection
例如在 IP 位置為 87.65.43.21
的伺服器中開了一個 Port 80
,這是伺服器專門為 HTTP 開的 Port,伺服器會一直等待新的封包進來,看看有沒有 TCP 協定要傳的內容,Port 是指定 80
的,而這個等待連線產生的行為就被稱為監聽(Listen)。
IP 位置為 12.34.56.78
也是一台裝置,可能自己也有啟動一些服務,也有架設網站,因此也會監聽自己的 Port 80
。但當這台裝置也想連到另一台裝置使用對方 HTTP 服務的時候,它會找一個目前沒有在用的 Port,如 12345
(總之不能是現在有開的 22
, 80
Port),當作來源,和對方的 Port 80
建立合法的 TCP 連線。
Port 的數字大小必須介於 1-65535 間,因為 TCP 要存放來源及目的 Port 的長度只有 16 bits 而已。一些常用的服務都會被保留起來,例如 HTTP 這個應用層的服務通常都是 80、SSH 都是 22 等等,這是約定俗成的定義,也就是說如果你想,你也可以佔用這些 Port 去啟用你自己的網路服務。
要建立可靠的連線,TCP 提出的辦法是我知道你知道我知道,很饒舌吧!這個建立連線的方法稱做「三向交握」(Three-way handshake),原理其實很簡單,就是先丟個訊息和對方確認,對方回答,我們再做最後回應。
*TCP 三向交握
三次傳遞訊息分別用來達成及確認一些事情
你可能會想,第 3 次的訊息有必要嗎?不是在第 1 次就讓對方知道我們的訊息傳的到了?
這幾次交握的訊息中還藏著「序列號碼」(seq, sequence number)及「確認號」(ack, acknowledgement number)。由於一筆資料可能會很大,並且 IP 這個協定有限制每個封包的最大大小,因此 TCP 用序列號碼來記錄被分割後的每一份小資料。
*序列號碼及確認號
有了序列號碼之後,在交握同時會附帶這個訊息,對方收到後的回覆則會包含「確認號」,也就是對方期待收到的下個序列號碼為何,藉此來確保封包是連續的。
確認過眼神,便可以開始傳輸資料了,接下來,我們繼續看看 TCP 如何管理資料傳輸。