TCP(Transmission Control Protocol 傳輸控制協議)是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。html
客戶端A------服務端Bgit
第一次握手: A-[SYN|seq]->B 客戶端向服務端發送syn標記的包,通知服務端要創建鏈接; 此過程當中服務端和客戶端均不能肯定本身是不是ok的;github
第二次握手: B-[SYN|ACK|seq]->A 服務端向客戶端發送確認包SYN/ACK,表示收到前邊創建鏈接的請求; 此過程當中客戶端A收到服務端的確認包,說明客戶端接收和發送的ok的;但此時服務端並不知道本身的狀況;服務器
第三次握手: A-[ack]->B 客戶端向服務端發送確認包,表示收到服務端的確認請求; 此過程當中服務端收到客戶端發來的確認包,服務端本身的接收和發送都是ok的,雙方開始通訊;三次握手完成。網絡
客戶端收到服務器的SYN+ACK報文段。而後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。 完成了三次握手,客戶端和服務器端就能夠開始傳送數據。併發
爲何必定要三次握手呢?tcp
客戶端A------服務端Bui
第一次揮手:
A-[FIN|seq|ack]->B
客戶端已經沒有數據向服務端發送,而且向客服端發起結束請求;此時客戶端進入fin_wait_1階段 fin_wait_1:第一次等待結束態;標明客戶端主動發起結束鏈接的請求.net
第二次揮手: B-[ack]->A 服務端收到客戶端結束的請求(此時可能服務端還有數據發送給客戶端),無論當前狀態如何,立馬向客戶端發送已經收到客戶端結束請求的確認信息; 注意:若是不發送的話,客戶端長時間收不到確認消息,會認爲以前發送失敗,致使從新發送結束請求; 此時客戶端收到服務端的確認信息進入fin_wait_2階段 fin_wait_2:第二次等待結束態;標明服務端已經接收到客戶端的結束請求,而且客戶端已經收到確認消息unix
第三次揮手: B-[FIN|seq|ack]->A 服務端向客戶端發送結束鏈接的請求,表示服務端已經沒有數據向客戶端發送,能夠結束請求;而服務端則進入close_wait階段 close_wait: 等待關閉態;服務端發起結束鏈接請求,等待客戶端的確認信息
第四次揮手: A-[ack]->B 客戶端收到服務端結束鏈接請求,向服務端發出確認關閉的請求,並進入time_wait階段; 服務端接收到請求則關閉鏈接; 客戶端等待2MSL後依然沒有收到回覆,說明服務端已經正常關閉,此時客戶端本身關閉鏈接; time_wait: 表示收到了對方的FIN報文,併發送出了ACK報文,就等2MSL後便可回到CLOSED可用狀態了。 注意:若是fin_wait_1狀態下,收到了對方同時帶FIN標誌和ACK標誌的報文時,能夠直接進入到time_wait狀態,而無須通過fin_wait_2狀態 此時,四次揮手結束。
參考: