圖片詳解TCP連線的三次握手,四次斷開基本原理
圖片詳解TCP連線的三次握手,四次斷開
作者:林子TCP(TransmissionControl Protocol 傳輸控制協議)是一種面向連線傳輸協議,就像打電話一樣一直佔著線在聊天,而不是像郵件一樣你一封我一封的通訊。瞭解三次握手,四次斷開之前有必要先學習一些基本概念,首先,最重要的是TCP的首部 , TCP的資料被裝在一個IP資料包裡面,如圖,可以知道的是一個IP包裡面有一個TCP報文段,一個TCP報文段裡面有一個TCP首部
IP資料包結構知道TCP首部有什麼用?
TCP首部對於理解三次握手四次斷開有比較關鍵的作用,如果不知道這些基礎的概念,看到後面你就會暈頭轉向的。其中兩個最重要的欄位是 序列號欄位
另外比較重要的是 SYN(synchronous)同步位元位,ACK(Acknowledgement)確認位元位,FIN(finished)結束位
SYN和ACK位元位用來幫助建立TCP連線.
FIN和ACK位元位用來幫助釋放TCP連線.
稍微計算一下,8位一個位元組,埠號佔用4個位元組。所以總共5行,佔用20位元組的空間。最下面兩行為TCP資料,在建立連線和釋放的階段屬於可選項。
為什麼要使用32位的序列號ISN呢?
序列號(ISN)是用來標記從TCP傳送端到TCP接受端傳送的位元組流,請注意是位元組流,一般序列號隨著時間流遞增。
比如傳送資料階段一段資料由500 000位元組檔案組成,一個TCP報文段裝載1000位元組,則有500個TCP報文段,那麼第一個報文段的序列號為1,第二個報文段的序列號為1001,第三個報文段的序列號為2001
但是在建立連線和釋放連線階段的時候序列號一般只加一。
為什麼使用ISN呢?這是因為在網際網路上傳資料經常會出現丟包的情況以及包延遲的情況。如果沒有序列號,由於到達順序不同,主機將不知道如何管理這些包。
例如序列號為0和2000的包已經送到主機,這時序列號為1000的包剛到,如果不知道這些序號,主機則不知道怎麼排序這些資料。
確認號其包含了傳送端所期望收到的下一個序列號
確認號存在的意義就是說我收到你發過來的包啦,趕緊把下一個序列號也發給我吧。
三次握手
為什麼會叫三次握手呢?
首先主機A傳送一個包給主機B,主機B發回一個確認為第一次握手
主機B傳送一個包回主機A,主機A發回一個確認為第二次握手
主機A再發送最後一個確認給主機B,主機B收到確認建立連線第三次握手.
1、 主機A先發送一個32位初始序列號SEQ=x給主機B ,
設定SYN=1表示要建立TCP連線.
2、 主機B收到資訊後,如果同意連線,傳送一個32位確認號ACK=x+1,然後為自己選擇一個32位初始序列號SEQ=y給主機A,
設定SYN=1表示建立TCP連線,再設定ACK=1位表示確認收到連線申請
3、 主機A收到收到主機B的確認後,向B傳送序列號SEQ=x+1,確認號ACK=y+1
設定ACK=1位表示確認
最後將進行全雙工的通訊,全雙工就是指可以同一時刻你發信息給我,我也可以發信息給你,不耽誤。
這裡有一個很重要的問題是:為什麼A還要傳送一次確認呢?
先假設主機A不用傳送確認,那麼當網際網路中出現丟包現象,主機A傳送的連線請求經過很長時間才到達主機B,這個時候主機A已經和主機B由於超時重新連線已經通訊過了。但是仍然收到一個連線請求。主機A由於已通訊過了,所以不理睬B的確認訊號,這個時候主機B將建立連線並長時間白白浪費埠和資源。主機B如果是伺服器的話,那麼其他客戶端根本就沒有可以連線的機會了,這是一種災難。
四次斷開
這裡我們得先知道TCP連線的一種狀態,即半關閉狀態,指的是A已經沒有資料發給B了,但是B還有資料要傳送給A。
所以關閉過程分為兩步,先關閉A到B的連線,再關閉B到A的連線。
什麼叫四次握手?
這樣可能很不嚴謹,但是為了方便理解
第一次、主機A傳送結束請求,停止傳送資料,主機B確認
傳送FIN=1, 表示A已關閉,請B做好準備
第二次、主機B傳送確認資訊準備關閉,主機A確認,這時B仍然可以向A傳送資料.
傳送ACK=1表示B收到了請求
第三次、主機B再發送關閉,主機A再次確認
傳送FIN=1,表示我準備關閉了,只要你傳送確認我就關閉
第四次、主機A傳送確認,主機B關閉連線
傳送ACK=1,B關閉連線
更多資料
1、計算機自頂向下
2、計算機網路(謝希仁)
3、TCP/IP詳解 卷1
4、圖解TCP/IP
5、Computer networks