TCP/IP 協定與 Internet 網路:第七章 傳輸層協定  上一頁           下一頁

 

翻轉工作室:粘添壽

 

7-3 TCP 連線管理

TCP 是連接導向的傳輸方式,對於連線管理也顯得特別重要,而所發生的問題也較大,這必須經過特殊處理才不至於發生錯誤現象。譬如,當 TCP 建立連線時,它的連線訊號必須經由 IP 封包傳送,而 IP 封包也許會經由多個實體網路跨接,並不能保證連接訊號是否可安全到達目的地,甚至傳送訊號會在各子網路上發生嚴重的延遲,此時,TCP 傳送端也許會誤判該訊號遺失,再發出重複的要求連線訊號。這種情況如圖 7-7 所示,工作站 ATP_A)發送要求連線的訊號 CRConnect Request)後啟動計時器,當時網路嚴重塞車而使連線訊號發生阻塞。傳送端在計時器溢時後未收到對方回應訊號,認為連線訊號已遺失了。傳送端另再發送出傳線要求訊號,而且該訊號比前次訊號更早到達工作站 BTP_B)。TP_B 連續回應兩個同意連線訊號給 TP_ATP_A以為這是接收端重複傳送回應訊號,而不知道已建立兩條連線。例如,使用者和銀行電腦連線,要求銀行將帳戶 A 內扣出 5 萬元轉入帳戶 B。連線訊號發生嚴重的延遲,使用者電腦再次發送連接訊號,銀行電腦接收到兩筆要求連線訊號,這時候如果沒有良好的控制方法,銀行將會轉帳兩次而發生嚴重錯誤而不自覺,使用者電腦也沒有發現異狀。

7-7 重複連線錯誤

        我們可以發現會發生這個錯誤的主要原因是接收端和傳送端不知道這個連線訊號是重複的,如果我們想出辦法讓每個連線都編有號碼,兩端就較有可能判斷連線是否重複的。為了解決這個問題,Tomlinson1975)提出三向式握手法(Three-way handshake)。其運作的主要原理,就是不管要求訊號或回應訊號都編有序號,尤其回應時必須指明這是回應第幾號要求連線訊息。對於序號的編列不必依照一定的順序,只要能標示出獨立訊息便可以。如圖 7-8 所示,工作站 ATP_A)送出要求連接訊號(Connect RequestCR)並附帶序列號碼  xseq=x);工作站 BTP_B 針對 TP_A 的要求而送出同意連線訊號 Ack(ack=x)),並標示出本回應訊號的序號(seq=y);TP_A 接到 TP_B 的同意連線訊號 Ackseq=y, ack=x),便知道是針對哪一個連線要求的回應,並在傳送一個確認訊號表示連線成功 Ackseq=x, ack=y);TP_B 收到確認訊號也知道針對哪一個連線已連接成功。

7-8 三向握手式連絡法之訊號方式

        因此,TCP 採用三向握手式連絡法(Three-way handshake)來實現連線處理,其中會用到封包內二個序號:Sequence Numberseq)及 Acknowledge Numberack),以及 Code(或稱 Flags)欄位中四個旗標:ACKSYNFIN RST。以下分別介紹各種連線情況的處理方式(注:旗標都用大寫字母表示,而控制欄位都用小寫表示):

7-3-1 TCP 建立連線

        7-9 為三向握手式連絡法的連線建立圖,所謂三向握手式是表示有三個訊號來建立連線:(1) SYNAB)表示A B 要求連線;(2) SYN&ACKBA)為 B 回應給 A,表示同意或不同意連線要求;(3) ACKAB)表示 A 確認收到 B 的回應。另外, seq 表示要求連線的封包號碼;ack = seq +1 表示確認 seq 封包,並要求傳遞下一個封包序號(滑動視窗法確認方式)。

7-9 TCP 建立連線運作程序

7-3-2 TCP 資料傳送

        TCP 連線中的資料流量控制是採用滑動視窗法(Sliding Window),而錯誤偵測技巧是採用檢查集(Checksum)方法。以下介紹資料的傳輸方式,至於滑動視窗法,我們在下一節(7-4 節)會專門介紹。TCP 封包中 Sequence Numberseq 表示該封包的順序號碼、Acknowledge Numberack)為期望對方發送的封包順序號碼,也確認該序號以前的封包都已正常接收。傳送開始的 Sequence Number 是由亂數(Random Number)產生。圖 7-10 User_A 傳送資料給 User_B 的資料流動控制程序。其中 data_length 表示每次封包內所傳送的資料位元組數量。我們要特別強調封包序號的計算是以資料位元組(byte)為單位,而不是以傳送次數為單位,因此,回應確認序號是 ack = seq + data_length。由圖中可以看出,傳送資料的控制訊號是 PSH 旗標和所傳遞資料的順序號碼 seq,而回應確認訊號是 ACK 旗標和 ack 欄位的順序號碼。PSH 旗標表示希望接收端儘速將資料傳給上層通訊協定,並回應確認訊號給傳送端。

