TCP“三次握手”、“四次揮手”

TCP協議

TCP協議是建立在不可靠的ip層之上實現的可靠的數據傳輸協議,它主要解決傳輸的可靠、有序、無丟失和不重複的問題。TCP是TCP/ip體系中非常複雜的一個協議,主要特點是:

1、TCP是面向連接的傳輸層協議。

2、每一條TCP連接只能有兩個端口,每一個TCP連接只能是點對點的。

3、TCP提供可靠的交付服務,保證傳輸的數據無差錯,不丟失不重複且有序。

4、TCP提供全雙工通信。

5、TCP是面向字節流的,雖然應用程序和TCP的交互是一次一個數據塊,但TCP把應用程序交下來的數據看成是一連串的物結構的字節流。

TCP報文段

TCP傳送的數據單元稱爲報文段。一個TCP報文段分爲TCP受不和TCp數據兩部分,整個TCP段作爲IP數據報的數據部分封裝在IP數據報中,其首部的前20個字節是固定的。TCP報文段的首段最短爲20字節,後面有4N字節是根據而增加的選項,通常長度爲4字節的整數倍。

TCP報文段既可以用來運載數據,也可以用來建立連接、釋放連接和應答。

TCP首部各字段主要意義如下:

源端口和目的端口字段,各佔兩個字節。

序號字段(seq):4字節,指的是本TCP字段所發送的數據的第一個字節的序號。

確認號字段(ack):4字節,期望收到對方的下一個報文段的數據的第一個字節的序號。若確認爲N,則表明序號N-1位置的所有數據均以正確收到。

數據偏移:4位,首部長度。

保留字段:6位,保留爲今後使用。

緊急位URG:當URG=1時,表示緊急指針字段有效。它告訴系統此報文段中有緊急數據,應儘快傳送。

確認位ACK:只有當ACK=1時,確認號字段纔有效。當ACK=0時,確認號無效。TCP規定,在連接建立後的所有傳輸的報文段都必須把ACK置1,。

推送位PSH:接收TCP收到PSH=1的報文段,就儘快交付接受應用進程,而不用再等到整個緩存都填滿了後再向上交付。

復位位RST:當RST=1表示TCP連接中出現嚴重差錯,必須釋放連接,然後再重新建立運輸連接。

同步位SYN:SYN=1表示這是一個連接請求或連接接受報文。

當SYN=1,ACK=0,表明這是一個連接請求報文,對方若同意建立連接,則在響應報文中使用SYN=1,ACK=1.

終止位FIN:釋放一個連接,FIN=1表示報文段的發送方的數據已發送完畢,並要求釋放傳輸連接。

窗口字段:2字節。指出了現在允許對方發送的數據量。

校驗和:2字節。

緊急指針字段:16位指出緊急數據共多少字節。

選項字段:長度可變。

填充字段:爲了使整個首部長度是4個字節的整數倍。

“三次握手”

TCP是面向連接的協議。因此每一個TCP連接都有三個階段:連接建立、數據傳輸和連接釋放。TCP連接的管理就是是的運輸連接的建立與釋放都可以正常進行。

在建立連接的過程中有三個要解決的問題:

1、要使每一方都能確知對方的存在。

2、要允許雙方協商一些參數。

3、能夠對運輸實體資源進行分配。

TCP連接的端點不是主機不是ip地址也不是進程,而是套接字;

每一個TCP連接唯一地被通信兩段的兩個端點(即兩個套接字)所確定。TCP連接採取的方式是客戶/服務器方式。

“三次握手”即發生在TCP連接建立的過程。

第一步:客戶機TCP首先向服務器的TCP發送一個連接請求報文段,這個特殊的報文段不包含應用層數據,其首部的SYN字段被置爲1,表示這是一個請求連接的報文,另外客戶機會隨機選擇一個起始序號seq = x;

第二步:服務器的TCP接收到連接請求報文段後,如同意建立連接,就像客戶機發回確認,併爲該TCP連接分配TCP緩存和變量。在確認報文段中,SYN、ACK被置爲1表示同意建立連接。並且確認號字段的值爲x+1,並且服務器隨機產生起始序號seq=y,確認報文段同樣不包含應用層數據。

第三部:當客戶機收到確認報文段後,還要想服務器給出確認,並且也要給該連接分配緩存和變量。這個報文段的ACK置爲1,序號字段爲x+1,確認號字段ack = y+1,該報文段可以攜帶數據,如果不攜帶數據則不消耗序號。

值得注意的是服務器端的資源是在完成第二次握手時分配的,而客戶端的資源是在完成第三次握手時分配的。這就使得服務器容易受到SYN洪泛攻擊。

“四次揮手”

參與TCP連接的兩個進程中的任意一個都能終結該連接。

第一步:客戶機打算關閉連接,就向其TCP發送一個連接釋放報文段,並停止再發送數據,主動關閉TCP連接,該報文段的FIN標誌位被置爲1,seq=u,它等於前面已傳送過的數據的最後一個字節的序號加1(FIN報文段即便不攜帶數據,也要消耗一個序號)。TCP是全雙工的,即可以想象成一條TCp連接上有兩條數據通路。

步驟一執行後,服務器還可以向客戶機傳輸數據,但客戶機不可。

第二步:服務器接收到連接釋放報文段後即發出確認,確認號是ack = u+1,而這個報文段自己的序號是v,等於它前面已傳送過的數據的最後一個字節的序號+1。此時,從客戶機到服務器這個方向的連接就I釋放了,TCp處於半關閉狀態。但服務器若發送數據,客戶機要接收,即從服務器到客戶機這個方向的連接並未關閉。

第三步:若服務器已經沒有要向客戶機發送的數據,就通知TCP釋放連接,此時其發出FIN=1的連接釋放報文段。

第四步:客戶機收到連接釋放報文段後,必須發出確認。在確認報文段中,ACK字段被置爲1,確認號ack=w+1,seq=u+1.此時TCP連接還沒有釋放掉,必須經過時間等待計時器設置的時間2MSL後,A才進入到連接關閉狀態。

上述揮手握手過程可簡化如下:

握手:

1、SYN=1,seq = x;

2、SYN=1,ACK=1,seq=y,ack=x+1;

3、ACK=1,seq = x+1,ack = y+1;

揮手:

1、FIN = 1,seq = u;

2、ACK=1,seq = v,ack=u+1;

3、FIN=1,ACK =1,seq=w,ack = u+1;

4、ACK = 1,seq = u+1,ack=w+1;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章