[TOC]網絡
前言
1、TCP的三次握手-鏈接
1.1 圖解流程

- SYN,同步標誌位,用於創建鏈接時,同步本身序列號給對方。
- ACK,確認標誌位,當須要發送ack(確認序列號)時,必須置位1。
- seq,數據序列號,表名這次請求發送的第一個數據的序列號爲多少,首次自定。
- ack,下次數據的序列號,告訴對方下次應該發過來的第一個數據的序列號應該是多少。
- established,鏈接已創建。
TCP三次握手實質上就是維護雙方 seq(數據序列號) 的過程。spa
注意:同步
- SYN報文段不攜帶數據,可是要消耗一個序號;
- ACK報文段能夠攜帶數據,若是不攜帶,則下次序列號不變,因此最後一次握手後,下次鏈接序列號仍是從K+1開始;
圖解:it
- A呼叫B,這是條同步鏈接,這次數據由J開始;
- B收到;
- B呼叫A,收到同步鏈接,下次請從J+1開始發送數據,而且一樣須要同步,這次數據由K開始;
- A收到,創建鏈接;
- A呼叫B,收到同步鏈接,那下次請從K開始發送數據吧;
1.2 爲何不能是四次握手?
其實能夠看到,握手的第二次能夠拆成兩部分完成,先發送ACK,在同步SYN,這樣下來就是四次握手了。爲何不呢?由於效果同樣,不必呀~。一樣不五次、六次、七次等等緣由都是如此。class
1.3 爲何不能是兩次握手?
這主要是爲了防止 已失效的鏈接請求報文段 忽然又傳送到了對方,於是產生錯誤。請求
已失效的鏈接請求報文段:第一次握手發送因網絡擁堵或其餘緣由而未到達對方手中。im
若是是兩次握手,會發生的錯誤是什麼?總結
兩次握手的話,B的established(鏈接創建)將發生在第一次握手後。通信
- 若是A第一次發送鏈接請求(seq=J),由於網絡擁堵而爲到達B手中,以後發送第二次鏈接請求後,成功到達,雙方後續鏈接好鏈接,並開始持續發送數據(A發送給B的seq已經到了N)。
- 此時第一次鏈接請求到達B,B認爲A須要從新創建鏈接(由於TCP是無狀態的,因此只能這麼機械認爲),而後B創建鏈接,發送確認、同步請求給A以後,等待接收A數據序號爲J+1的數據。
- A收到來自B的確認、同步請求,但A此時已經和B鏈接,因此忽略這次確認請求,繼續發送序列號爲N+1的數據。
- B收到序列號爲N+1的數據,並非J+1的數據,不進行接收。
- A沒有等到B的回覆,一直在超時重傳,屢次後便報出錯誤,等待從新鏈接。
爲何三次握手,不會出現」 已失效的鏈接請求報文段 忽然又傳送到了對方,於是產生錯誤「的狀況?數據
由於B創建鏈接在第三次握手以後,已失效的鏈接請求報文段 忽然又傳送到了對方,並不會改變B下次接收A的數據的序列號(兩次握手失敗的主要緣由:B下次接收A的數據序列號從N+1變成了J+1)。因此在A忽略以後繼續發送N+1的序列號數據時,B能正常接收。
第二次或第三次握手擁堵以後,忽然又傳回對方手中,會產生怎麼樣的結果?
由於第二次握手和第三次握手都須要有前景,即第一次握手(第二次握手的前景)和第1、二次握手(第三次握手的前景),由於沒有前景,因此天然會被忽略掉。
2、TCP的四次揮手-釋放
2.1 圖解

- FIN,鏈接結束標誌位,表示發送方請求斷開鏈接。
- MSL,最長報文段壽命,約爲2分鐘,隨着時代進步,以後繼續變短。
- 2MSL,2個MSL時間,爲一個等待計時器的時長。
注意:
- FIN標誌位爲1時,即便請求不攜帶數據,也要消耗一個序號。
圖解:
- A想關閉鏈接,並處理好關閉鏈接的過後;
- A呼叫B,這是條關閉請求,這次序號爲u;
- B收到A的關閉請求,同時嚮應用匯報,關閉鏈接的事;
- B呼叫A,這是條確認請求,這次數據序號爲v,下次發送數據從u+1開始(這代表B收到A的上一條(u)請求了);
- B處理關閉鏈接的事,同時把須要發送的數據給發送完(此時發送的數據都要保留ack=u+1,由於要給後續A發送用),發送完以後,便進行關閉操做;
- B呼叫A,這是條關閉請求,這次序號爲w,下次發送數據從u+1開始;
- A呼叫B,這是條確認請求,這次序號爲u+1,下次發送數據從w+1開始;
- A等待2MSL後,關閉鏈接;
2.2 爲何最後A須要等待2MSL時間呢?
- 保證A最後發給B的報文段能到達B。若是不能到達B,在這2MSL時間段內,徹底夠B超時重發FIN報文段,且A讓收到。若是A收到後,將繼續發送最後一次揮手,且重置等待計時器。等待計時器重置也有次數,若是重置屢次的話,A將直接關閉。
- 防止」已失效的鏈接請求報文段「出如今揮手階段。在這2MSL時間段內,足夠讓B接收到以前的因網絡擁堵而未到達的報文段了,固然報文段有有效時長,超過這個有效時長,將會被丟棄。這樣就不會由於下次創建鏈接時接收到上次創建鏈接時的報文段而產生錯誤。
2.3 若是A掉電退出了怎麼辦?
TCP有一個保活計時器,當雙方接收到對方報文段時,保活計時器將重置。若是保活計時器時間結束,它將會主動關閉TCP鏈接。
3、總結
整個TCP鏈接、互相發送數據(你向我發送數據,我回復你收到)、揮手階段,都是一個 維護序號的過程。這個序號就是我同對方講的這句話的惟一標識符。
seq、ack都尤其重要。seq 表示了某一方數據的惟一性;ack 不只告訴對方下次應該從哪一個位置發送,還能驗證對方發送的數據是否正確。
整個通訊都是針對雙方的,沒有哪一方爲數據的領導者。