7-10 TCP 資料傳送運作方式

7-3-3 TCP 連線終止

        TCP 連線是連接導向且雙向傳輸模式,對於連線終止的處理比較麻煩。一端傳輸完畢要求結束連線,但另一端可能還有要傳送資料,因此雙方必須協議好才可以終止連線。圖 7-11 為連線終止的運作程序,首先 User_A 傳送準備終止連線(FIN = 1)((1) FIN & seq)訊號給 User_B。當 User_B 收到要求終止連線訊號後,立即回應接收到該訊號((2) ACK & ack = seq + 1),此時 User_B 必須詢問上層通訊軟體是否還有資料要繼續通訊,如上層回應同意終止連線,則 User_B 再告訴 User_A 確實可以終止連線((3) FIN & seq & ack)。User_A 再次收到 User_B 要求終止連線後,並由 ack 序號得知此訊號是上一次要求對方的回應,便知道上一次要求終止已得到對方同意,因此,再發送同意終止連線訊號給 Uase_B(4) ACK & ack = seq + 1),同時也釋放該連線。User_B 收到該同意終止訊號,並由 ack 欄位和 ACK = 1,得知 A 已釋放連線,並且自己也釋放連線。為了防止封包遺失或溢時傳送,雙方請求或回應封包都以封包序號(seq ack)作為確認基準。

7-11 TCP 終止連線運作程序

7-3-4 TCP 連線重新啟動

        如果連線雙方有一端不正常中斷,而使另一方無法傳送給對方時,則可發出重置訊號,要求對方重新連線。如圖 7-12 所示,TCP_B 已中斷(中斷原因不詳),而 TCP_A 端不知道仍舊繼續傳送資料,該封包到達 TCP_B 的下層通訊軟體(IP 層)會因為到達不了該埠口,而回應 ICMP Destination Unreachable Code = 3(無法到達連接埠)給 TCP_A。此時 TCP_A 會送出連線重新啟動訊息(SYN & RST),TCP_B 便可回應(SYN & ACK)重新啟動連線(以原來之傳輸埠口號碼)。也有可能主機 BTCP_B)已經關機,而 TCP_A 接收不到回應訊號,便自行中斷連線。

7-12 連線重新啟動

7-3-5 TCP 連線識別

Internet 網路上針對任何一個傳輸埠口,一般都允許同時連接多個傳輸線,如圖 7-13 中,一個 Web Server 也許會有多個客戶端(IE)同時要求傳送資料,但 Web Server 如何來分辨每一傳輸線?其實 TCP 識別連線非常簡單,它是利用 IP 位址 + TCP 傳輸埠口來分辨,每一條連線識別如下:

IP 位址:TCP 埠口】←→【IP 位址:TCP 埠口】

如圖 7-13 (b) 中就有四條連線分別為:

148.34.12.6:80】←→【165.4.3.45:2356

148.34.12.6:80】←→【166.45.21.3:4521

148.34.12.6:80】←→【136.7.34.2:2678

148.34.12.6:80】←→【136.7.34.2:2478

在同一部主機上(IP 位址)不可能會有同一傳輸埠口(TCP 埠口)連結到不同的應用程式上的情形發生,因此,上述的連線辨識也不會有重複現象發生。一般 Web Server 的傳輸埠口都會放置在 80 埠口,又在客戶端啟動 TCP 連線時,主機會找出一個空閒的傳輸埠口來使用,用戶取用埠口也都會限制在 1024 埠口以後的位址。如同一主機執行相同的應用程式(如 IE)兩次以上,它所取用的傳輸埠口也不可能一樣,因此用 IP 位址 + TCP 埠口來表示連線位址,也不會有重複現象發生。如圖 7-13 中,136.7.34.2 主機執行兩次 IE 程式,並連結到同一部 Web Server,還是可以區分出來各自的連線。

7-13 TCP 連線範例與識別

 

 

<GOTOP>