Wireshark — bắt và đọc gói tin từng tầng
Bắt traffic thật, lọc đúng gói, đọc từ Ethernet tới TLS, follow TCP stream, và nhận diện retransmission/RST. Sau bài này bạn sẽ thấy tận mắt điều tcpdump chỉ in ra chữ.
TL;DR: Wireshark là GUI bắt gói tin: chọn interface, bắt traffic, lọc bằng display filter (tcp.port == 443, tls.handshake, ip.addr ==), rồi click vào một gói để đọc từng tầng — Ethernet → IP → TCP → TLS. Follow → TCP Stream ghép cả kết nối thành một luồng. Với HTTPS bạn chỉ thấy dữ liệu mã hoá; để đọc được cần key log (SSLKEYLOGFILE). Pitfall hay gặp: bắt nhầm interface loopback thay vì interface vật lý, và nghĩ rằng đọc được nội dung HTTPS trực tiếp.
Bạn đã bắt gói bằng tcpdump ở bài 03 — Công cụ debug mạng. tcpdump in ra text, lý tưởng để chạy trên server remote. Wireshark làm điều tương tự nhưng với GUI — click vào một gói và thấy ngay cấu trúc từng tầng được bóc ra từng lớp. Hai công cụ bổ trợ nhau: tcpdump capture trên server, lưu file .pcap, rồi mở trong Wireshark để phân tích.
Bài này đặt Wireshark vào đúng vị trí của nó trong bộ công cụ, dạy bạn đọc một gói theo chiều dọc (từ Ethernet lên tới ứng dụng), và nhận diện các pattern quan trọng: 3-way handshake, retransmission, RST.
1. Analogy — Máy quét hành lý sân bay, nhìn từng lớp
Hãy hình dung bộ hành lý của một gói tin như va-li xếp hộp lồng nhau: vali ngoài cùng (Ethernet frame) bọc một túi IP packet bên trong, bên trong túi đó có một phong bì TCP segment, và bên trong phong bì là tờ thư HTTP/TLS.
Máy quét sân bay nhìn xuyên qua tất cả lớp cùng lúc. Wireshark làm đúng điều đó: nó bắt gói ở tầng thấp nhất (raw frame) rồi bóc từng lớp và hiển thị cấu trúc dạng cây.
| Va-li hành lý | Mạng |
|---|---|
| Vali ngoài cùng có tag sân bay | Ethernet frame — địa chỉ MAC nguồn/đích |
| Túi IP bên trong có số hiệu hành lý | IP packet — địa chỉ IP nguồn/đích |
| Phong bì TCP có số thứ tự | TCP segment — port, seq/ack, flags |
| Tờ thư nội dung | HTTP data hoặc TLS record (đã mã hoá) |
| Máy quét nhìn xuyên | Wireshark phân tích dissector từng protocol |
Wireshark không thay đổi gói — nó là "kính lúp" đặt trên đường dây. Mỗi gói được bóc từ ngoài vào trong theo cùng thứ tự encapsulation bạn đã học ở khoá Foundations bài 02.
2. Cài đặt và chọn interface
Wireshark cài trên macOS/Windows/Linux tại wireshark.org. Sau khi mở, màn hình chào hỏi liệt kê các network interface trên máy kèm đồ thị traffic real-time cho mỗi interface.
Interface nào cần chọn?
eth0/en0/Wi-Fi: interface vật lý — dùng cho traffic đi ra Internet hoặc LAN.lo/lo0(loopback): chỉ traffic giữa các process trên cùng máy (localhost ↔ localhost). Nếu bạn chạy app trên cổng 8080 và gọi từ browser trên cùng máy đó, loopback là nơi bắt.docker0/br-xxxx: bridge interface Docker — dùng khi muốn bắt traffic giữa container với container hoặc container với host.
Trên Linux, Wireshark cần quyền đặc biệt để bắt gói. Cách chuẩn: thêm user vào group wireshark:
sudo usermod -aG wireshark $USER
# Log out + log in lai de group co hieu luc
Hoặc chạy dumpcap (backend của Wireshark) riêng với sudo rồi mở file .pcap.
3. Bắt traffic — capture filter vs display filter
Wireshark có hai loại filter phục vụ hai mục đích khác nhau:
Capture filter (chọn trước khi bắt): giới hạn gói nào được ghi lại, viết bằng cú pháp BPF giống tcpdump. Dùng khi lưu file — tránh capture filter quá rộng trên server nhiều traffic làm file phình to.
tcp port 443
host 93.184.216.34
Display filter (lọc sau khi capture): filter trên gói đã bắt được để phân tích, viết bằng cú pháp Wireshark riêng. Đây là thứ bạn dùng hầu hết thời gian.
Các display filter hay dùng nhất:
| Filter | Ý nghĩa |
|---|---|
tcp.port == 443 | Gói có port nguồn hoặc đích là 443 |
http | Gói HTTP (chỉ với HTTP thuần, không phải HTTPS) |
tls | Gói TLS bất kỳ |
tls.handshake | Chỉ gói TLS handshake (ClientHello, ServerHello…) |
ip.addr == 93.184.216.34 | Gói từ hoặc đến IP này |
tcp.flags.syn == 1 | Gói có cờ SYN bật (tìm kết nối mới) |
tcp.flags.syn == 1 and tcp.flags.ack == 0 | Chỉ SYN đầu (không phải SYN-ACK) |
tcp.analysis.retransmission | Gói bị truyền lại (Wireshark tự tính) |
tcp.flags.reset == 1 | Gói RST |
Display filter dùng toán tử so sánh == (hai dấu bằng), không phải =. Nhầm cú pháp là lý do phổ biến nhất khiến filter không hoạt động. Wireshark tô nền xanh lá khi filter hợp lệ, tô đỏ khi sai cú pháp.
4. Cơ chế bên dưới — đọc một gói từng tầng
Khi click vào một gói trong danh sách, cửa sổ Wireshark chia làm ba panel:
- Packet list (trên cùng): danh sách gói theo thứ tự thời gian — số, thời gian, IP nguồn/đích, protocol, thông tin tóm tắt.
- Packet details (giữa): cây phân cấp bóc từng tầng — click mũi tên để mở rộng.
- Packet bytes (dưới cùng): hex dump raw bytes — highlight khi bạn click vào field ở panel giữa.
Cây phân cấp của một gói HTTPS điển hình trông như sau:
▼ Frame 42: 1514 bytes on wire
▼ Ethernet II, Src: aa:bb:cc:dd:ee:ff, Dst: 11:22:33:44:55:66
Type: IPv4 (0x0800)
▼ Internet Protocol Version 4, Src: 10.0.0.5, Dst: 93.184.216.34
Protocol: TCP (6)
▼ Transmission Control Protocol, Src Port: 52341, Dst Port: 443
Sequence number: 1 (relative)
Acknowledgment number: 1
Flags: 0x018 (PSH, ACK)
▼ Transport Layer Security
TLSv1.3 Record Layer: Application Data Protocol: http-over-tls
Encrypted Application Data: 8f2a...
Mỗi tầng bóc ra header riêng theo đúng mô hình TCP/IP 4 tầng. Ethernet header có MAC address, IP header có địa chỉ IP, TCP header có port và sequence/ack number, TLS header cho biết record type nhưng payload đã mã hoá.
flowchart TB
subgraph Frame["Ethernet Frame (tầng Link)"]
subgraph Packet["IP Packet (tầng Internet)"]
subgraph Segment["TCP Segment (tầng Transport)"]
subgraph Data["TLS Record / HTTP (tầng Application)"]
APP["Payload (ma hoa hoac plain)"]
end
TH["TCP Header: port, seq, ack, flags"]
end
IH["IP Header: src/dst IP, TTL, protocol"]
end
EH["Ethernet Header: src/dst MAC, EtherType"]
endĐây là mô hình encapsulation bạn đã học ở Foundations bài 02 — Wireshark biến lý thuyết đó thành dữ liệu nhìn thấy được.
5. Nhận diện 3-way handshake
Áp dụng display filter tcp.flags.syn == 1 — bạn chỉ thấy gói SYN và SYN-ACK. Ba gói đầu của mọi kết nối TCP luôn là:
No. Time Source Destination Info
1 0.000 10.0.0.5 93.184.216.34 [SYN] Seq=0 Win=65535
2 0.012 93.184.216.34 10.0.0.5 [SYN, ACK] Seq=0 Ack=1 Win=65535
3 0.012 10.0.0.5 93.184.216.34 [ACK] Seq=1 Ack=1 Win=65535
Cột "Info" ghi rõ [SYN], [SYN, ACK], [ACK]. Để ý:
- RTT giữa gói 1 và gói 2 là khoảng 12ms — đây là độ trễ mạng thật giữa máy bạn và server.
- Wireshark hiển thị sequence number relative (bắt đầu từ 0) thay vì ISN thật — dễ đọc hơn. Để thấy ISN thật, bỏ tick "Relative sequence numbers" trong Preferences.
Sau khi TCP handshake hoàn tất, với HTTPS bạn sẽ thấy các gói TLSv1.3 — ClientHello, ServerHello, và tiếp theo. Đây là TLS handshake xảy ra bên trong kết nối TCP đã mở, đúng như bài 01 mô tả.
6. Follow TCP Stream
Follow → TCP Stream là tính năng mạnh nhất của Wireshark cho debug: nó ghép toàn bộ payload của một kết nối TCP thành một chuỗi đọc được.
Cách dùng: click chuột phải vào một gói trong kết nối muốn theo dõi → Follow → TCP Stream. Một cửa sổ mới mở ra hiển thị toàn bộ dữ liệu gửi đi (màu đỏ) và nhận về (màu xanh) trong kết nối đó.
Với HTTP thuần (http://), bạn thấy nguyên văn request/response:
GET /index.html HTTP/1.1\r\n
Host: example.com\r\n
\r\n
HTTP/1.1 200 OK\r\n
Content-Type: text/html\r\n
\r\n
<html>...</html>
Với HTTPS, cửa sổ Follow TCP Stream chỉ cho thấy dữ liệu mã hoá — chuỗi byte ngẫu nhiên không đọc được. Để đọc được nội dung HTTPS, bạn cần key log (xem mục 8).
Ngoài TCP Stream, Wireshark còn có Follow → TLS Stream (sau khi cung cấp key log) và Follow → HTTP2 Stream cho các kết nối HTTP/2.
7. Nhận diện retransmission và RST
Wireshark tự phân tích TCP và tô màu các gói bất thường:
-
Màu đen/đỏ — gói bị truyền lại (
TCP RetransmissionhoặcTCP Fast Retransmission). Xuất hiện khi gói gốc mất — sender không nhận ACK sau timeout nên gửi lại. Nhiều retransmission liên tục báo hiệu mất gói nghiêm trọng, thường do đường truyền kém hoặc server quá tải. Bài module 1 bài 02 — TCP reliability giải thích cơ chế này chi tiết. -
Màu vàng nhạt —
TCP Duplicate ACK. Receiver gửi ACK trùng để báo hiệu có gói bị thiếu trong chuỗi. 3 duplicate ACK liên tiếp kích hoạt Fast Retransmit. -
Màu đỏ tươi (tùy theme) — gói
RST(Reset). RST là tín hiệu "hủy kết nối ngay lập tức" — khác với đóng kết nối bình thường qua FIN/FIN-ACK. Thấy RST nghĩa là một trong hai đầu (thường là server) không nhận ra kết nối này và từ chối nó. Nguyên nhân: server khởi động lại trong khi client vẫn giữ kết nối cũ, firewall chặn và phản hồi RST, hoặcECONNRESETmà bạn thấy trong log ứng dụng.
Display filter để tìm nhanh:
tcp.analysis.retransmission -- tat ca goi truyen lai
tcp.analysis.duplicate_ack -- duplicate ACK
tcp.flags.reset == 1 -- tat ca goi RST
sequenceDiagram
participant C as Client
participant S as Server
C->>S: Seq=100 [goi goc]
Note over C,S: Goi bi mat tren duong
S-->>C: ACK=100 Dup ACK (goi khac da toi)
S-->>C: ACK=100 Dup ACK
S-->>C: ACK=100 Dup ACK
Note over C: 3 Dup ACK -> Fast Retransmit
C->>S: Seq=100 [Retransmission]
S-->>C: ACK=200 [nhan du roi]8. Pitfall — hiểu nhầm thường gặp
❌ Nhầm 1: Bắt nhầm interface
✅ Hay gặp nhất khi mới dùng Wireshark: chọn lo (loopback) để bắt traffic với google.com rồi không thấy gì. Loopback chỉ bắt traffic localhost-to-localhost. Traffic ra Internet đi qua eth0 hoặc Wi-Fi. Nếu đang debug một app trong Docker, bạn có thể cần bắt trên docker0 hoặc interface bridge tương ứng.
❌ Nhầm 2: Nghĩ đọc được nội dung HTTPS
✅ Với HTTPS (TLS), dữ liệu ứng dụng đã mã hoá — Wireshark chỉ thấy ciphertext. Để giải mã và đọc nội dung thật (ví dụ HTTP/2 request bên trong TLS), bạn cần cung cấp TLS session key log qua biến môi trường SSLKEYLOGFILE:
# Tren Linux/macOS, truoc khi mo Chrome hoac Firefox:
export SSLKEYLOGFILE=~/tls-keys.log
google-chrome --ssl-key-log-file=~/tls-keys.log
# Sau do trong Wireshark: Edit > Preferences > Protocols > TLS
# > (Pre)-Master-Secret log filename: ~/tls-keys.log
Sau khi cấu hình, Wireshark giải mã on-the-fly và Follow TLS Stream cho thấy nội dung thật.
❌ Nhầm 3: Capture không filter dẫn đến quá nhiều gói
✅ Trên máy đang chạy nhiều service hoặc trên server production, capture không filter có thể thu về hàng triệu gói mỗi phút. File .pcap phình to, Wireshark chậm. Giải pháp: đặt capture filter trước (tcp port 443 and host <target-ip>) hoặc capture trong thời gian ngắn rồi stop ngay.
❌ Nhầm 4: Nhầm tcpdump và Wireshark là khác protocol
✅ tcpdump và Wireshark cùng dùng libpcap để bắt gói — chúng bổ trợ nhau, không thay thế. Workflow phổ biến: sudo tcpdump -w capture.pcap -i eth0 'tcp port 443' trên remote server → scp capture.pcap . → mở trong Wireshark để phân tích thoải mái với GUI.
9. Liên hệ các bài khác
- Foundations bài 02 — Mô hình TCP/IP 4 tầng: encapsulation bạn đọc trong cây Packet Details của Wireshark chính là mô hình 4 tầng đó — từ Ethernet frame ở tầng Link lên tới Application.
- Module 1 bài 01 — TCP 3-way handshake: ba gói SYN/SYN-ACK/ACK bài đó mô tả sẽ hiện rõ trong Wireshark với cờ
[SYN],[SYN, ACK],[ACK]— bài này cho bạn nhìn thấy chúng thật. - Module 1 bài 02 — TCP reliability: retransmission và duplicate ACK Wireshark tô màu đỏ chính là cơ chế reliable delivery bài đó giải thích.
- Bài 03 — Công cụ debug mạng:
tcpdumplà CLI tương đương Wireshark — hai công cụ bổ trợ nhau, workflow thực tế: tcpdump capture trên server, Wireshark phân tích trên máy local. - Bài 01 — TLS/HTTPS handshake: sau TCP handshake bạn thấy trong Wireshark, các gói
TLSv1.3tiếp theo là TLS handshake — ClientHello, ServerHello, Finished — bài 01 giải thích từng bước đó.
10. 📚 Deep Dive — tài liệu gốc
Đọc khi muốn đi sâu hơn:
- Wireshark User Guide — tài liệu chính thức, mục 6 (Capturing) và mục 8 (Display Filters) là hai chương quan trọng nhất.
- Wireshark Display Filter Reference — tra nhanh mọi field có thể filter, kể cả các field chuyên biệt (TLS, HTTP/2, QUIC).
- TLS Decryption with Wireshark — hướng dẫn cấu hình
SSLKEYLOGFILEđể giải mã HTTPS.
Ghi chú: Wireshark User Guide mục 8.4 "Building display filter expressions" là phần đáng đọc nhất — giải thích logic toán tử (==, contains, matches) và cách kết hợp filter bằng and/or/not.
11. Tóm tắt
- Wireshark bắt gói ở tầng thấp nhất (Ethernet frame) rồi bóc từng lớp theo mô hình TCP/IP — Ethernet → IP → TCP → TLS/HTTP.
- Chọn đúng interface:
eth0/Wi-Ficho traffic ra Internet,lo/lo0cho localhost,docker0cho container. - Display filter (cú pháp riêng Wireshark) dùng toán tử
==:tcp.port == 443,tls.handshake,tcp.flags.syn == 1,tcp.analysis.retransmission. - Packet Details panel (cây ba cấp) bóc từng tầng — click field để highlight bytes trong hex dump.
- Follow → TCP Stream ghép toàn bộ payload kết nối; với HTTPS chỉ thấy ciphertext trừ khi cấu hình
SSLKEYLOGFILE. - Wireshark tự nhận diện retransmission (tô đen/đỏ), duplicate ACK (vàng), RST (đỏ tươi) — filter nhanh qua
tcp.analysis.*. - Workflow thực tế:
tcpdump -w file.pcaptrên server remote →scpvề → mở trong Wireshark phân tích.
12. Tự kiểm tra
Q1Vì sao bạn chọn interface eth0 thay vì lo khi muốn bắt traffic tới google.com?▸
lo (loopback) chỉ bắt traffic giữa các process trên cùng một máy — gói không qua NIC vật lý. Traffic đi ra Internet phải qua interface vật lý (eth0, en0, hoặc Wi-Fi) — đây là nơi gói được đặt vào dây mạng thật. Chọn sai interface = không thấy gói nào, một trong những pitfall phổ biến nhất khi mới dùng Wireshark.Q2Display filter tcp.port == 443 khác gì với capture filter tcp port 443?▸
==). Display filter không làm mất gói, chỉ ẩn khỏi view. Trong thực tế: dùng capture filter trên server production để tránh file quá to; dùng display filter trên máy local để khám phá dữ liệu đã bắt.Q3Bạn Follow → TCP Stream một kết nối HTTPS và chỉ thấy ký tự ngẫu nhiên, không đọc được. Nguyên nhân và cách khắc phục?▸
SSLKEYLOGFILE trỏ tới một file trước khi mở browser, rồi trong Wireshark vào Edit → Preferences → Protocols → TLS, chỉ đường dẫn file đó vào "(Pre)-Master-Secret log filename". Sau đó Wireshark giải mã on-the-fly và Follow → TLS Stream cho thấy nội dung thật (HTTP/2 request/response).Q4Bạn thấy nhiều gói tô màu đen/đỏ với nhãn TCP Retransmission. Điều này nói lên gì về kết nối?▸
Q5Gói RST trong một kết nối đang chạy thường có nghĩa gì? Khác gì FIN/FIN-ACK?▸
ECONNRESET. Ngược lại, FIN/FIN-ACK là trình tự đóng kết nối 4 bước lịch sự — cả hai phía đồng ý dừng, dữ liệu đang gửi dở được gửi hết trước khi đóng. Thấy RST đột ngột trong log = đáng điều tra nguyên nhân.Q6Vì sao workflow thực tế khi debug server production thường là tcpdump capture rồi mở Wireshark sau, thay vì chạy Wireshark trực tiếp trên server?▸
tcpdump là CLI tool nhẹ có sẵn trên hầu hết Linux — có thể capture với filter chính xác, lưu file .pcap, rồi scp về máy local để phân tích thoải mái trong Wireshark. Đây cũng an toàn hơn: không cần expose GUI trên server, và file pcap có thể chia sẻ với teammate để cùng phân tích. tcpdump và Wireshark dùng cùng format libpcap nên tương thích hoàn toàn.Q7Khi mở cây Packet Details và thấy tầng TLS Record Layer nằm trong tầng TCP Segment nằm trong tầng IP Packet nằm trong Ethernet Frame — đây minh hoạ nguyên tắc gì?▸
Bài tiếp theo: Latency vs throughput — vì sao "thêm server" không luôn nhanh hơn
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên