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