- TCP 三次/四次握手
TCP 建立連接 - 3 次握手
建立過程:
- client 發送
SYN=1, seq=x
:SYN=1
建立連接的標識,seq=x
是客戶端初始化的序號 - server 發送
SYN=1, seq=y, ACK=1, ack=x+1
:seq=y
服務端初始化的序號,ACK=1
確認字符,ack=x+1
確任序號(=clientSeq+1) - client 發送
ACK=1, ack=y+1, seq=x+1
:ACK=1
確認字符,ack=y+1
確任序號(=serverSeq+1)
Note:
Q:爲什麼要 3 次握手,而不是 2 次握手?
A:3 次握手能夠防止 client 發送的失效連接被 server 響應,而重新建立連接,避免資源的浪費。通過 server 發送的 ack=clientSeq+1,client 可以校驗 clientSeq,從而確認是否發送第三次握手。
TCP 釋放連接 - 4 次握手
釋放過程:
- client send
FIN=1, seq=u
:FIN=1
關閉連接標識,seq=u
client 初始化序列號 - server send
ACK=1, seq=v, ack=u+1
:ACK
確認字符,ack=u+1
確認序號=clientSeq+1,seq=v
server 端初始化序號 - client 端雖然不再發送數據了,但是可以接收數據。server 端此時仍可以向 client 傳輸數據
- server send
FIN=1, ACK=1, seq=w, ack=u+1
:FIN=1
關閉連接標識,ACK=1
確認字符,ack=u+1
確認序號=clientSeq+1,seq=w
server 發送序號 - client send
ACK=1, seq=u+1, ack=w=1
:ACK=1
確認字符,ack=w+1
確認序號=serverSeq+1,seq=u+1
client 端發送序號
Note:
-
Q:爲什麼關閉連接需要 4 次握手,而建立連接只需要 3 次?
A:建立連接時,標識(SYN) 和 ACK 是一起發送的,而關閉連接時,標識(FIN) 和 ACK 是分開發送的。分開發送的原因是,雖然 client 端表明其準備關閉連接了,只是表明 client 不再發送數據,但其仍可以接收數據。server 端仍可以在確認收到 client 端關閉連接的消息後,將未發送完的數據發送給 client 端,之後再發送關閉連接標識(FIN)