上一期介紹http 的相關知識點,這期我們深入一點,了解一下TCP(傳輸協議)的相關內容。
定義
TCP = TRANSMISSION CONTROL PROTOCOL,即傳輸控制協議。
計算機網路體系結構(OSI七層模型),TCP協議處于第四層,在物理層(線纜、光纖、無線信道等),數據鏈路層(交換層面segment),網絡層(IP)這三個層面之上的一層協議。也就是說,在我們討論TCP協議的時候,意味著我們的前提是IP可達,ping包(網絡診斷工具)可通的情況下。
工作原理
簡單的來說就是通過流控制(序列號--確認號機制),使得雙方的通信過程是可靠的,同時還有一些性能優化(例如窗口機制)的實現在里面。因為不能把所有的IP協議都當作TCP協議來使用,所以規定,當檢測到IP協議中PROTOCOL字段為6時,我們將IP字段后的協議視為TCP協議。
為什么是三次握手,而不是兩次或者四次?
這里借用知乎上的一個回答:這個問題的本質是,信道不可靠, 但是通信雙方需要就某個問題達成一致。 而要解決這個問題,無論你在消息中包含什么信息, 三次通信是理論上的最小值。所以三次握手不是TCP本身的要求,而是為了滿足"在不可靠信道上可靠地傳輸信息"這一需求所導致的。請注意這里的本質需求,信道不可靠,數據傳輸要可靠。三次達到了,那后面你想接著握手也好, 發數據也好,跟進行可靠信息傳輸的需求就沒關系了。因此,如果信道是可靠的, 即無論什么時候發出消息,對方一定能收到, 或者你不關心是否要保證對方收到你的消息,那就能像UDP(用戶數據報協議)那樣直接發送消息就可以了。
下圖是比較形象的描述三次握手的流程:
連接的建立和終止
在理解TCP的建立與終止之前,我們先來了解幾個概念:
SYN報文表示建 立連接,
FIN報文表示關閉連接,
ACK表示響應。
一個 正常的TCP連接從建立到分開,要完成三次握手四次揮手。首先是建立,如下圖:
1、客戶端向服務器申請建立TCP連接,向服務器發送一個SYN報文,作為第一次握手。客戶端把這段連接的SYN設定為隨機數A。
2、服務器端收到SYN報文后,會向客戶端發送一個報文。報文中ACK的確認碼為A+1,同時發送另一個SYN為隨機序號B。
3,此時,客戶端收到ACK為A+1的報文,將之與發送的SYN包進行比對,如果滿足+1的關系,則在客戶端判斷連接已建立。并給服務器發送確認數據包,SYN為A+1,表明已收到上一報文,ACk為B+1,通知服務器進入連接狀態。
此時,TCP連接已建立完成可以正常的傳輸數據。再則是連接終結,即四次揮手,如下圖:
終結連接操作可由雙方任意一方發起。本文以客戶端為例。
1、客戶端向服務器發送一個FIN報文,作為第一次揮手。通知服務器,我已經沒有數據還要發送。但不確認服務器是否仍有數據返回,所以連接仍是建立狀態。
2、服務器收到FIN報文,返回一個ACK報文,告訴客戶端,我知道你已經沒有東西要發送了,但我還要再確認一下我是不是還有東西要給你。
3、服務器判斷自己也沒有報文需要發送給客戶端,發送FIN報文,告訴客戶端,好了,這下我也沒有東西要給你了,你可以終結連接了。此時服務器不確認客戶端是否收到信息,繼續保持連接。
4、客戶端收到ACK和FIN消息后,得知服務器已經知道自己要終結,并無更新內容,便給服務器發送一個ACK說我知道了,你也終結吧,客戶機便終結連接。服務器在收到一條ACK后,也終結連接。
至此,四次揮手結束,連接終結。
以上總結的前端設計與http 和 TCP 相關的基礎知識比較粗淺,適合沒有一些網絡基礎初學者閱讀,如需要深入了解底層知識,可以上網查閱相關資料或買一些書籍研究。以上總結的內容如有紕漏請多多指正。