1、創建鏈接(三次握手)服務器
TCP是基於連接的協議也就是說在正式收發數據前必須和對方創建可靠的鏈接,一個TCP鏈接必須通過三次握手才能創建起來。
步驟以下:同步
1) 爲了創建鏈接,客戶端發送SYN包(SYN=j)到服務器B,進入SYN_SEND狀態,等待服務器B確認(通俗講就是,A向B請求鏈接:「我想給你發數據,能夠嗎?」)
2)服務器B收到SYN包,必須確認客戶端A的SYN(ACK=j+1),同時本身也發送一個SYN包(SYN=k)即向客戶端發送SYN+ACK包,此時服務器進入SYN_RECV狀態(通俗講,就是B迴應A:「好吧,你來吧」)
3)客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK(ACK=k+1),此包發送完畢,客戶端A和服務器B完成三次握手,進入ESTABLISHED狀態,開始正式發送數據。List
2、關閉鏈接(四次分手)請求
因爲TCP鏈接是全雙工的,每一個方向都必須進行單獨的關閉,這個原則表現爲當一方完成它的數據發送任務以後就能發送一個FIN來終止這個方向的鏈接,所以收到一個FIN只是意味着一個方向上沒有數據流動,一個TCP鏈接在收到一個FIN以後仍然能發送數據,首先進行關閉的一方將執行主動關閉,而另外一方將執行被動關閉數據
1)客戶端A發送一個FIN給服務器B,用於關閉客戶端A到服務器B的數據發送(A對B說:「我傳完了」);
2)服務器B收到這個FIN,他發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN同樣,一個FIN將佔用一個序號(B迴應A說:「好的」);
3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A(B對A說:「我也傳完了」)
4)客戶端A發回ACK報文確認,並將確認序列設置爲收到的序號加1.(即A迴應B說:「好的,我收到了,我撤了」)客戶端
爲何TCP創建鏈接是三次握手,而關閉鏈接倒是四次握手呢?協議
由於服務端的Listen狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用而SYN起同步做用)放在一個報文裏發送,可是在關閉鏈接時,當服務端收到FIN報文通知時,它僅僅表示對方(客戶端)沒有數據須要發送給你了,可是並不表示對方的全部數據你都已經接收到或者說你全部的數據都已經發送給對方了,因此你可能未必想當即關閉Socket,所以再次發送FIN包給客戶端通知它能夠關閉鏈接,客戶端只有同時接收到ACK與FIN纔會關閉客戶端到服務端的鏈接。服務端