天天看點

網絡程式設計之“三次握手四次斷開”

      TCP的三次握手四次斷開,你了解嗎?作為一系統運維人員,如果您掌握了這個原理,就如虎添翼;作為一名系統開發人員,如果您不精通,當你寫高并發、高性能的伺服器軟體時,會感覺内力不足。

用戶端和服務端建立TCP連接配接時,需要完成那些過程?如下圖:

網絡程式設計之“三次握手四次斷開”

說明:

1) 用戶端首先和服務端互動三個封包,建立連接配接。

2) 用戶端首先和服務端互動四個封包,斷開連接配接。

模拟場景:

用戶端向服務端發送字元串Hello,server!  服務端接收到以後,再講字元串發送會用戶端。

網絡程式設計之“三次握手四次斷開”

1.用戶端通過7500端口向服務端的20000端口發送一個SYN同步請求包,展開第一次握手,其中Flags [S]表求資料包的類型為SYN, 即同步請求包,seq字段辨別資料包序列号。

2.服務端發送ACK确認包,同時附代一個SYN請求包,在确認用戶端同步請求的同時 向用戶端發送同步請求,其中Flags [S.]中的點号表示這是個确認包(ACK),S表示它同時又是一個SYN請求包。因為TCP是雙工通信協定,連接配接建立之後雙方可以同時收發資料,是以雙 方都發送了SYN包請求同步。

3.用戶端發送ACK包确認服務端的SYN同步請求,可以看到此時Flags中隻有一個小數點,表示這個包隻是用來做确認的。

到此為止,三次握手過程就結束了,雙方如果都收到了ACK包,則都進入到ESTABLISHED狀态,表明此時可以進行資料發送了。

4. 用戶端向服務端發送一個資料包,包中的内容就是一個字元串,可以看到此時的Flags辨別中有個字母P,意為PUSH

DATA,就是發送資料的意思。<b>Length=12,hello,server!</b>

5. 服務端發送ACK确認包,其中Flags[.]中的點表示這是個确認包。

6. 服務端發送ACK确認包,其中Flags[P.]中的點表示這是個确認包,P意為PUSH DATA,發送資料的意思.length=129.

<b>   #define BUFFER_SIZE 128</b>

<b>strncpy(dataBuffer,"Hello,server!",strlen("Hello,server"));</b>

<b>   int errSend =</b>

send(sockClient,dataBuffer,strlen(dataBuffer),0);

<b>7.</b> 用戶端發送FIN包,準備斷開連接配接。

8. 伺服器收到FIN包後,對其作出反應,發送ACK包,确認這一方向的連接配接将關閉,

9. 等伺服器的應用程式做好關閉準備時,伺服器反方向發送FIN包,請求關閉連接配接請求,

10. 客戶機對伺服器發送的請求進行确認,并發送ACK包<b></b>

<b>資料傳輸的過程:</b>

建立連接配接後,TCP 協定提供全雙工的通信服務,但是一般的用戶端/伺服器程式的流程是由用戶端主動發起請求,伺服器被動處理請求,一問一答的方式。是以,伺服器從 accept()傳回後立刻調用read(),讀socket就像讀管道一樣,如果沒有資料到達就阻塞等待,這時客戶

端調用write()發送請求給服務 器,伺服器收到後從read()傳回,對用戶端的請求進行處理,

在此期間用戶端調用read()阻塞等待伺服器的應答,伺服器調用write()将處理結 果發回給客

戶端,再次調用read()阻塞等待下一條請求,用戶端收到後從read()傳回,發送下一條請求,

如此循環下去。

如果用戶端沒 有更多的請求了,就調用close()關閉連接配接,就像寫端關閉的管道一樣,服務

器的read()傳回0,這樣伺服器就知道用戶端關閉了連接配接,也調用 close()關閉連接配接。注意,

任何一方調用close()後,連接配接的兩個傳輸方向都關閉,不能再發送資料了。如果一方調用

shutdown()<b>則連接配接處于半關閉狀态</b>,仍可接收對方發來的資料。