Wireshark文档阅读笔记-TCP 3 way handshaking解析与实例
這里先介紹2個概念:
TCB:Transmission Control Block,傳輸控制塊,這個和PCB(進程控制塊)類似,存儲了很多重要的內容。如TCP連接表,發送緩存指針和接收緩存指針,重發隊列指針,當前序列號和確認序列號(ACK)。
ACK包中帶有“數據”,這個數據是指處理SYN(Synchronize Sequence Numbers同步序列號),確認包序列為seq=x+1,這個x是客戶端或服務器傳過來的。但在實際TCP3次握手中,不僅僅包含這些東西,還帶有商議的內容如MSS(maximum segment size)等。
?
假設客戶端和服務端目前都處于CLOSED狀態。
流程圖如下:
1. 服務端創建TCB,并且使用TCB接收客戶端請求,當TCB建立起來后,服務端的狀態會從CLOSED變為LISTEN。
2. 客戶端也創建TCB,并且使用TCB發送請求,請求頭中帶有“SYN=1”,生成一個任意的隨機數seq=x。SYN包(SYN設置為1的包稱為SYN包),除了攜帶sql=x這個會被服務端處理的消息,不會攜帶其他消息。當請求發送后客戶端會從CLOSED狀態轉變為SYN-SENT狀態。
3. 服務端接收到客戶端消息后:
? ? a. 如果服務端接收到客戶端發起的連接(也就是這個消息),會回一個確認消息,在消息體中帶有SYN和ACK,并且都會被置為1,服務端也會生成一個隨機數seq=y,ack=x+1,這個x是客戶端發過來的值,這個包里面只會包含剛剛說的那些數據。此時服務端的狀態將變為SYN-RCVD。
? ? b. 如果服務端拒絕連接,將會發送RST包用于重置連接。
4. 客戶端接收到服務端的響應,會發送一個確認包內容為ACK置為1,seq=x+1。
完成上面的操作后兩個進程的狀態都會轉變為ESTABLISHED,這就是TCP的三次握手。
?
官方的例子如下:
點擊下載
?
下面來分析下本人抓的包:
這里我們使用Java搭建一個Web服務端,請求的關鍵代碼如下:
package cn.it1995.demo;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class MyController {@GetMapping("/test")public String test(){return "test";} }用C++寫個客戶端,讓其連接,獲取數據,然后斷開連接:
#include <QCoreApplication> #include <QDebug> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QUrl>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QNetworkAccessManager manager;QNetworkRequest request;request.setUrl(QUrl("http://127.0.0.1:8080/test"));QNetworkReply *reply = manager.get(request);QObject::connect(reply, &QNetworkReply::finished, [&](){qDebug() << reply->readAll();qApp->exit();});return a.exec(); }此時抓到的包如下:
一開始客戶端發了一個包將Seq=0。
服務端收到后返回Ack=0+1,而Seq=0這個0為服務端產生的隨機數。
客戶端接收到服務端的包后將Ack設置為1,Seq為0+1。這個0為服務端傳過來的0。
?
總結
以上是生活随笔為你收集整理的Wireshark文档阅读笔记-TCP 3 way handshaking解析与实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Charles笔记-配置Charles代
- 下一篇: 信息安全工程师笔记-RSA密码