TCP鏈接管理分爲兩部分:一是三次握手創建鏈接;二是四次握手釋放鏈接。服務器
1.鏈接創建(三次握手)同步
①主機A的TCP向服務器B的TCP發出鏈接請求報文段,其首部中的同步比特標誌位SYN應置爲1,同時選擇一個初始序號seq=x;請求
②服務器B的TCP收到鏈接請求報文後,則發回確認,標誌位ACK應置爲1,確認號應爲ack=x+1.由於鏈接是雙向的,因此服務器B也發出和A的連結請求,在報文段中同時應將SYN置爲1,爲本身選擇一個初始序列seq=y。im
③主機A的TCP收到此報文段後,還要向服務器B給出確認,ACK應置爲1,其確認號爲ack=y+1。總結
注:①SYN:在鏈接創建是用來同步序號;ACK代表確認號字段有效;FIN用來釋放一個鏈接。數據
②TCP報文段首部的SYN和FIN置位的時候,須要消耗一個序列號(全部纔有x+1和y+1),而僅有ACK置位時,不須要消耗序列號。img
③二次握手會致使死鎖。假如使用二次死鎖,即A不會再向B發送確認報文,若是第二次握手中B給A的確認報文丟失的話,那麼B認爲已經鏈接,會開始給A發送數據報文,A會丟棄B傳來的數據報文並繼續等待B發送確認報文,而B也會由於發送超時再次重複發送一樣的報文,致使死鎖。管理
2.鏈接釋放(四次握手)超時
①主機A的TCP通知對方要釋放從主機A吊服務器B這個方向的鏈接,將發往主機B的TCP報文段首部終止比特標誌位FIN置1,假定此時序號爲seq=m。
②服務器B的TCP收到釋放鏈接的通知後,即發出確認,FIN須要消耗一個序號,因此其確認號爲ack=m+1。這樣從主機A到服務器B的鏈接就釋放了,鏈接處於半關閉狀態。此時若是服務器B還發送數據,主機A仍接收。
③服務器B向主機A的數據發送後,TCP釋放服務器B到主機A的鏈接。服務器B發送出的鏈接釋放報文除必須將終止比特FIN置1,並假定其序號seq=n,由於標誌位ACK不須要消耗序號,因此此時的確認號仍然是ack=m+1。
④主機A必須對此發出確認,由於FIN須要消耗一個序號,因此給出確認號爲ack=n+1。最終雙方鏈接釋放所有完成。
總結:整體來看TCP的鏈接和釋放其實本質相同,都是一個雙方都須要發送鏈接(釋放)請求,而後再發回確認的過程。區別在於鏈接時沒有前置條件,因此B給A的確認和請求能夠同時發送;而釋放時,存在一個前置條件,就是數據發送結束,不能保證B給A發送確認的同時也可以發送申請(即B向A的數據發送已經結束),因此釋放過程比鏈接過程多了一次握手。