為了建立一條TCP連接,計算機需要為我們做如下的工作:
1. 請求端(通常稱為客戶)發送一個SYN段指明客戶打算連接的服務器端口,以及初始序號(ISN)。這個SYN段為下面的UML中的報文段1。
2. 服務器發回包含服務器的初始序號的SYN報文段(下面UML圖中的報文段2)作為應答。同時,將確認序號設置為客戶的ISN加1對客戶的SYN報文段進行確認。
3. 客戶必須將確認序號設置為服務器的ISN加1對服務器的SYN報文段進行確認(下面UML圖中的報文段3).
這三個報文段完成連接的建立。這個過程我們稱之為三次握手(three-way handshake)。
發送第一個SYN的一端將執行主動打開(active open)。接收這個SYN並發回下一個SYN的另一端執行被動打開(passive open)。
下面使用PlantUML語言進行流程圖的繪制,以幫助大家更好的理解TCP連接的建立,這裡給出作者繪制過程中使用的工具及源代碼,做到有圖有真相,大家可以進行任意修改。:-)
autonumber
participant client
participant server
note over client , server
client與server初始狀態都處於CLOSED
end note
client -> server : SYN(SEQ=x)
activate client
note left: 3次握手的第1步,\n此後client處於SYN_SENT狀態
client
activate server
note right: 3次握手的第2步,\n此後server處於SYN_RCVD狀態
client -> server : (SEQ=x+1,ACK=y+1)
deactivate client
deactivate server
note left of client: 3次握手的第3步,\nclient確認server的SYN,\n並處於ESTABLISHED狀態
note right of server: server的SYN被client確認後,\nserver也進入ESTABLISHED狀態
note over client , server
3次握手結束,client與server都進入ESTABLISHED狀態
從現在開始雙方可以傳輸數據了
end note
#+END_SRC