day35 網絡協議與數據封裝
數據封裝與協議結構
以太網MAC幀格式
數據封裝與傳輸流程
數據在傳輸過程中,從上層逐層封裝到底層,最終通過物理介質發送。封裝與傳輸的具體流程如下:
封裝過程(從IP層到物理層)
- IP層:IP數據報作為上層數據傳遞至MAC層
- MAC層封裝:
- 目的地址(6字節):接收設備的物理地址(MAC地址)
- 源地址(6字節):發送設備的物理地址(MAC地址)
- 類型(2字節):標識上層協議類型,例如
0x0800
表示承載的是IP協議數據 - 數據(46–1500字節):實際承載的上層協議數據(如IP數據報),若不足46字節,則需填充至最小長度
- FCS(4字節):幀檢驗序列(Frame Check Sequence),用于差錯檢測
- 物理層封裝:
- 前導碼(8字節):
- 前7字節為前同步碼,比特模式為
10101010
交替,用于接收方時鐘同步 - 第8字節為幀開始定界符(SFD),比特模式為
10101011
,表示幀的開始
- 前7字節為前同步碼,比特模式為
- 前導碼(8字節):
MTU說明:以太網幀中"數據"部分的最大傳輸單元(MTU)為 1500字節。
解封裝過程(從物理層到IP層)
接收端按照相反順序進行解封裝,從物理層開始逐層去除頭部信息,最終將數據交付給上層應用。
協議封裝層次
數據在發送端自上而下逐層封裝,接收端則自下而上解封裝:
應用層數據 → TCP/UDP頭 → IP頭 → MAC幀 → 物理層前導碼| | | |
"Hello" 傳輸層 網絡層 接口層
IP數據報首部
核心特性
- 固定長度:20字節(不含選項字段)
- 關鍵字段詳解:
字段 | 描述 |
---|---|
版本(4位) | 指明IP協議版本,IPv4為4,IPv6為6,通信雙方必須一致 |
首部長度(IHL,4位) | 以32位(4字節)為單位,最小值為5(即20字節),最大值為15(60字節)。當包含選項時長度可變 |
區分服務(DS,8位) | 原稱"服務類型",現用于QoS(服務質量)控制,如優先級、延遲、吞吐量等 |
總長度(16位) | 整個IP數據報的長度(首部 + 數據),單位為字節,最大值為65535字節 |
標識(16位) | 每產生一個數據報,該計數器加1;分片時所有片段共享同一標識,以便重組 |
標志(3位) | 包含兩個有效位: - DF (Don’t Fragment):禁止分片- MF (More Fragments):還有更多分片(MF=0表示最后一片) |
片偏移(13位) | 分片后該片在原始數據報中的位置,單位為8字節(64位),保證分片按序重組 |
生存時間(TTL,8位) | 數據報在網絡中的存活時間,每經過一個路由器減1,為0時被丟棄,防止無限循環 |
協議(8位) | 指明上層協議類型,常見值: - 6 :TCP- 17 :UDP- 1 :ICMP |
首部校驗和(16位) | 僅校驗IP首部,不包含數據部分。每次經過路由器需重新計算 |
源IP地址(32位) | 發送方的IP地址 |
目的IP地址(32位) | 接收方的IP地址 |
注意:IP是無連接、不可靠的服務,依賴上層(如TCP)實現可靠性。
TCP首部格式
核心特性
- 固定長度:20字節(可選字段擴展至最多60字節)
- 關鍵字段:
字段 | 描述 |
---|---|
源/目的端口(各16位) | 標識通信的應用進程 |
序列號(32位) | 當前報文段第一個字節的序號,用于保證數據有序傳輸 |
確認號(32位) | 期望收到的下一個字節的序號,表示該序號之前的數據已正確接收 |
數據偏移(4位) | TCP首部長度,以4字節為單位,最小為5(20字節),最大為15(60字節) |
保留(6位) | 保留字段,置0 |
標志位(6位) | 控制連接狀態的關鍵標志: - URG :緊急指針有效- ACK :確認號有效- PSH :要求接收方立即交付給應用層- RST :重置連接- SYN :同步序列號,用于建立連接- FIN :請求關閉連接 |
窗口大小(16位) | 接收方當前接收緩沖區剩余容量,用于流量控制 |
校驗和(16位) | 覆蓋TCP首部、數據及偽首部,確保傳輸完整性 |
緊急指針(16位) | 與URG配合使用,指出緊急數據的末尾位置 |
發送緩沖區劃分
[已發送且已確認] → [已發送未確認] → [待發送]
- 通過超時重傳機制確保可靠傳輸
- 只有收到ACK后,已發送未確認區域才能向前滑動
關鍵標志位
標志位 | 作用 |
---|---|
SYN | 連接建立請求(同步序列號) |
ACK | 確認應答(確認號有效) |
FIN | 連接終止請求 |
RST | 異常中斷或拒絕連接 |
PSH | 推送數據,要求立即處理 |
UDP首部格式
核心特性
- 固定長度:8字節
- 字段說明:
字段 | 描述 |
---|---|
源端口(16位) | 發送方端口號,可選 |
目的端口(16位) | 接收方端口號,必須指定 |
長度(16位) | UDP數據報總長度(首部 + 數據),最小為8字節,最大為65535字節 |
校驗和(16位) | 可選,用于差錯檢測;若未啟用則為0。包含偽首部、UDP首部和數據 |
特點總結:
- 無連接(無需握手)
- 不保證可靠傳輸(無確認、無重傳)
- 開銷小(僅8字節首部)
- 適用于實時性要求高的場景(如音視頻流、DNS查詢)
網絡診斷工具集
遠程連接工具
# 使用telnet連接指定IP和端口(默認端口23)
telnet 192.168.1.1 8888 # 連接到192.168.1.1的8888端口
功能說明:測試目標主機某端口是否開放并可通信。
理想輸出:
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
網絡狀態監控
# 查看所有網絡連接(包括進程信息)
netstat -anp
功能說明:顯示所有網絡連接、監聽端口及對應進程
典型輸出:
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1234/python3
表示PID為1234的Python程序正在監聽8888端口。
# 僅查看TCP連接
netstat -n -t
功能說明:顯示所有TCP連接狀態
典型輸出:
tcp 0 0 192.168.1.100:50000 192.168.0.183:80 ESTABLISHED
# 僅查看UDP連接
netstat -n -u
功能說明:顯示所有UDP連接狀態
典型輸出:
udp 0 0 0.0.0.0:68 0.0.0.0:*
# 查看特定端口監聽情況
netstat -lnp | grep 8888
功能說明:檢查特定端口是否被監聽及對應進程
典型輸出:
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1234/python3
網絡連通性測試
# 測試與指定IP的連通性
ping 192.168.1.1
功能說明:使用ICMP協議檢測目標主機是否可達
理想輸出:
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.2 ms
# 測試域名解析及連通性
ping www.baidu.com
功能說明:測試DNS解析和網絡連通性
理想輸出:
64 bytes from 110.242.68.66: icmp_seq=1 ttl=55 time=28.3 ms
ARP表管理
# 查看ARP緩存表(IP與MAC地址映射)
arp -an
功能說明:顯示本地ARP緩存中的IP地址與MAC地址映射關系
典型輸出:
? (192.168.1.100) at 00:1a:2b:3c:4d:5e [ether] on eth0
# 刪除指定IP的ARP緩存條目
arp -d 192.168.1.100
功能說明:清除特定IP地址的ARP緩存,解決IP-MAC映射問題
理想輸出:
(192.168.1.100) deleted
流量抓包分析
Wireshark過濾示例
tcp.port == 50000 && ip.addr == 192.168.0.183
抓取目標或源端口為50000,且IP地址為192.168.0.183的數據包。
tcpdump高級過濾命令
# 按源IP過濾
tcpdump 'ip.src == 192.168.1.100'
功能說明:捕獲來自特定IP的所有數據包
理想輸出:
12:30:45.123456 IP 192.168.1.100.50000 > 192.168.0.183.80: Flags [S], seq 12345
# 按目的端口過濾
tcpdump 'tcp.dstport == 9999'
功能說明:捕獲發送到特定端口的所有數據包
理想輸出:
12:31:22.678901 IP 192.168.1.100.50001 > 192.168.0.183.9999: Flags [P.], seq 12345:12400
# 組合條件:源IP為192.168.1.100 且 目的端口為9999
tcpdump 'ip.src == 192.168.1.100 and tcp.dstport == 9999'
功能說明:使用邏輯AND組合多個過濾條件
理想輸出:
12:32:15.234567 IP 192.168.1.100.50002 > 192.168.0.183.9999: Flags [S], seq 12346
# 組合條件:源IP為192.168.1.100 或 目的IP為192.168.1.102
tcpdump 'ip.src == 192.168.1.100 or ip.dst == 192.168.1.102'
功能說明:使用邏輯OR組合多個過濾條件
理想輸出:
12:33:08.765432 IP 192.168.1.100.50003 > 192.168.1.102.80: Flags [P.], seq 12347:12450
環境配置建議:
# 禁用防火墻(避免干擾抓包) sudo ufw disable# 安裝SSH服務(支持遠程登錄) sudo apt-get install openssh-server openssh-client# 安裝Wireshark(圖形化抓包工具) sudo apt-get install wireshark
tcpdump 使用補充說明
# 在默認網卡上抓包(顯示簡要信息)
tcpdump -n
功能說明:捕獲所有網絡接口的流量,以數字形式顯示IP和端口
理想輸出:
12:35:45.123456 IP 192.168.1.100.50000 > 192.168.0.183.80: Flags [S], seq 12345
# 根據源或目的IP抓包
tcpdump -n src 192.168.1.100
tcpdump -n dst 192.168.1.100
功能說明:分別捕獲指定IP作為源或目的的數據包
理想輸出:
12:36:22.678901 IP 192.168.1.100.50001 > 192.168.0.183.80: Flags [P.], seq 12345:12400
# 抓取指定IP的所有收發包并輸出十六進制
sudo tcpdump -n -x src or dst 192.168.0.130
功能說明:捕獲指定IP的所有流量并以十六進制格式顯示
理想輸出:
12:37:15.234567 IP 192.168.0.130.50002 > 192.168.1.100.80: Flags [S], seq 123460x0000: 4500 003c 1234 4000 4006 0000 c0a8 00820x0010: c0a8 0164 0050 0089 0000 3039 0000 0000
# 將抓包內容保存到文件
tcpdump -n -x src 192.168.1.100 > xxx.log
功能說明:將抓包結果保存到文件以便后續分析
操作結果:生成包含原始數據包的xxx.log文件
# 按端口過濾
tcpdump -n src port 80
tcpdump -n dst port 80
tcpdump -n port 80
功能說明:分別捕獲源端口、目的端口或任意方向端口為80的流量
理想輸出:
12:38:08.765432 IP 192.168.1.100.50003 > 192.168.0.183.80: Flags [P.], seq 12347:12450
# 按協議過濾
tcpdump -n proto icmp
tcpdump -n proto tcp
tcpdump -n proto udp
功能說明:分別捕獲指定協議類型的數據包
理想輸出:
12:39:01.234567 IP 192.168.1.100 > 192.168.1.1: ICMP echo request
# 指定網絡接口抓包
tcpdump -n -i eth0
tcpdump -n -i lo # 本地回環接口
功能說明:在特定網絡接口上捕獲流量
理想輸出:
12:40:15.678901 IP 127.0.0.1.50004 > 127.0.0.1.8080: Flags [S], seq 12348
# 組合條件(and/or)
tcpdump 'ip.src == 192.168.1.100 and tcp.dstport == 9999'
tcpdump 'ip.src == 192.168.1.100 or ip.dst == 192.168.1.102'
功能說明:使用邏輯運算符組合多個過濾條件
理想輸出:
12:41:22.345678 IP 192.168.1.100.50005 > 192.168.1.102.9999: Flags [P.], seq 12349:12452
高級抓包示例:
sudo tcpdump -n -i esn33 -xx src or dst www.taobao.com -AXX -vv | less
-xx
:以十六進制和ASCII顯示鏈路層數據-A
:以ASCII顯示數據包內容-XX
:十六進制顯示并包含鏈路層頭-vv
:詳細輸出| less
:分頁查看輸出功能說明:全面捕獲并詳細顯示與淘寶相關的網絡流量,適合深度分析
TCP連接管理
三次握手建立連接
過程解析
-
第一次握手(SYN)
客戶端 → 服務器:SYN=1, Seq=x
客戶端發起連接請求,進入SYN_SENT
狀態。 -
第二次握手(SYN+ACK)
服務器 → 客戶端:SYN=1, ACK=1, Seq=y, Ack=x+1
服務器確認請求并同步自己的序列號,進入SYN_RCVD
狀態。 -
第三次握手(ACK)
客戶端 → 服務器:ACK=1, Ack=y+1
客戶端確認服務器的SYN,連接建立完成,雙方進入ESTABLISHED
狀態。
關鍵點:三次握手確保雙方的發送與接收能力正常,實現全雙工通信。
編程對應函數:
- 客戶端調用
connect()
觸發握手。- 服務器調用
listen()
監聽連接,accept()
接受連接。
四次揮手終止連接
過程解析
-
第一次揮手(FIN+ACK)
主機A → 主機B:FIN=1, ACK=1, Seq=u, Ack=v
A端主動關閉連接,停止發送數據,但仍可接收數據。 -
第二次揮手(ACK)
主機B → 主機A:ACK=1, Ack=u+1
B端確認A的關閉請求,A進入FIN-WAIT-2
狀態。 -
第三次揮手(FIN+ACK)
主機B → 主機A:FIN=1, ACK=1, Seq=w, Ack=u+1
B端也關閉連接,發送FIN。 -
第四次揮手(ACK)
主機A → 主機B:ACK=1, Ack=w+1
A確認B的FIN,等待2MSL后關閉連接。
關鍵點:TCP連接是全雙工的,因此需要雙方獨立關閉,共需四次揮手。
萬維網WWW
萬維網(World Wide Web,簡稱 WWW 或 Web)并非一種獨立的計算機網絡,而是一個基于因特網的大規模、聯機式信息儲藏所。它通過"超鏈接"機制,使用戶可以從一個站點方便地跳轉到另一個站點,實現主動、按需獲取信息。
圖中展示了多個萬維網站點(A、B、C、D、E),它們之間通過虛線"鏈接到"相互連接,表明信息是分布式存儲的,而非集中在一個服務器上,體現了萬維網的分布式服務特性。
為解決"如何讓用戶方便找到所需信息"的問題,萬維網采用三大核心技術:
- URL(統一資源定位符):為因特網上的每個資源(如網頁、圖片、文件)提供唯一的地址標識,實現精確定位。
- HTTP(超文本傳輸協議):應用層協議,定義瀏覽器與服務器之間的交互規則,基于TCP實現可靠數據傳輸。
- HTML(超文本標記語言):用于編寫網頁內容,支持嵌入超鏈接、文本、圖像、音視頻等多媒體元素,并可在瀏覽器中渲染展示。
此外,用戶還可借助搜索引擎等工具快速查找所需信息。
URL結構與示例
使用HTTP的URL一般形式:
http://<主機>:<端口>/<路徑>
- 主機:服務器域名或IP地址(如
www.tsinghua.edu.cn
) - 端口:HTTP默認端口為
80
,通常省略不寫 - 路徑:服務器上資源的具體路徑,若省略則指向該站點的主頁
主頁的含義
- 可以是WWW服務器最高級別的頁面
- 某組織或部門定制的門戶頁面
- 個人創建的自我介紹頁面
示例
訪問清華大學主頁:
http://www.tsinghua.edu.cn
HTTP協議與萬維網工作過程
-
HTTP角色:
HTTP是應用層協議,規定了瀏覽器(客戶端)向服務器請求文檔、服務器響應文檔的格式與流程,是萬維網交換文本、圖像、音視頻等多媒體文件的基礎。 -
工作流程:
- 瀏覽器與服務器(如
www.tsinghua.edu.cn
)建立TCP連接 - 瀏覽器發送HTTP請求報文,請求特定文檔
- 服務器返回HTTP響應報文,攜帶請求的文檔內容
- 傳輸完成后釋放TCP連接(HTTP/1.0行為)
- 瀏覽器與服務器(如
HTTP請求與響應流程
當用戶點擊指向"清華大學院系設置"頁面的鏈接(URL:http://www.tsinghua.edu.cn/chn/yxsz/index.htm
)時,發生以下步驟:
- 解析URL:瀏覽器提取主機名
www.tsinghua.edu.cn
和路徑/chn/yxsz/index.htm
- DNS解析:向DNS服務器查詢該域名對應的IP地址
- 獲取IP地址:DNS返回IP地址
166.111.4.100
- 建立TCP連接:瀏覽器與服務器在IP
166.111.4.100
、端口80
上建立TCP連接 - 發送HTTP請求:瀏覽器發送GET請求,獲取
/chn/yxsz/index.htm
文件 - 接收響應:服務器返回HTML文件內容
- 釋放連接:TCP連接關閉
- 顯示內容:瀏覽器解析并顯示文本內容
優化行為:
瀏覽器可設置"僅下載文本",加快頁面加載速度。圖像、音頻等內容僅顯示占位圖標,點擊后再單獨建立連接下載。
HTTP報文結構
HTTP是面向文本的協議,報文由ASCII字符組成,字段長度不固定。
兩類報文
報文類型 | 組成部分 |
---|---|
請求報文 | 1. 請求行(方法、URL、版本) 2. 首部行(多個字段名:值) 3. 實體主體(可選,如POST數據) |
響應報文 | 1. 狀態行(版本、狀態碼、短語) 2. 首部行(多個字段名:值) 3. 實體主體(可選,如HTML內容) |
主要區別:起始行不同(請求報文為"請求行",響應報文為"狀態行")。
HTTP請求報文示例解析
GET /?pcm=202.412_0_0.0.0&scm=thor.412_14-201000.0.0.0&spm=smpc.home.top-nav.1.1756968683979AWFZBXy_1467 HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Host: news.sohu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36
這是一條 HTTP/1.1 請求報文,用于向搜狐新聞服務器請求資源。
解析如下:
-
請求行:
GET /?pcm=... HTTP/1.1
- 方法:
GET
(獲取資源) - 路徑與參數:包含多個跟蹤參數(用于統計來源)
- 協議版本:
HTTP/1.1
- 方法:
-
請求首部字段:
Accept
:客戶端可接受的內容類型,包括HTML、XML、圖片等,q
值表示優先級Accept-Encoding
:支持的壓縮方式(gzip
,deflate
),減少傳輸體積Accept-Language
:首選語言為簡體中文(zh-CN
)Host
:請求的主機名,用于虛擬主機識別Connection: keep-alive
:希望保持TCP連接,復用連接提高效率User-Agent
:客戶端身份標識,此處為Windows 10上的Chrome瀏覽器(v121)
該請求體現了現代瀏覽器在訪問網頁時的標準行為:支持壓縮、多語言、連接復用等特性。
Remote Address:
[240e:45:d000:3008:2a::]:80
這是用網絡抓包工具 Wireshark捕獲的網絡數據包界面,展示了設備與搜狐新聞(news.sohu.com
)等網絡節點之間的通信情況:
- 上半部分:是捕獲的數據包列表,包含時間(Time)、源地址(Source)、目的地址(Destination)、協議(Protocol)、長度(Length)、信息(Info)等列,能看到有 TCP、HTTP 等協議的數據包,記錄了不同時間、不同地址間的網絡交互,比如 TCP 連接的建立(含 SYN 等標志)、HTTP 請求與響應等過程
- 中間部分:是選中的某條數據包(這里是 HTTP 相關)的詳細解析,展開了"Hypertext Transfer Protocol"(超文本傳輸協議)部分,能看到 HTTP 請求的具體內容,像請求行(包含請求方法、URL 等)、請求首部字段(如
Host
指定主機為news.sohu.com
,Connection
表示連接方式,User-Agent
標識客戶端為 Chrome 瀏覽器等) - 下半部分:是該數據包的十六進制與 ASCII 碼形式的原始數據,可用于更底層的數據包內容分析,查看數據在網絡傳輸中的原始字節形態
整體呈現了從網絡數據包捕獲到分層解析的過程,便于分析網絡通信的細節,比如 HTTP 請求的構造、TCP 連接的交互等。
ipv6.addr == 240e:45:d000:3008:2a:: && tcp.port == 80
網絡爬蟲應用示例
天氣API接口
接口網址
http://api.k780.com
https://sapi.k780.com AppKey
77384Sign
5ac63f91d88ad9c5e08f6e513552b3f1
天氣查詢請求示例
https://sapi.k780.com/?app=weather.today&cityNm=臺北&appkey=77384&sign=5ac63f91d88ad9c5e08f6e513552b3f1&format=json
API響應示例
{"success":"1","result":{"weaid":"360","days":"2025-09-04","week":"星期四","cityno":"taibeixian","citynm":"臺北","cityid":"101340101","temperature":"31℃/25℃","temperature_curr":"31℃","humidity":"72%","aqi":"15","weather":"多云轉晴","weather_curr":"陰","weather_icon":"http://api.k780.com/upload/weather/d/2.gif","weather_icon1":"","wind":"無持續風向","winp":"1級","temp_high":"31","temp_low":"25","temp_curr":"31","humi_high":"0","humi_low":"0","weatid":"3","weatid1":"","windid":"0","winpid":"1","weather_iconid":"2"}}
接口說明:
該示例展示了如何通過HTTP GET請求調用天氣API,獲取指定城市的天氣信息。請求中包含必要的認證參數(AppKey和Sign),API返回JSON格式的天氣數據,包括溫度、濕度、天氣狀況等信息。
數據封裝與拆包回顧
數據在傳輸過程中經歷完整的封裝與解封裝過程:
服務器端 客戶端
應用層 應用層
傳輸層 傳輸層
網絡層 [數據拆包] 網絡層 [數據封包]
接口層 接口層
- 數據封裝結構:
|MAC頭部|IP頭部|TCP/UDP頭部|應用數據|
- 一幀數據:幀(frame)的最大傳輸單元(MTU)為1500字節
協議頭部關鍵字段
IP頭部:
ipflag
:D位(能否分片)、M位(是否最后一片)TTL
:生命周期計數器
TCP頭部(20字節):
U
:緊急數據標志S
:SYN標志(同步序列號)F
:FIN標志(結束連接)R
:RESET標志(重置連接)P
:PUSH標志(立即推送)A
:ACK標志(確認應答)
UDP頭部(8字節):
- 僅包含源端口、目的端口、長度和校驗和
網絡協議分析工具
Wireshark網絡抓包工具
Wireshark是一款強大的網絡協議分析工具,用于網絡調試和協議分析:
-
啟動方式:
sudo wireshark
-
基本操作流程:
- 選擇網絡設備進行監聽
- 設置過濾條件(如端口、IP地址等)
- 分析捕獲的數據包
-
常用過濾條件示例:
port 80 # 過濾HTTP流量 ip.addr == 192.168.1.1 # 過濾指定IP的流量 tcp.port == 50000 # 過濾指定端口的TCP流量
該工具能夠直觀展示網絡數據包的層次結構,從物理層到應用層的完整協議棧,是理解和分析網絡通信的重要工具。
HTTP協議詳解
HTTP協議概述
HTTP(HyperText Transfer Protocol,超文本傳輸協議)是Web應用的基礎協議,具有以下特點:
- B/S架構:瀏覽器/服務器模式
- 資源定位:通過URL唯一標識互聯網上的資源(網頁、電影、圖片等)
- 標記語言:HTML(HyperText Markup Language)用于編寫網頁內容
HTTP交互步驟
- 建立連接:通過TCP三次握手建立連接
- 發送請求:瀏覽器發送HTTP請求報文
- 處理響應:等待服務器返回響應報文及數據
- 斷開連接:通過TCP四次揮手斷開連接(HTTP/1.0默認行為)
HTTP/1.1引入了持久連接(Keep-Alive)機制,可以在一個TCP連接上發送多個請求,提高了效率。