深入理解TCP:解答這10個關鍵問題

程式設計碼農發表於2023-04-22

TCP介紹

TCP(Transmission Control Protocol,傳輸控制協議)是一種面向連線、可靠的傳輸層協議,它提供了資料傳輸的可靠性,保證了資料傳輸的有序性和完整性。具有一下特點:

  1. 可靠性:TCP保證資料傳輸的可靠性,確保資料能夠準確地到達接收方,並且能夠按照傳送方傳送的順序進行重組。
  2. 面向連線:TCP在傳輸資料前需要先建立連線,資料傳輸完畢後再斷開連線,這種方式可以保證資料的可靠性。
  3. 面向位元組流:TCP把傳輸的資料看成一個連續的位元組流,而不是資料塊,這樣能夠更好地控制傳輸過程。
  4. 擁塞控制:TCP能夠根據網路擁塞的程度來調整傳送速率,防止網路擁塞而導致資料丟失或延遲。
  5. 全雙工通訊:TCP允許傳送方和接收方同時進行資料傳輸,這樣可以提高資料傳輸的效率。

TCP連線為什麼需要三次握手?

TCP連線建立需要三次握手的原因是確保雙方都認可對方的初始序列號並且建立起可靠的通訊通道。具體來說,三次握手的步驟如下:

  1. 客戶端傳送SYN包給伺服器,表示客戶端請求建立連線,並隨機生成一個初始序列號seq。此時客戶端處於SYN_SEND狀態。
  2. 伺服器收到SYN包後,回覆ACK包和SYN包給客戶端,ACK包確認收到客戶端的SYN包,SYN包表示伺服器同意建立連線,並且伺服器也隨機生成一個初始序列號seq+1。此時伺服器處於SYN_RECEIVED狀態。
  3. 客戶端收到伺服器的ACK包和SYN包後,回覆ACK包給伺服器,ACK包確認收到伺服器的SYN包,此時客戶端和伺服器均建立起了連線,並可以進行資料傳輸。此時客戶端處於ESTABLISHED狀態。

三次握手的過程中,客戶端和伺服器都可以確保對方認可了自己的初始序列號,並建立起了可靠的連線。同時,三次握手也可以防止因為延遲的ACK導致的錯誤連線,以及防止因為舊的連線請求資訊重複傳送而導致的錯誤連線。因此,TCP連線建立需要三次握手來確保連線的可靠性。

TCP

TCP協議如何保證可靠性?

TCP協議透過序列號和確認應答、超時重傳、流量控制和擁塞控制等機制來保證傳輸的可靠性。

  1. 序列號和確認應答:每個TCP報文段都包含一個序列號,用於指示傳送方傳送的資料的位元組流中的位置。接收方收到TCP報文段後會傳送確認應答,告訴傳送方收到了哪個序列號之前的資料。如果傳送方沒有收到確認應答,它就會重傳這些資料。
  2. 超時重傳:如果傳送方沒有在一定時間內收到確認應答,就會認為資料包丟失了,並且會重新傳送這些資料。
  3. 流量控制:接收方可以透過TCP視窗大小來告訴傳送方可以傳送多少資料。這個視窗大小會根據接收方的可用緩衝區大小動態調整,以防止接收方的緩衝區溢位。
  4. 擁塞控制:TCP使用擁塞視窗來控制網路中的擁塞程度。如果網路擁塞,傳送方會降低擁塞視窗的大小,以減少傳送的資料量,從而減輕網路擁塞。

TCP連線如何保持活躍狀態?

