1、名詞解釋
1) TCP(Transmission Control Protocol)傳輸控制協議
TCP是主機對主機層傳輸控制協議,爲提供可靠的連接服務,採用三次握手來確認建立一個連接。
採用四次揮手來進行協議的終止。
2) 位碼
TCP標誌位,有以下6種標示:
標誌位 | 英文 | 含義 |
---|---|---|
SYN | synchronouse | 建立連接 |
ACK | acknowledgement | 確認標誌 |
PSH | push | 傳送標誌 |
FIN | finish | 結束標誌 |
RST | reset | 重置標誌 |
URG | urgent | 緊急標誌 |
3) Sequence number 順序號碼
4) Acknowledgement 確認號碼
5) 連接狀態
狀態 | 介紹 |
---|---|
LISTENING | 提供某種服務,偵聽遠方TCP端口的連接請求,當提供的服務沒有被連接時,處於LISTENING狀態,端口是開放的,等待被連接。 |
SYN_SENT (客戶端狀態) | 客戶端調用connect,發送一個SYN請求建立一個連接,在發送連接請求後等待匹配的連接請求,此時狀態爲SYN_SENT。 |
SYN_RCVD (服務端狀態) | 在收到和發送一個連接請求後,等待對方對連接請求的確認,當服務器收到客戶端發送的同步信號時,將標誌位ACK和SYN置1發送給客戶端,此時服務器端處於SYN_RCVD狀態,如果連接成功了就變爲ESTABLISHED,正常情況下SYN_RCVD狀態非常短暫。 |
ESTABLISHED | ESTABLISHED狀態是表示兩臺機器正在傳輸數據。 |
FIN-WAIT-1 | 等待TCP連接中斷請求的確認,主動關閉端應用程序調用close,TCP發出FIN請求主動關閉連接,之後進入FIN_WAIT1狀態。 |
FIN-WAIT-2 | 1、主動關閉端接到FIN ack後,便進入FIN-WAIT-2,這是在關閉連接時,客戶端和服務器兩次揮手之後的半關閉狀態,在這個狀態下,客戶端應用程序還有接受數據的能力,但是已經無法發送數據;2、另一種情況是主動關閉端收到了服務端的FIN請求 |
CLOSE-WAIT | 等待從本地用戶發來的連接中斷請求 ,被動關閉端TCP接到FIN後,就發出ACK以迴應FIN請求(它的接收也作爲文件結束符傳遞給上層應用程序),並進入CLOSE_WAIT |
CLOSING | 等待遠程TCP對連接中斷的確認,處於此種狀態比較少見 |
LAST-ACK | 等待原來的發向遠程TCP的連接中斷請求的確認,被動關閉端一段時間後,接收到文件結束符的應用程序將調用CLOSE關閉連接,TCP也發送一個 FIN,等待對方的ACK.進入LAST-ACK。 |
TIME-WAIT | 在主動關閉端接收到FIN後,TCP就發送ACK包,並進入TIME-WAIT狀態,等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認,很大程度上保證了雙方都可以正常結束。 |
CLOSED | 被動關閉端在接受到ACK包後,就進入了closed的狀態,連接結束,沒有任何連接狀態。 |
2、三次握手解釋
三次握手的圖解如上圖,每一條箭頭代表着一次握手,那麼具體是什麼意思呢?
第一次握手: Client端發送位碼爲SYN=1,隨機產生seq number=J的數據包到服務器,Server端收到數據包後,由SYN=1判斷出 Client端要求連接;此時Client端處於SYN_SENT的狀態。
第二次握手: Server端收到請求後要向Client端發送確認連接的信息,於是,Server端向Client端發送一個ACK=1,SYN=1,ack number=J+1(即Client端的seq number +1),隨機生成的seq number=K,此時服務端處於SYN_RCVD;
第三次握手:
Client端收到後檢查兩點 :
1、ack number 是否正確(是否等於J+1);
2、位碼ACK是否等於1。
若以上兩點都正確,Client端會再次發送ack num=K+1(第二次機握手中 Server端發送的seq number + 1),位碼ACK=1,
Server端收到後確認ack number值是否正確,ACK是否爲1 ,若均正確則連接建立成功。
此時雙方處於ESTABLISHED的狀態。
3、四次揮手
四次揮手的示意圖如上圖,每一條箭頭代表着一次揮手。
第一次揮手: Client端發送位碼爲FIN=1,隨機產生seq number=J的數據包到服務器,Server端收到數據包後,由FIN=1判斷出 Client端要求斷開連接;此時Client端處於FIN-WAIT-1的狀態。
第二次揮手: Server端收到請求後要向Client端發送確認斷開連接的信息,於是,Server端向Client端發送一個ACK=1,ack number=J+1(即Client端的seq number +1),此時服務端處於CLOSE_WAIT的狀態,Client端收到這個信號後,由FIN-WAIT-1變成FIN-WAIT-2的狀態,此時Client端可以接受Server端的數據但是不能向Server端傳輸數據。
第三次揮手: Server端主動向Client端發送一個位碼爲FIN=1,隨機產生seq number=K 的數據包到服務器,Client端收到數據包後,由FIN=1判斷出Server端要斷開連接,此時Server端處於LAST-ACK的狀態。
第四次揮手: Client端接受到Server端的請求後,要向Server端發送確認端口連接的信息,於是,Client端向Server端發送了一個ACK=1,ack num=K+1(即Server端的seq number +1),發送後Client端處於TIME-WAIT的狀態,等待2MSL後變成CLOSED,而Server端收到Client端的最後一個ACK後便會變成CLOSED