TCP三次握手建立连接的过程
來源:TCP三次握手建立連接的過程
TCP 是面向連接的協議,所以每次發出的請求都需要對方進行確認。TCP 客戶端與 TCP 服務器在通信之前需要完成三次握手才能建立連接。
下面詳細講解三次握手的過程。
第 1 次握手
第 1 次握手建立連接時,客戶端向服務器發送 SYN 報文(SEQ=x,SYN=1),并進入 SYN_SENT 狀態,等待服務器確認,如圖所示。
?
第 2 次握手
第 2 次握手實際上是分兩部分來完成的,即 SYN+ACK(請求和確認)報文。
- 服務器收到了客戶端的請求,向客戶端回復一個確認信息(ACK=x+1)。
- 服務器再向客戶端發送一個 SYN 包(SEQ=y)建立連接的請求,此時服務器進入 SYN_RECV 狀態,如圖所示。
第 3 次握手
第 3 次握手,是客戶端收到服務器的回復(SYN+ACK 報文)。此時,客戶端也要向服務器發送確認包(ACK)。此包發送完畢客戶端和服務器進入 ESTABLISHED 狀態,完成 3 次握手,如圖所示。
?
SEQ 表示請求序列號,ACK 表示確認序列號,SYN 和 ACK 為標志位。
分析握手過程中字段的變化
我們知道每一次握手時,TCP 報文中標志位的值是不同的。為了更好地分析 3 次握手時每個標志位的變化,下面以抓包方式分析每個數據包的信息。
【實例】使用 Wireshark 捕獲 TCP 連接數據包并進行分析。
1) 捕獲到 3 次握手包,如圖所示。
?
圖中,第 22 個數據包的源 IP 地址為 192.168.59.135,目標 IP 地址為 192.168.59.131。
在 Transmission Control Protocol 中可以看到,Flags 為 SYN,并且值設置為 1,表示該數據包是主機 192.168.59.135 向主機 192.168.59.131 發起的請求,希望建立 TCP 連接。
Sequence number 表示請求序列號 EQ,值為 0,是由主機 192.168.59.135 隨機生成的。
2) 選擇第 23 個數據包進行查看,如圖所示。
?
該數據包源 IP 地址為 192.168.59.131,目標 IP 地址為 192.168.59.135。
在 Transmission Control Protocol 中可以看到,Flags 為(SYN,ACK),并且將 SYN 置為 1,表示該數據包是主機 192.168.59.131 用來回復主機 192.168.59.135 發送的 TCP 連接請求。
Acknowledgment number 表示 ACK,值為 1。該值是回復主機 192.168.59.135 發來的連接請求 SEQ,因此在 SEQ 的基礎上加 1,以代表確認。
Sequence number 值為 0,該值是由主機 192.168.59.131 生成的,是向主機 192.168.59.135 發送的 SYN,表示同意該主機發來的連接請求。
3) 選擇第 24 個數據包進行查看,如圖所示。
?
源 IP 地址為 192.168.59.135,目標 IP 地址為 192.168.59.131。
在 Transmission Control Protocol 中可以看到,Flags 為 ACK。表示該數據包是主機 192.168.59.135 對主機 192.168.59.131 發來的同意連接數據包后做出的確認回復。
Acknowledgment number 的值為 1,該值是在主機 192.168.59.131 發來的 SEQ 的基礎上加 1 得到的。
Sequence number 的值為 1,表示收到主機 192.168.59.131 發來的同意連接數據包后,再次向該主機發送連接請求,表示要連接了。
構造 TCP 三次握手數據包
客戶端與服務器通過 3 次握手建立連接,實際上是端口與端口之間的連接。用戶可以偽造 3 次握手包,連接指定的端口,或者使用未啟用的端口回復連接,以誤導連接者,使其認為已經正確連接了端口。構造 3 次握手包需要使用 netwox 工具中編號為 42 的模塊。
【實例】已知主機 A 的 IP 地址為 192.168.59.131,端口 443 處于開放狀態。主機 B 的 IP 地址為 192.168.59.135,端口 8080 處于開放狀態。通過主機 A 連接主機 B,構造 3 次握手。
1) 在主機 A 上構造第 1 次握手包,連接主機 B 的 8080 端口,執行命令如下:
root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S 443 -D 8080 -n 2
輸出信息如下:
IP______________________________________________________________. |version| ihl | tos | totlen | |___4___|___5___ |____0x00=0_____ |___________0x0028=40___________ | | id |r|D|M| offsetfrag | |____________0x2262=8802________|0|0|0|________0x0000=0_________ | | ttl | protocol | checksum | |_____0x80=128___|______0x06=6____|____________ 0x2013__________ | | source | |__________________________192.168.59.131_________________________ | | destination | |__________________________192.168.59.135_________________________ | TCP_____________________________________________________________. | source port | destination port | |____________0x01BB=443__________ |__________0x1F90=8080__________ | | seqnum | |_____________________ 0xA97F8D14=2843708692_____________________ | | acknum | |_________________________0x00000000=0__________________________ | | doff | r | r | r | r | C | E | U | A | P | R | S | F| window | |_ 5_| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0|______0x05DC=1500______| | checksum | urgptr | |___________0x59CC=22988___________|__________0x0000=0__________ |上述輸出信息的 IP 部分為 IP 數據報字段。其中,源 IP 地址為 192.168.59.131,目標 IP 地址為 192.168.59.135。TCP 部分為 TCP 數據報字段。其中,源端口為 443,目標端口為 8080,并且 S 的值為 1,表示 SYN 值為 1。
2) 通過抓包驗證的確構造了第 1 次握手包。捕獲的數據包如圖所示。
?
圖中,第 13 個數據包源 IP 地址為 192.168.59.131,目標 IP 地址為 192.168.59.135。
在 Transmission Control Protocol 中可以看到 Flags 為(SYN),并且 SYN 的值被設置為 1,說明該數據包為成功構造的第 1 次握手包。
第 14 個數據包為主機 B 返回的 [SYN,ACK] 響應包。
3) 如果構造的握手包連接主機 B 未開放的端口,將不會收到對應的 [SYN,ACK] 響應包。例如,連接端口 8081,捕獲數據包如圖所示。
?
其中,第 9 個數據包為構造的第 1 次握手包。由于目標主機 8081 端口未開放,沒有收到第 2 次握手包。
4)?為了干擾判斷,這時就可以在主機 B 上構造第 2 次握手包了。執行命令如下:
root@daxueba:~# netwox 42 -x -s 192.168.59.135 -d 192.168.59.131 -S 8081 -D 443 -n 3
輸出信息如下:
IP______________________________________________________________. |version | ihl | tos | totlen | |___4___ |___5___|____0x00=0_____ |___________0x0028=40___________ | | id |r|D|M| offsetfrag | |____________ 0x37E2=14306_______ |0|0|0|________0x0000=0_________ | | ttl | protocol | checksum | |_____0x80=128___|______0x06=6____|____________ 0x110E____________ | | source | |__________________________192.168.59.135_________________________ | | destination | |__________________________192.168.59.131_________________________ | TCP_____________________________________________________________. | source port | destination port | |____________ 0x1F91=8081_________|_________ 0x01BB=443__________ | | seqnum | |_____________________ 0xAC34C455=2889139285_____________________ | | acknum | |_________________________ 0x0000C166=49510______________________ | | doff | r | r | r | r | C | E | U | A | P | R | S | F| window | |_ 5_ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |__________ 0x05DC=1500__________| | checksum | urgptr | |___________ 0x5E5E=24158_________|___________0x0000=0___________ |從 IP 部分可以看到,源 IP 地址為主機 B 的地址 192.168.59.135,目標 IP 地址為主機 A 的地址 192.168.59.131。
從 TCP 部分可以看到,源端口為 8081,目標端口為 443,并且 A 和 S 的值為 1,也就是 SYN 和 ACK 的值為 1。
5) 通過抓包驗證成功構造的第2次握手包,如圖所示。
?
其中,數據包源 IP 地址為 192.168.59.135,目標 IP 地址為 192.168.59.131。
在 Transmission Control Protocol 中可以看到,Flags 為(SYN,ACK),并且 SYN 和 Acknowledgment 的值被設置為 1,說明該數據包為成功構造的第 2 次握手包。這樣,就可以干擾主機 A 的判斷,使其認為主機 B 上的 8081 端口是開放的。
6)?在主機 A 上構造第 3 次握手包,執行命令如下:
root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S 443 -D 8080 -n 4
輸出信息如下:
IP______________________________________________________________. |version | ihl | tos | totlen | |___4___ |___5___|____0x00=0______|___________ 0x003C=60__________ | | id |r|D|M| offsetfrag | |____________ 0x029B=667________|0|0|0|________0x0000=0_________ | | ttl | protocol | checksum | |_____0x80=128___|______0x06=6____|____________ 0x3FC6____________ | | source | |__________________________192.168.59.131_________________________ | | destination | |__________________________192.168.59.135_________________________ | TCP_____________________________________________________________. | source port | destination port | |____________0x01BB=443___________|__________0x1F90=8080__________ | | seqnum | |_____________________ 0x6339F336=1664742198_____________________ | | acknum | |_________________________ 0x000018C9=6345________________________ | | doff | r | r | r | r | C | E | U | A | P | R | S | F| window | |_ 5_ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |__________ 0x05DC=1500__________| | checksum | urgptr | |___________ 0x0A33=2611__________|__________0x0000=0____________ | 68 65 6c 6c 6f 2c 20 68 6f 77 20 61 72 65 20 79 # hello, how are y 6f 75 20 3f # ou ?從 TCP 部分可以看到,A 的值為 1,也就是 ACK 的值。下面的信息為 TCP 分段數據信息。
7) 抓包驗證成功構造了第 3 次握手包,如圖所示。
?
在 Transmission Control Protocol 中可以看到,Flags 為(ACK),并且 Acknowledgment 的值被設置為 1,說明該包為成功構造的第 3 次握手包。
關注微信公眾號「站長嚴長生」,在手機上閱讀所有教程,隨時隨地都能學習。本公眾號由C語言中文網站長運營,每日更新,堅持原創,敢說真話,凡事有態度。來源
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的TCP三次握手建立连接的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天津市端午节吃什么饭菜?
- 下一篇: 咖啡加什么会中毒?