TCP連線的保持活躍狀態通常有兩種方式:

  1. TCP keepalive機制:TCP keepalive機制是一種保持TCP連線狀態的方法。當一段時間內沒有資料傳輸時,TCP keepalive會向對端傳送一個探測包。如果對端收到了探測包,則會回覆一個確認包,證明連線仍然存在。如果對端沒有回覆,則會在一定時間內重試探測,若重試多次後仍然沒有回覆,則會認為連線已經斷開。TCP keepalive的預設設定是2小時。
  2. 應用層心跳包:應用層心跳包是一種應用層協議,用於保持TCP連線狀態。應用層心跳包是由應用程式傳送的一個小的資料包,用於告訴對端連線仍然存在。一般情況下,應用層心跳包的傳送頻率會比TCP keepalive要高一些,可以根據具體的業務需求進行調整。

這兩種方式都可以保持TCP連線狀態,但是TCP keepalive機制是在TCP協議層面實現的,而應用層心跳包則需要應用程式自己實現。

什麼是TCP視窗大小?

TCP視窗大小指的是接收端主機可以接收的資料量大小。在TCP連線建立時,雙方會交換視窗大小資訊,以便傳送方傳送適合接收方的資料量,防止傳送方傳送過多的資料導致接收方無法及時處理而丟失資料或出現阻塞。

TCP視窗大小的單位是位元組(byte),通常是由接收端主機來設定和控制。接收端主機透過設定視窗大小來告訴傳送端主機,自己可以接收多少資料,傳送端主機在傳送資料時就不會超過這個視窗大小,以確保資料能夠被接收端主機及時處理和接收。

TCP視窗大小的最佳化可以透過調整系統引數、硬體最佳化以及網路拓撲結構等方式來實現,從而提高TCP連線的傳輸效率和穩定性。

TCP協議的流量控制是如何實現的?

TCP協議的流量控制是透過視窗機制實現的。每個TCP連線都會有一個傳送視窗和一個接收視窗,它們控制著資料的流動。

傳送視窗:傳送方透過傳送視窗的大小告訴接收方自己還可以傳送多少資料。傳送視窗的大小由接收方動態調整,取決於接收方的可用快取空間和網路狀況。

接收視窗:接收方透過接收視窗的大小告訴傳送方自己還能接收多少資料。接收視窗的大小由傳送方動態調整,取決於傳送方的傳送速率和網路狀況。

透過這種視窗機制,TCP協議可以在不丟失資料的前提下控制資料的流動速度,防止傳送方傳送過多資料導致接收方無法及時處理,從而實現流量控制。

TCP擁塞控制的機制是什麼?

TCP擁塞控制是一種控制網路擁塞的機制,它透過調整傳送方的資料傳送速率和接收方的資料接收速率來避免網路擁塞和網路崩潰。TCP擁塞控制的主要機制有以下幾個:

  1. 慢啟動:在開始時,TCP傳送方會以指數級別遞增資料的傳送速率,直到達到網路的最大容量。
  2. 擁塞避免:一旦傳送方確定了網路的最大容量,就會以線性增長的方式逐步增加資料的傳送速率,直到出現擁塞。
  3. 快重傳:當TCP傳送方接收到一個重複的ACK(確認),表示有些資料已經到達接收方,它將立即重新傳送最近傳送的沒有確認的資料段,而不是等待超時重傳計時器超時。
  4. 快恢復:在接收到重複的ACK時,TCP傳送方會減少資料傳送速率,並立即傳送已經確認的但還未傳送的資料,以便更快地恢復資料的傳送速率。
  5. 擁塞超時:如果傳送方沒有在指定時間內收到ACK確認,則假定資料包已經丟失並重傳資料,同時將資料傳送速率減半。

這些機制組合起來,可以有效地控制TCP連線的資料傳送速率,從而避免網路擁塞和崩潰。

如何實現TCP多路複用?

TCP多路複用指的是在一個TCP連線中同時傳送和接收多個資料流,它可以顯著提高網路通訊的效率和吞吐量。在TCP多路複用中,可以使用以下兩種方式來實現:

  1. 使用多執行緒或多程式:每個執行緒或程式處理一個資料流,透過對不同的資料流進行處理,從而實現多路複用。
  2. 使用select、poll或epoll等I/O多路複用機制:在使用這種機制的時候,應用程式只需要在一個程式中建立一個TCP連線,然後使用I/O多路複用機制來同時監聽多個資料流的I/O事件,從而達到多路複用的效果。

