建立TCP连接时的三次握手与四次挥手问题
1. 字段含義
1.1 狀態字段
- ACK 報文是用來應答的,SYN 報文是用來同步的
- LISTEN:偵聽來自遠方TCP端口的連接請求
- SYN-SENT:在發送連接請求后等待匹配的連接請求
- SYN-RECETVED:在收到和發送一個連接請求后等待對連接請求的確認
- ESTABLISHED:代表一個打開的連接,數據可以傳送給用戶
- FIN-WAIT-1:等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認
- FIN-WAIT-2:從遠程TCP等待連接中斷請求
- CLOSE-WAIT:等待從本地用戶發來的連接中斷請求
- CLOSING:等待遠程TCP對連接中斷的確認
- LAST-ACK:等待原來發向遠程TCP的連接中斷請求的確認
- TIME-WAIT:等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
- CLOSED:沒有任何連接狀態
1.2 傳輸中的涉及字段(重點字段)
-
序號:Seq序號,占32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記
-
確認序號:Ack 序號,占32位,只有 ACK 標志位 為1時,確認序號字段才有效,Ack = Seq+1
-
標志位
- URG:緊急指針(urgent pointer)有效
- ACK:確認序號有效(用來應答的)
- SYN:發起一個新連接(用來同步的)
- PSH:接收方應該盡快將這個報文交給應用層
- RST:重置連接
- FIN:釋放一個連接
注意:
不要將確認序號 Ack 與標志位中的 ACK 搞混了
確認方Ack=發起方Req+1,兩端配對
2. 三次握手
2.1 原理
剛開始客戶端處于 Closed 的狀態,服務端處于 Listen 狀態。
第一次握手:客戶端給服務端發一個 SYN 報文,并指明客戶端的初始化序列號 ISN?,此時客戶端處于 SYN_SEND 狀態。
第二次握手:服務器收到客戶端的 SYN 報文之后,會以自己的 SYN 報文作為應答,并且也是指定了自己的初始化序列號 ISN(s) ,同時會把客戶端的 ISN + 1 作為 ACK 的值,表示自己已經收到了客戶端的 SYN,此時服務器處于SYN_RCVD 的狀態。
第三次握手:客戶端收到 SYN 報文之后,會發送一個 ACK 報文,當然,也是一樣把服務器的 ISN + 1 作為 ACK 的值,表示已經收到了服務端的 SYN 報文,此時客戶端處于 ESTABLISHED 狀態。服務器收到 ACK 報文之后,也處于 ESTABLISHED 狀態,此時,雙方已建立起了鏈接。
2.2 作用
(1)確認雙方的接受能力、發送能力是否正常。
(2)指定自己的初始化序列號,為后面的可靠傳送做準備。
(3)如果是 HTTPS 協議的話,三次握手這個過程,還會進行數字證書的驗證以及加密密鑰的生成。
2.3 涉及問題
什么是SYN攻擊(SYN Flood)?如何檢測SYN攻擊?如何防御SYN攻擊?
3. 四次揮手
3.1 原理
剛開始雙方都處于 ESTABLISHED 狀態,假如是客戶端先發起關閉請求
第一次揮手:客戶端發送一個 FIN 報文,報文中會指定一個序列號。此時客戶端處于 FIN_WAIT1 狀態。
第二次揮手:服務端收到 FIN 之后,會發送 ACK 報文,且把客戶端的序列號值 +1 作為 ACK 報文的序列號值,表明已經收到客戶端的報文了,此時服務端處于 CLOSE_WAIT 狀態。
第三次揮手:如果服務端也想斷開連接了,和客戶端的第一次揮手一樣,發給 FIN 報文,且指定一個序列號。此時服務端處于 LAST_ACK 的狀態。
第四次揮手:客戶端收到 FIN 之后,一樣發送一個 ACK 報文作為應答,且把服務端的序列號值 +1 作為自己 ACK 報文的序列號值,此時客戶端處于 TIME_WAIT 狀態。
需要過一陣子以確保服務端收到自己的 ACK 報文之后,就處于關閉連接了,進入 CLOSED 狀態。
3.2 涉及問題
總結
以上是生活随笔為你收集整理的建立TCP连接时的三次握手与四次挥手问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP 三次握手与四次挥手
- 下一篇: Hive学习笔记 —— Hive概述