TCP 連接的建立都是採用客戶服務器方式。
- 主動發起連接建立的應用進程叫做客戶(client)。
- 被動等待連接建立的應用進程叫做服務器(server)。
用三次握手建立TCP連接
連接可以由任何一方發起,也可以由雙發同時發起。一單一臺主機上的TCP軟件已經主動發起連接請求,運行在另一臺主機上的TCP軟件就被動的等待握手
- 如圖主機1首先發起TCP連接請求,並在所發送的分段中將編碼位字段的SYN位被置爲1,ACK位被置爲0.
- 主機2收到該分段,若同意建立連接,則發送一個連接收到的應答分段,其中編碼位字段的SYN和ACK位置均被置爲1,指示對第一個SYN報文段的確認,以繼續握手操作;
- 若拒接建立連接,主機2要發送一個將RST位被置爲1的應答分段,表示拒接建立連接
- 主機1收到主機2發來的同意建立連接分段後,還有再次進行選擇的機會,若確認建立連接,則向主機2發送確認分段,用來通知主機2雙方已經完成建立連接;
- 若不想建立連接,則可以發送一個將RST位被置爲1的應答分段來告訴主機2拒接建立連接。
無論是哪一方發起連接請求,一旦連接建立,就可以實現全雙工的數據傳輸,而不存在主從關係。
TCP將數據看作字節的序列,將從用戶進程接收的任意長的數據,分成不超過64KB(包含TCP頭在內)的分段,以適合IP數據報的載荷能力。所以對於一次傳輸要交換大量報文的應用,往往需要以多個分段進行傳輸。
TCP連接的拆除或釋放(四次揮手)
TCP協議使用修改的三次握手協議來關閉連接。
TCP連接是全雙工的,可以看作兩個不同方向的單工數據流傳輸。所以一個完整連接的拆除涉及兩個單向連接的拆除。
當主機1的TCP數據已經發送完畢時,在等待確認的同時可發送一個將編碼位字段的FIN位被置爲1的分段給主機2,
若主機2已經正確接收主機1的所有分段,則會發送一個數據分段確認接收的確認分段,同時通知本地相應的應用程序對方要求關閉連接,
接着再向主機1發送一個FIN段進行確認的分段。否則主機1就要重傳那些主機2未能正確接收的分段。
收到主機2關於FIN確認後的主機需要再次發送一個確認拆除連接的分段,主機2收到確認分段後意味着從主機1到主機2的單向連接已經結束,但主機2仍然可以向主機1發送數據,直到主機2數據發送完畢並要求關閉連接。一旦兩個單向連接都被關閉,則兩個端結點上的TCP軟件就要刪除與這個連接的有關記錄,原來所建立的TCP連接被完全釋放。