深入研究TCP&三次握手四次揮手

Wireshark捕獲的TCP報(bào)文字段說(shuō)明

Wireshark捕獲字段 對(duì)應(yīng)TCP報(bào)文頭部 說(shuō)明
Source Port 16位源端口號(hào) TCP連接客戶端的端口號(hào)
Destination Port 16位目標(biāo)端口號(hào) TCP連接服務(wù)端的端口號(hào)
Sequence number 32位序列號(hào) 客戶端的數(shù)據(jù)組的第一個(gè)字節(jié)的序號(hào)
Acknowledgment number 32位確認(rèn)序號(hào) 服務(wù)端期望客戶端的下一個(gè)報(bào)文段的序號(hào)
Header Length 首部長(zhǎng)度 數(shù)據(jù)區(qū)在報(bào)文段中的起始偏移值
Flags:Urgent URG 表示緊急指針是否有效,URG=1表示緊急,應(yīng)該盡快傳輸
Flags:Acknowledgment ACK 表示確認(rèn)序號(hào)是否有效,ACK=1確認(rèn)序號(hào)有效,ACK=0確認(rèn)序號(hào)無(wú)效則不是一個(gè)確認(rèn)包
Flags:Push PSH 表示是否確認(rèn)推送有效,當(dāng)PSH=1時(shí),表示服務(wù)端應(yīng)盡快把數(shù)據(jù)交給應(yīng)用層
Flags:Reset RST 表示是否確認(rèn)復(fù)位有效,當(dāng)RST=1時(shí),表示TCP連接出現(xiàn)嚴(yán)重差錯(cuò),需要重連
Flags:Syn SYN 表示同步是否有效,當(dāng)SYN=1時(shí)表明這是一個(gè)連接請(qǐng)求或連接接收?qǐng)?bào)文
Flags:Fin FIN 表示終止是否有效,F(xiàn)IN=1時(shí),表明此報(bào)文段的客戶端的數(shù)據(jù)已經(jīng)全部傳輸完畢
Window size value 16位窗口大小 服務(wù)端希望一次接收的字節(jié)數(shù)
Checksum 16位校驗(yàn)和 由客戶端計(jì)算和存儲(chǔ),并由服務(wù)端驗(yàn)證,對(duì)整個(gè)TCP報(bào)文段進(jìn)行奇偶校驗(yàn)
Urgent pointer 16位緊急指針 指出本報(bào)文段中緊急數(shù)據(jù)共有多少字節(jié)

使用python3編寫(xiě)TCP客戶端和服務(wù)端

客戶端

import socket
ip_port=('123.56.133.245',10086)
client = socket.socket()
client.connect(ip_port)

while True:
    info = str(input("Please input you infomation:")).strip()
    if not info:
        continue
    client.sendall(info.encode())

    if info =="exit":
        print("EXIT...")
        break
    server_reply= client.recv(1024).decode()
    print(server_reply)
client.close()

服務(wù)端

import socket
import threading

def link_handler(link,client):
    print("Server start receiving requests from the Client[%s:%s]."%(client[0],client[1]))
    while True:
        client_data = link.recv(1024).decode()
        if client_data == "exit":
            print("End connections to [%s:%s]"%(client[0],client[1]))
            break
        print("From Client [%s:%s] send a message: %s"%(client[0],client[1],client_data))
        link.sendall("Server has already received the Client message".encode())
    link.close()

ip_port = ('0.0.0.0', 10086)
server = socket.socket()
server.bind(ip_port)
server.listen(5)
print("Open TCP Server and wait for Client to connect!")

while True:
    conn, address = server.accept()
    thread001 = threading.Thread(target=link_handler, args=(conn,address))
    thread001.start()

Wireshark抓包分析TCP三次握手和四次揮手

三次握手

TCP三次握手總過(guò)程.jpg
第一次

首先客戶端和服務(wù)端都處于CLOSED狀態(tài),在服務(wù)端執(zhí)行python腳本之后服務(wù)端主動(dòng)監(jiān)聽(tīng)本機(jī)的10086端口,進(jìn)入LISTEN狀態(tài),在本地執(zhí)行客戶端腳本之后,客戶端主動(dòng)發(fā)起建立連接請(qǐng)求SYN,然后客戶端進(jìn)入SYN-SENT狀態(tài)。


