1. 程式人生 > >TCP協議的連線機制---三次握手訊號的原理

TCP協議的連線機制---三次握手訊號的原理

這篇文章是寫給什麼人看的?

網路程式設計是現代計算機程式設計中不可缺少的一個環節,這裡面的程式設計師主要分為兩種型別:一種是專門搞網路程式設計的,估計是一些通訊專業的童鞋,他們的任務是管理整個網路的通訊;第二種是使用網路作為一個傳輸介質的的,最常見的就是使用socket程式設計的人,他們一般只是使用一些介面函式來完成通訊任務。這兩種人的關係就好比是修路人和走路人的關係,而這一篇文章是面向走路人的,更確切的說,就是幫助你通過網路程式設計面試的。

這篇文章的主要內容是什麼?

正因為TCP三次握手訊號非常重要,也非常基礎,所以是很多企業判斷一個人是否瞭解網路程式設計的常用武器。就好像一提到C++就必須問的多型及虛擬函式那一套東西一樣,所以本文就以一個外行人的視角(事實上本人也確實是個外行),來幫助你理解一下著名的三次握手協議。好了,步入正題。

首先,為什麼要連線?

這是最基本問題之一,人家不一定會問,但為了對TCP有個較深入的理解,還是知道的好,因為也不復雜,就是一句話:因為TCP是面向連線的,只有連線好了才可以進行通訊。

然後,先了解一下什麼叫協議?

協議其實就是通訊雙方的一種規定。在計算機領域,就是大家規定好一些標誌位,它們分別對應著一些特殊的意義。比如說收到對方一個位元組資訊,這個位元組的第一位表示對方是男是女,後面6位表示對方年齡,還剩一位是校驗位。

TCP中的標誌位有哪些?

理解了上面這一點,那我們就來看看TCP協議都規定了哪些標誌位,當然,這些位很多,我們只講跟連線相關的幾個。而且為了略去無關資訊,把這些位在報文中的位置資訊也省去了,總之它們都是出現在TCP的報文中的。

①序列號seq,就是給報文的一個編號,因為這個編號不一定從0或者1開始,但肯定是一個一個往上加的,但注意收發兩端的序列號是分開計數的

②確認號ack,是期待接收到對方下一個報文的序列號,如果確認號為n,則說明前n-1個報文正確接收

確認ACK,就是對方確認收到你資訊的標誌位,當ACK=1時,確認號才有意義

同步SYN,這是專門用來連線時的標誌位,當SYN=1,而ACK=0時證明這是一個請求連線訊號

終止FIN,這是專門用來是放一個連線的標誌位,當FIN=1時,表示要釋放連線了

再強調一下,三次握手協議就是通過設定上面這些標誌位來實現的,而這些標識為都出現在TCP的報文中。

三次握手到底如何進行?

好了,下面開始講三次握手過程,即TCP協議是如何建立一個連線的。為了方便敘述,我們先看一下示意圖。


建立連線的過程大致如下:

①剛開始時,客戶端和伺服器都處於關閉狀態

②伺服器建立一個傳輸控制塊TCB,用於記錄連線資訊,此後,伺服器進入監聽狀態,及等待連線狀態

③客戶端有連線需求時,首先也建立一個傳輸控制塊TCB,然後開始傳送資訊

④第一次握手,客戶端向伺服器傳送一個同步訊號報文,其中的同步訊號SYN=1,還有一個序列號seq=x

⑤第二次握手,伺服器接收到客戶端發來的連線訊號後,回一個同步訊號報文,其中的SYN=1,確認標誌ACK=1,確認序列號ack=x+1,序列號seq=y

⑥第三次握手,客戶端收到伺服器發來的確認訊號後,會回一個確認訊號,其中ACK=1,seq=x+1,ack=y+1

然後連線就建立好啦,雙方想傳啥就傳啥吧...

如果去除序列號和確認號這些附加資訊,三次握手就可以簡化為同步訊號,確認同步訊號,確認訊號三個。