TCP (Transmission Control Protocol) 是一個傳輸層上的協定。他的目標是替兩個端點建立可靠的位元流連線。更明確地說,TCP 的目標是提供具有以下特徵的服務:
TCP 的目標,是替網路上的兩個 endpoint 提供個邏輯上的連線。「邏輯上」的意思是:儘管這些資料在網路上並不由一條實體、固定的線路來傳輸(因為一個資料可能被分裝成多個由不同路徑傳輸的 IP 封包),但藉由 TCP 這一層服務,使用者總是可以把這個兩個 endpoint 之間的傳輸,在概念上想像成是兩者藉由一個抽象的固定連線來傳輸。
因此,在使用 TCP 時,必須先「建立連線」。建立連線的意思是類似於使用講電話時,一方要先打電話,打了之後另外一方要接起來,兩者才能互相通訊。而不用建立連線的傳輸協定如剛剛的 UDP,他就像寫信一樣,把寄件人地址與收件人地址寫上去,丟給 UDP 之後就什麼都不用管了。
這樣一個建構在 IP 之上的,邏輯上的連線,既然其資料封包有可能因為使用底下的 IP 而經由不同路徑傳輸,所以不同連線之間實際上在 IP 的傳遞路徑也可能有所不同。這就導致不同連線之間的 round trip time 可能大不相同。
「可靠」的意思是:只要發送方與接收方都遵守 TCP,那不管發送方將什麼樣的資料交給 TCP,TCP 都有能力把這個資料原封不動地交給目的地的。不管資料是不是有可能被分割經由不同路徑的封包送達、封包遺失、順序不對、封包延遲等狀況,TCP 都要有辦法克服對應的情境。
另外一個 TCP 提供的抽象層,是發送方與接收方都可以將傳送/接收的資料視為位元流 –- 儘管中間的傳輸是使用封包。這個意思是:使用 TCP 傳輸時,發送方能夠逐個位元傳輸,而接收方會依照同樣的順序,逐個位元收到。兩者都不用去在意這些位元流中的資料怎麼樣被分裝成不同的封包,只要知道自己拿到的東西是位元流就好了。
既然不用在意這個傳送的位元流怎樣被分裝,所以發送方與其逐個位元傳輸,不如等資料累積到一定數量的時候,再把這些資料一口氣傳輸出去。而一個集滿了這個「一定的量」的資料所形成的 TCP 封包,稱為一個 TCP 的 segment:
這樣做也有助於 throughput 的提升。因為一個封包除了資料之外,還會包含 header。如果資料被分裝的太瑣碎,每一個分裝的資料又都需要一個 header,那就會導致耗費大量的流量在傳輸 header,而不是資料。
TCP 也可以讓「接收者主導傳送的節奏」。如果發送方送太快時,可以透過 TCP 的某些機制,讓讓送方慢下來。
而這件事情更具體地來說,是在傳輸的過程中,雙方都會有辦法知道對方資源有多少。這個「資源」是指如 buffer 容量有多大?buffer 現在還剩多少?
這個意思是: TCP 有辦法知道整個網路是否正在「塞車」(也就是「阻塞」),並且可以依照依照整個壅塞程度,判斷要送多少東西。這樣的壅塞程度有可能會隨時間而變化,而 TCP 也有方法應對這個狀況。