雖然這個話題已經是老生常談了,隨手一搜資料一堆,但是讓人快速掌握,我認為應該有幾個概念先被明確指出,再放出那張大同小異的時序圖。
01關注的字段
探討三次握手問題前,不得不先了解TCP報文段中存在的這四個位置:
注意ACK和ack的不同之處
正因為ACK、SYN是標志位,因此在不同資料中可能會用類似于“不標出ACK”的方式來表示ACK=0的狀態,此時若再標出ack的值則坑會因字母相同令人混淆誤解。下面分別解釋四個字段的含義:
序號字段seq。TCP是面向字節流的(即TCP傳送時是逐個字節傳送的),所以TCP連接傳送的數據流中的每個字節都編上一個序號。序號字段的值指的是本報文段所發送的數據的第一個字節的序號。
例如,一報文段的序號字段值是301,而攜帶的數據共有100B,表明本報文段的數據的最后一個字節的序號是400,因此下一個報文段的數據序號應從401開始。
確認號字段ack。是期望收到對方的下一個報文段的數據的第一個字節的序號。若確認號為N,則表明到序號N-1為止的所有數據都已正確收到。
例如,B正確收到了A發送過來的一個報文段,其序號字段是501,而數據長度是200B(序號501~700),這表明B正確收到了A發送的到序號700為止的數據。因此B期望收到A的下一個數據序號是701,于是B在發送給A的確認報文段中把確認號置為701。
確認位ACK。只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效。
TCP規定,在連接建立后所有傳送的報文段都必須把ACK置1。
同步位SYN。同步SYN=1表示這是一個連接請求或連接接收報文。
當SYN=1,ACK=0時,表明這是一個連接請求報文,對方若同意建立連接,則在響應報文中使用SYN=1,ACK=1。即SYN=1表示這是一個連接請求或連接接收報文。
02連接的建立
四個字段的顏色已經被區分開
1:客戶機的TCP首先向服務器的TCP發送一個連接請求報文段。這個特殊的報文段中不含應用層數據,其首部中的SYN標志位被置為1。另外,客戶機會隨機選擇一個起始序號seq=x(連接請求報文不攜帶數據,但要消耗一個序號)。
2:服務器的TCP收到連接請求報文段后,如同意建立連接,就向客戶機發回確認,并為該TCP連接分配TCP緩存和變量。在確認報文段中,SYN和ACK位都被置為1,確認號ack字段的值為x+1,并且服務器隨機產生起始序號seq=y(確認報文不攜帶數據,但也要消耗一個序號)。
3:當客戶機收到確認報文段后,還要向服務器給出確認,并且也要給該連接分配緩存和變量。這個報文段的ACK標志位被置1,序號字段seq為x+1,確認號字段ack=y于1。該報文段可以攜帶數據,若不攜帶數據則不消耗序號。
可得這樣的結論:SYN與ACK標志當前的行為,而ack是上一次對方的seq加一,seq是上一次對方的ack
03連接的釋放
釋放連接時使用終止位FIN標記狀態
1:客戶機打算關閉連接時,向其TCP發送一個連接釋放報文段,并停止發送數據,主動關閉TCP連接,該報文段的FIN標志位被置1,seq=u,它等于前面已傳送過的數據的最后一個字節的序號加1(FIN報文段即使不攜帶數據,也要消耗一個序號)。TCP是全雙工的,即可以想象為一條TCP連接上有兩條數據通路。發送FIN報文時,發送FIN的一端不能再發送數據,即關閉了其中一條數據通路,但對方還可以發送數據。
2:服務器收到連接釋放報文段后即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等于它前面已傳送過的數據的最后一個字節的序號加1。此時,從客戶機到服務器這個方向的連接就釋放了,TCP連接處于半關閉狀態。但服務器若發送數據,客戶機仍要接收,即從服務器到客戶機這個方向的連接并未關閉。
3:若服務器已經沒有要向客戶機發送的數據,就通知TCP釋放連接,此時其發出FIN=1的連接釋放報文段。
4:客戶機收到連接釋放報文段后,必須發出確認。在確認報文段中,ACK字段被置為1,確認號ack=w+1,序號seq=u+1。此時TCP連接還未釋放,必須經過時間等待計時器設置的時間2MSL后,A才進入連接關閉狀態。
關閉連接的特點是2、3階段都是由服務器端發送消息,此時ack是不變的。交替進行的信息交換過程,仍然滿足結論:ack是上一次對方的seq加一,seq是上一次對方的ack
04例題
(2011年統考真題)主機甲向主機乙發送一個(SYN=1,seq=11220)TCP段,期望與主機乙建立TCP連接,若主機乙接受該連接請求,則主機乙向主機甲發送的正確的TCP段可能是()。
A.(SYN=0,ACK=0,seq=11221,ack=11221)
B.(SYN=1,ACK=1,seq=11220,ack=11220)
C.(SYN=1,ACK=1,seq=11221,ack=11221)
D.(SYN=0,ACK=0,seq=11220,ack=11220)
根據前文說的結論,ack為上次對方seq+1只能選A or C,應答行為ACK應取1則選C(而狀態為建立連接 同步標志應取1更應選C)
舉報/反饋