三次握手之第1次.jpg

根據(jù)Wireshark抓包情況來(lái)看,此時(shí)客戶端30.26.223.21向服務(wù)端123.56.133.245的10086端口發(fā)送建立連接的SYN請(qǐng)求,標(biāo)志位Flags中SYN=1,序列號(hào)Sequence number=0。

第二次

服務(wù)端收到客戶端想要建立連接的請(qǐng)求后,返回SYN,并且ACK客戶的SYN請(qǐng)求,之后服務(wù)端進(jìn)入SYN-RCVD狀態(tài)。


三次握手之第2次.jpg

根據(jù)Wireshark抓包情況來(lái)看,服務(wù)端此時(shí)向客戶端返回SYN和ACK都是1的報(bào)文,回應(yīng)報(bào)文中Sequence number=0,Acknowledgment=1,作為服務(wù)端隨機(jī)產(chǎn)生初始序號(hào)為0,確認(rèn)序號(hào)等于客戶端的請(qǐng)求序號(hào)+1。

第三次

客戶端在收到服務(wù)端發(fā)來(lái)的SYN和ACK,檢查確認(rèn)后發(fā)送ACK的ACK,之后進(jìn)入ESTABLISHED狀態(tài)。服務(wù)端收到ACK的ACK后檢查確認(rèn)沒(méi)毛病也進(jìn)入ESTABLISHED狀態(tài)。


三次握手之第3次.jpg

根據(jù)Wireshark抓包情況來(lái)看,客戶端此時(shí)回應(yīng)了ACK為1的報(bào)文,其中Sequence number=1,Acknowledgment=1,作為客戶端,序號(hào)等于服務(wù)端發(fā)來(lái)的確認(rèn)序號(hào),確認(rèn)序號(hào)等于服務(wù)端的請(qǐng)求序號(hào)+1。

四次揮手

TCP四次揮手總過(guò)程.jpg
第一次
四次揮手之第1次.jpg

作為客戶端,通過(guò)腳本主動(dòng)發(fā)送EXIT之后,再次給服務(wù)器發(fā)送TCP包用來(lái)關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳輸。根據(jù)Wireshark抓包情況來(lái)看,此時(shí)客戶端的請(qǐng)求中,將標(biāo)志位FIN和ACK都設(shè)置成了1,序號(hào)等于11,確認(rèn)序號(hào)等于35.

第二次
四次揮手之第2次.jpg

根據(jù)Wireshark抓包情況來(lái)看,作為服務(wù)端,收到客戶端的請(qǐng)求之后,也發(fā)TCP包準(zhǔn)備關(guān)閉與客戶端之間的連接,此包中將標(biāo)志位FIN和ACK都設(shè)置成了1,序號(hào)等于11,確認(rèn)序號(hào)等于35.

第三次
四次揮手之第3次.jpg

根據(jù)Wireshark抓包情況來(lái)看,作為客戶端,收到服務(wù)端的請(qǐng)求之后,發(fā)送ACK包回應(yīng),將標(biāo)志位ACK設(shè)置成了1,序號(hào)等于收到的確認(rèn)序號(hào)+1,確認(rèn)序號(hào)等于收到的序號(hào)+1.

第四次
四次揮手之第4次.jpg

根據(jù)Wireshark抓包情況來(lái)看,作為服務(wù)端,收到客戶端的請(qǐng)求之后,發(fā)送ACK包回應(yīng),將標(biāo)志位ACK設(shè)置成了1,序號(hào)等于接收到確認(rèn)序號(hào)+1,確認(rèn)序號(hào)等于接收到的序號(hào)+1.

總結(jié)

三次握手狀態(tài)時(shí)序圖
TCP三次握手.png
四次揮手狀態(tài)時(shí)序圖
TCP四次揮手_20191031.jpg
狀態(tài)機(jī)
TCP狀態(tài)機(jī).jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容