TCP三次握手和四次揮手的全過程
TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立一個連接:
位碼即tcp標誌位,有6種表示:
SYN(synchronous建立連接)
ACK(acknowledgement 表示響應、確認)
PSH(push表示有DATA數據傳輸)
FIN(finish關閉連接)
RST(reset表示連接重置)
URG(urgent緊急指針字段值有效)
三次握手:
第一次握手:客戶端發送syn包(syn=x)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。
確認號:其數值等於發送方的發送序號+1(即接收方期望接收的下一個序列號)。
四次揮手:
與建立連接的“三次握手”類似,斷開一個TCP連接則需要“四次揮手”。
第一次揮手:主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了(當然,在fin包之前發送出去的數據,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),但是,此時主動關閉方還可以接受數據。
第二次揮手:被動關閉方收到FIN包後,發送一個ACK給對方,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號)。
第三次揮手:被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,我的數據也發送完了,不會再給你發數據了。
第四次揮手:主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。
爲什麼要三次握手?
- 如果只有一次握手,Client不能確定與Server的單向連接,更加不能確定Server與Client的單向連接;
- 如果只有兩次握手,Client確定與Server的單向連接,但是Server不能確定與Client的單向連接;
- 只有三次握手,Client與Server才能相互確認雙向連接,實現雙工數據傳輸。
爲什麼要四次揮手?
“三次握手”的第二次握手發送SYN+ACK迴應第一次握手的SYN,但是“四次揮手”的第二次揮手只能發送ACK迴應第一次揮手的FIN,因爲此時Server可能還有數據傳輸給Client,所以Server傳輸數據完成後才能發起第三次揮手發送FIN給Client,等待Client的第四次揮手ACK。