- 第一次握手:建立連接配接時,用戶端發送
包和一個随機序列号syn
到伺服器,并進入seq=x
狀态,等待伺服器進行确認。(SYN_SEND
,同 步序列編号)。syn
- 第二次握手,伺服器收到
包,必須确認客戶的syn
,然後伺服器發送一個SYN
的随機數和ACK=1, SYN=1, seq=y
的确認數的包發送回去。ack=x+1
- 第三次握手是用戶端收到伺服器端的
包,然後向伺服器端發送确認包SYN+ACK
,用戶端和伺服器端進入ack=y+1, seq=x+1, ACK=1
狀态,完成三次握手。具體圖示如下(ESTABLISHED
表示首部中的ACK
位置1,ACK
表示首部中确認序号字段的值):ack
這裡多說一點,既然提到了連接配接時的三次握手,就順便把斷開連接配接時的四次揮手也複習一下。
- 首先用戶端主動發送
,它等于前面已傳 送過去的最後一個位元組的序号加1.這時Fin=1,seq=u
進入A
狀态,等待FIN-WAIT-1
的确認。B
-
收到連接配接後立即發出确認,确認号是B
,而這個封包段 自己的序号是ack=u+1
,等于v
前面已傳送過的資料的最後一個位元組的序号加1.然後B
即進入B
狀态。因而CLOSE-WAIT
到A
的這個連結現在已經斷開了,這時 的B
連接配接處于半關閉狀态,即TCP
已經沒有資料需要發送了。但A
若發送資料,B
還是要接受的。A
收到來自A
的确認之後就進入了B
狀态等 待FIN-WAIT-2
發出連接配接釋放封包段。B
- 若
已經沒有要向B
發送資料,其應用程序就通知A
釋放連接配接。這時TCP
發出的連接配接釋放封包段必須使用B
.現在假定FIN=1
的序 号為B
,w
還必須重複上次已發送過的确認号B
.這時ack=u+1
就進入了B
狀态,等待LAST-ACK
确認。A
-
在收到A
的連接配接釋放之後必須對此發出确 認。在确認号中把B
置1,确認号ACK
,而自己的序号是ack=w+1
。接着seq=u+1
進入A
狀态。為了保證TIME-WAIT
可以收到确認釋放封包段。如下圖:B
是不是所有執行主動關閉的
socket
都會進入
TIME_WAIT
狀态呢?
有沒有什麼情況使主動關閉的
socket
直接進入
CLOSED
狀态呢?
主動關閉的一方在發送最後一個
ack
後
就會進入
TIME_WAIT
狀态 停留
2MSL
(
max segment lifetime
)時間
這個是
TCP/IP
必不可少的,也就是“解決”不了的。也就是
TCP/IP
設計者本來是這麼設計的
主要有兩個原因:
-
防止上一次連接配接中的包,迷路後重新出現,影響新連接配接
(經過
,上一次連接配接中所有的重複包都會消失)2MSL
- 可靠的關閉
TCP
連接配接
在主動關閉方發送的最後一個
,有可能丢失,這時被動方會重新發ack(fin)
, 如果這時主動方處于fin
狀态 ,就會響應CLOSED
而不是rst
ack
。是以
主動方要處于
狀态,而不能是TIME_WAIT
。CLOSED