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三次握手和四次揮手
三次握手

第一次
首先客戶端和服務(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)。

根據(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)。

根據(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)。

根據(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。
四次揮手

第一次

作為客戶端,通過(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.
第二次

根據(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.
第三次

根據(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.
第四次

根據(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í)序圖

四次揮手狀態(tài)時(shí)序圖

狀態(tài)機(jī)
