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