TCP
Transmission Control Protocol是一種面向連接的赁项、可靠的挪挤、基于字節(jié)流的傳輸層通信協(xié)議
三次握手
- 建立連接洞拨,客戶端發(fā)送連接請求報文段烤礁,將SYN位設為1讼积,Sequence Number設為x,然后客戶端進入SYN_SEND狀態(tài)脚仔,等待服務器的確認
- 服務器收到SYN報文段勤众,對SYN進行確認,將AcknowledgementNumber設為x+1鲤脏;同時將SYN設為1们颜,SequenceNumber設為y,服務端將上述所有信息放到一個報文段(SYN+ACK報文段)中猎醇,一并發(fā)送給客戶端窥突,此時服務器進入SYN_RECV狀態(tài)
- 客戶端收到SYN+ACK報文段,將AcknowlegementNumber設為y+1硫嘶,向服務器發(fā)送ACK報文段阻问,這個報文段發(fā)送完畢以后,客戶端和服務器端都進入ESTABLISHED狀態(tài)沦疾,三次握手完成称近。
為什么需要三次握手
第二步,服務器端收到SYN哮塞,服務器端確認了客戶端的發(fā)送能力沒問題
第三步客戶端收到SYN+ACK刨秆,客戶端確認了服務器端的發(fā)送能力和接收能力沒問題,客戶端發(fā)送ACK給服務器端忆畅,服務器端確認了客戶端的接收能力沒有問題衡未。
如果是兩次握手
如客戶端發(fā)出連接請求,但因連接請求報文丟失而未收到確認,于是客戶端再重傳一次連接請求缓醋。后來收到了確認剔交,建立了連接。數(shù)據(jù)傳輸完畢后改衩,就釋放了連接岖常,客戶端共發(fā)出了兩個連接請求報文段,其中第一個丟失葫督,第二個到達了服務端竭鞍,但是第一個丟失的報文段只是在某些網(wǎng)絡結點長時間滯留了,延誤到連接釋放以后的某個時間才到達服務端橄镜,此時服務端誤認為客戶端又發(fā)出一次新的連接請求偎快,于是就向客戶端發(fā)出確認報文段,同意建立連接洽胶,不采用三次握手晒夹,只要服務端發(fā)出確認,就建立新的連接了姊氓,此時客戶端忽略服務端發(fā)來的確認丐怯,也不發(fā)送數(shù)據(jù),則服務端一致等待客戶端發(fā)送數(shù)據(jù)翔横,浪費資源读跷。
四次揮手
- 主機1(客戶端或者服務器端)設置Sequence Number和Acknowlegement Number, 向主機2發(fā)送FIN報文段禾唁,此時主機1進入FIN_WAIT_1狀態(tài)效览,表示主機1沒有數(shù)據(jù)要發(fā)送給主機2了
- 主機2收到FIN報文段,向主機1回一個ACK報文段荡短,Acknowledgement Number為Sequence Number+ 1丐枉,主機2進入FIN_WAIT_2狀態(tài),主機2同意主機1的關閉請求
- 主機2向主機1發(fā)送FIN報文段掘托,請求關閉連接瘦锹,同時主機2進入CLOSE_WAIT狀態(tài)
- 主機1收到FIN報文段,向主機2發(fā)送ACK報文段烫映,然后主機1進入TIME_WAIT狀態(tài)沼本,主機2收到ACK,就關閉連接,主機1等待后沒有收到回復昂拂,證明服務器端正常關閉,主機1也關閉連接
為什么需要四次揮手
因為當服務端收到客戶端的SYN連接請求報文后嫌蚤,可以直接發(fā)送SYN+ACK報文锐帜。其中ACK報文是用來應答的被济,SYN報文是用來同步的祝辣。但是關閉連接時贴妻,當服務端收到FIN報文時,很可能并不會立即關閉SOCKET蝙斜,所以只能先回復一個ACK報文名惩,告訴客戶端,“你發(fā)的FIN報文我收到了”孕荠。只有等到我服務端所有的報文都發(fā)送完了娩鹉,我才能發(fā)送FIN報文,因此不能一起發(fā)送稚伍。故需要四次揮手弯予。