1. 程式人生 > >計算機基礎知識--TCP

計算機基礎知識--TCP

TCP相關知識

TCP(傳輸控制協議)
tcp是面向連線的,在通訊前需要首先建立連線,通訊結束時需要釋放連線。
tcp特點

tcp提供可靠交付服務:tcp傳送的資料無重複,無丟失,無錯誤,與傳送端順序一致
tcp是面向位元組流的:tcp以位元組為單位
tcp提供全雙工通訊:tcp的兩端既可作為傳送端也可作為接收端
一條tcp連線的兩端只能有兩個端點:tcp只能提供點到點的通訊

tcp的識別符號
tcp有7種識別符號,用於表示tcp報文的性質。它們的值只能為0或1

這裡主要介紹常見的幾種識別符號

*URG=1

當URG=1時,表示本資料報的資料部分包涵緊急資訊,此時緊急指標有效

ACK=1

ACK被置為1後確認號欄位才有效
此外,TCP規定,在連線建立後傳送的所有報文段都必須把ACK置1

RST=1

當該值為1時,表示當前TCP連接出現嚴重問題,必須釋放重新連線

SYN=1

SYN在建立連線時使用
當SYN=1,ACK=0時,表示當前報文段是一個連線請求報文
當SYN=1,ACK=1時,表示當前報文段是一個同意建立連線的應答報文

FIN=1

FIN=1,表示此報文段是一個釋放連線的請求報文


TCP三次握手過程如下:

tcp三次握手

起初,服務端和客戶端都為closed狀態,在通訊開始前,客戶端和服務端都要建立各自的傳輸控制塊(TCB)。
伺服器建立完tcb後便進入listen狀態,此時準備接受客戶端傳送來的連結請求。

第一次握手
客戶端向服務端傳送請求連線報文,該報文段的頭部中SYN=1,ACK=0,seq=x。請求傳送後,客戶端便進入SYN-SENT狀態。

SYN=1, ACK=0表示該報文為請求連線報文
seq=x,表示本次tcp通訊的位元組流的初始序號
tcp規定syn=1的報文段不能有資料部分,但是要消耗掉一個序號

第二次握手
服務端收到連線請求報文後,如果同意連線,則會發送一個應答:SYN=1, ACK=1, seq=y,ack=x+1,該應答報文傳送完成後,服務端便進入SYN-RCVD狀態

SYN=1, ACK=1,表示該報文為同意連線的應答報文
seq=y,表示服務端作為傳送者時,傳送位元組流的初始序號
ack=x+1,表示服務端希望下一個資料報傳送序號是從x+1開始的位元組流

第三次握手
當客戶端接收到同意連線的應答報文時,還需向服務端傳送一個確認報文段,表示:服務端傳送過來的同意連線的應答報文已成功接收到。

該報文段的頭部為:ACK=1,seq=x+1,ack=y+1
客戶端傳送完這個報文段後,便進入了ESTABLISHED狀態,服務端收到這個應答報文後,也進入ESTABLISHED狀態,此時整個連線建立完成。


為何tcp連線的建立需要三次握手,兩次握手行不行?

答案是不行

三次握手的目的是:防止實效的請求連線報文段被服務端接收,從而產生錯誤

失效的請求連線報文:客戶端向服務端傳送的連線請求丟失,客戶端等待應答超時後就會重新發送請求連線報文,此時,上一個連結請求就是實效的

如果連線只建立兩次握手,客戶端並無大的改變,仍然需要獲得服務端的應答報文後進入ESTABLISHED狀態,而此時,服務端在接收到請求連線報文後就進入ESTABLISHED狀態;

如果網路堵塞,客戶端傳送的請求連線報文遲遲無法到達服務端,客戶端請求超時就會重新發送連線請求,此時,如果服務端正確的接受了該次連線請求,並正確應答,雙發便開始通訊,接收通訊時釋放連線;

如果此時那個實效的連線請求到達了服務端,由於只有兩次握手,服務端接收到請求連線報文後就進入ESTABLISHED狀態,等待客戶端傳送資料,或者主動傳送資料,但是此時,客戶端早已進入CLOSED狀態,服務端就會一直等待下去,造成服務端連線資源的浪費。


TCP的四次揮手

tcp連線是雙向的,其釋放連線需要四步 。

在四次揮手中,前兩次揮手用於斷開一個方向的連線,後兩次揮手用於斷開另一個方向的連線
這裡寫圖片描述

第一次揮手

如果A認為資料傳送完成後,則需要向B傳送連結釋放請求;該請求只有報文頭,主要攜帶的引數為:FIN=1,seq=u。 此時A將進入FIN-WAIT-1狀態。

FIN=1; 表示該報文段是一個連結釋放請求
seq=u; 表示A向B傳送的最後一個位元組序號為u-1

第二次揮手

B收到A的連線釋放請求後,會通知相應的應用程式,告訴它A向B方向的連結已經釋放,此時B進入CLOSE-WAIT狀態,並向A傳送連結釋放的應答,其報文頭包含:ACK=1,seq=v,ack=u+1

ACK=1;除tcp連結請求報文外,tcp通訊過程中所有的資料報的ack都為1,表示應答
seq=v;表示B向A傳送的最後一個位元組序號為v-1
ack=u+1;表示希望收到從第u+1個位元組開始的報文段,並已經成功接收前u個位元組
A收到該應答,便進入FIN-WAIT-2狀態,等待B傳送連線釋放請求

第二次揮手完成後,A到B方向的連結已經釋放,B不會再接受資料,A也不會再向B傳送資料;但是B向A方向的連結仍然存在,B可以繼續向A傳送資料

* 第三次揮手*
當B向A傳送完資料後,向A傳送連結釋放請求,請求頭:FIN=1,ACK=1,seq=w,ack=u+1;

報文頭中的識別符號含義同上

第四次揮手

A收到釋放請求報文後,向B傳送確認應答,此時,A進入TIME-WAIT狀態,該狀態會持續2MSL時間,若該時間段內,B沒有重新發送請求的話,A便進入CLOSED狀態,撤銷TCB。當B受到確認應答後,也進入CLOSED狀態,撤銷TCB


為何第四次揮手時,A要進入TIME-WAIT狀態,並等待2MSL時間,然後才進入CLOSED狀態

目的: 為了確保B收到A的確認應答

如果當a傳送完確認應答之後,直接進入closed狀態,如果該應答丟失,b等待超時,就會重新發送連結釋放請求,但是此時a已經關閉,不會作出任何響應,因此b永遠無法正確關閉。