使用I/O多路複用機制的方式可以更好地利用系統資源,避免了多執行緒或多程式的上下文切換開銷,同時也減少了程式碼的複雜性。因此,在實現TCP多路複用時,建議使用I/O多路複用機制來實現。

TCP傳輸中出現超時或延遲,如何處理?

TCP傳輸中出現超時或延遲,可以透過以下方式進行處理:

  1. 調整超時時間:TCP協議中有一個超時重傳機制,當資料包傳送後一定時間內沒有收到ACK確認,就會進行重傳。可以透過調整超時時間來最佳化網路延遲,比如減小超時時間可以使資料包更快地被重傳,加快資料傳輸速度。
  2. 使用快速重傳:快速重傳是指當傳送方連續接收到3個重複的ACK確認時,就可以認為資料包已經丟失,立即進行重傳,而不必等待超時重傳。這可以減小重傳的延遲時間,提高資料傳輸速度。
  3. 增加擁塞視窗:當網路擁塞時,可以透過增加擁塞視窗來提高網路吞吐量。擁塞視窗是指在一個RTT(Round Trip Time,往返時間)內允許傳送的資料量,可以根據網路擁塞程度動態調整。
  4. 檢查網路鏈路:有時超時和延遲是由網路鏈路問題導致的,可以透過檢查網路鏈路狀態,排查故障並解決問題。
  5. 使用更快速的傳輸協議:如果TCP協議無法滿足需求,可以考慮使用更快速的傳輸協議,如UDP或QUIC。這些協議不僅可以提供更快的傳輸速度,還具有更好的適應性和魯棒性,能夠適應不同的網路環境和傳輸需求。

什麼是TCP協議中的TIME_WAIT狀態?它的作用是什麼?

TCP協議中的TIME_WAIT狀態指的是TCP連線關閉後,等待2倍的MSL時間(Maximum Segment Lifetime,最大分段生存時間)後才會關閉的狀態。MSL是指一個TCP分段在網路中最長的生存時間,通常為2分鐘。

TIME_WAIT狀態的作用是確保網路中所有的分段都已經被接收並且被正確處理。在TCP連線關閉後,可能還會有一些未到達的分段存在於網路中,這些分段可能會在關閉連線之後到達,如果不等待這些分段到達並被正確處理,可能會導致後續的連線出現問題,因此TCP協議會透過TIME_WAIT狀態來等待這些分段的到達和處理。

此外,TIME_WAIT狀態還可以防止舊的連線請求被誤認為是新連線的請求,從而確保連線的安全性和可靠性。

如何在Linux系統中檢視TCP連線狀態?

在 Linux 系統中,可以使用 netstatss 命令檢視 TCP 連線狀態。

使用 netstat 命令:

perlCopy code
netstat -ant | grep ESTABLISHED

該命令可以列出所有已建立的 TCP 連線,其中 -a 選項表示顯示所有連線,包括已建立、正在等待和已經關閉的連線;-n 選項表示以數字形式顯示 IP 地址和埠號;-t 選項表示只顯示 TCP 連線;grep ESTABLISHED 表示只顯示已建立的連線。

使用 ss 命令:

perlCopy code
ss -ant | grep ESTAB

該命令與 netstat 類似,其中 -a 選項表示顯示所有連線,包括已建立、正在等待和已經關閉的連線;-n 選項表示以數字形式顯示 IP 地址和埠號;-t 選項表示只顯示 TCP 連線;grep ESTAB 表示只顯示已建立的連線。

另外,還可以使用 tcpdump 命令捕獲和分析 TCP 資料包,以進一步瞭解 TCP 連線狀態和傳輸情況。

相關文章