Model TCP/IP dan Wireshark

Pernahkah Anda bertanya-tanya bagaimana data yang Anda ketikkan di ponsel atau laptop bisa sampai ke server yang berjarak ribuan kilometer? Proses ini lebih kompleks dan terstruktur dari yang terlihat. Di balik layar, data diubah dari format yang dapat dibaca manusia (seperti teks JSON) menjadi serangkaian angka biner (0s dan 1s) yang dapat dikirim melalui kabel atau gelombang radio. Mari kita bedah bagaimana transformasi luar biasa ini terjadi, selangkah demi selangkah.


1. Konsep Dasar: Protokol sebagai Bahasa Universal

Bayangkan Anda ingin mengirimkan sebuah buku ke teman di luar negeri. Anda tidak bisa hanya melemparkannya. Anda harus membungkusnya, menempelkan label alamat, dan memastikan pengiriman mematuhi aturan tertentu. Dalam dunia jaringan, protokol adalah aturan-aturan ini.

Setiap protokol memiliki peran spesifik:

  • Protokol Aplikasi (HTTP): Ini adalah "bahasa" yang digunakan oleh aplikasi, seperti peramban web dan server. Aturan ini menentukan bagaimana permintaan (misalnya, POST) dan respons diformat.

  • Protokol Transport (TCP): Ini adalah "layanan pengiriman" yang menjamin paket Anda tiba dengan utuh dan dalam urutan yang benar.

  • Protokol Internet (IP): Ini adalah "sistem alamat" yang memastikan setiap paket menemukan jalannya di seluruh jaringan global.

Tanpa aturan-aturan ini, komunikasi data akan menjadi kekacauan yang tidak teratur.


2. Proses Pengiriman: Sebuah Perjalanan Empat Lapisan

Perjalanan data dari komputer Anda ke server mengikuti model berlapis yang dikenal sebagai model TCP/IP. Data melewati empat lapisan utama, dengan setiap lapisan menambahkan informasi atau "amplop" baru. Proses ini disebut enkapsulasi.

Lapisan 1: Lapisan Aplikasi (HTTP)

Semua dimulai di sini. Data Anda, misalnya dalam format JSON yang mudah dibaca, ditempatkan di dalam sebuah permintaan HTTP.

Bentuk Data: Teks atau string yang terstruktur, seperti:

POST /users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 42

{"nama": "Andi", "email": "andi@example.com"}

Ini adalah permintaan yang siap dikirim.


Lapisan 2: Lapisan Transport (TCP)

Permintaan HTTP dari lapisan aplikasi diserahkan ke lapisan ini. Di sini, data yang besar dipecah menjadi unit-unit kecil yang disebut segmen. Setiap segmen diberi TCP header yang berisi nomor port sumber dan tujuan, serta nomor urut (sequence number). Nomor urut ini krusial untuk memastikan data dirakit kembali dengan benar di sisi penerima, seperti menyusun ulang potongan puzzle.

Bentuk Data: (Header TCP) + (Data HTTP)


Lapisan 3: Lapisan Internet (IP)

Setiap segmen TCP kemudian dibungkus lagi menjadi sebuah paket IP. Lapisan ini menambahkan IP header yang berisi alamat IP sumber (alamat komputer Anda) dan alamat IP tujuan (alamat server). Ini adalah alamat "fisik" di internet, seperti alamat rumah yang memastikan paket menemukan kota yang tepat.

Bentuk Data: (Header IP) + (Segmen TCP)


Lapisan 4: Lapisan Tautan Data & Fisik

Ini adalah lapisan terakhir sebelum data dikirim. Paket IP dibungkus lagi menjadi sebuah frame (misalnya, Ethernet frame) yang menambahkan alamat fisik perangkat (MAC Address) di jaringan lokal. Pada akhirnya, seluruh frame—bersama semua header yang ada—dikonversi menjadi byte stream.

Bentuk Data: (Header Frame) + (Header IP) + (Header TCP) + (Data HTTP) + (Trailer Frame)

Ini adalah bentuk data yang sesungguhnya melintasi media fisik, baik itu kabel, serat optik, atau gelombang radio.

3. Proses Penerimaan: Dekapsulasi

Di sisi server, prosesnya dibalik. Paket yang datang dibaca dari lapisan paling bawah. Setiap header dilepas satu per satu (proses dekapsulasi), hingga akhirnya data HTTP dan JSON asli terungkap di lapisan aplikasi, siap untuk diproses oleh server.


Membongkar Paket dengan Wireshark

Panduan ini akan menjelaskan secara komprehensif cara menggunakan Wireshark untuk analisis jaringan di Mac, mulai dari instalasi hingga analisis mendalam paket jaringan. Wireshark adalah alat penganalisis protokol jaringan yang paling kuat dan populer, memungkinkan Anda untuk melihat setiap lapisan protokol secara detail.


Bagian 1: Instalasi Wireshark di Mac

1.1 Metode Instalasi

Ada beberapa cara untuk menginstal Wireshark di Mac:

Metode 1: Instalasi Langsung dari Website (Disarankan)

  1. Download Wireshark:

    • Kunjungi situs web resmi Wireshark: www.wireshark.org

    • Pilih versi stabil terbaru untuk macOS

    • Download file .dmg

  2. Proses Instalasi:

    • Buka file .dmg yang telah di-download

    • Drag aplikasi Wireshark ke folder /Applications

    • PENTING: Jangan lupa untuk menginstall ChmodBPF launch daemon

      • Buka file Install ChmodBPF.pkg yang ada di dalam .dmg

      • Atau alternatifnya, buka Wireshark → Preferences → Folders tab → double-click "macOS Extras"

  3. Verifikasi Instalasi:

    • Buka aplikasi Wireshark dari folder Applications

    • Jika muncul permintaan password, masukkan password admin Anda

Metode 2: Instalasi via Homebrew

Jika Anda sudah memiliki Homebrew terinstal:

# Update Homebrew
brew update

# Install Wireshark via Cask
brew install --cask wireshark

1.2 Mengatasi Masalah Permission yang Sering Terjadi

Masalah Umum: Error "You don't have permission to capture on that device"

Solusi:

  1. Pastikan ChmodBPF terinstal:

    • Cek di System Preferences → Users & Groups → Login Items

    • Harus ada "ChmodBPF" di daftar

  2. Jika masih error, lakukan langkah berikut:

    # Cek username Anda
    whoami
    
    # Ubah ownership file BPF
    cd /dev
    sudo chown [username_anda]:admin bp*

    Contoh:

    $ whoami
    johnappleseed
    $ cd /dev
    $ sudo chown johnappleseed:admin bp*
    Password:
  3. Restart Mac Anda (kadang diperlukan agar perubahan permission berlaku)

  4. Verifikasi dengan perintah:

    ls -la | grep bp

    Seharusnya muncul:

    crw------- 1 johnappleseed admin 0x17000000 Jan 13 21:48 bpf0
    crw------- 1 johnappleseed admin 0x17000001 Jan 14 09:56 bpf1
    crw------- 1 johnappleseed admin 0x17000002 Jan 13 20:57 bpf2
    crw------- 1 johnappleseed admin 0x17000003 Jan 13 20:57 bpf3
    crw------- 1 johnappleseed admin 0x17000004 Jan 13 20:57 bpf4

Bagian 2: Memulai Pengambilan Paket

2.1 Antarmuka Wireshark

  1. Buka Wireshark:

    • Aplikasi → Wireshark

    • Mungkin perlu masukkan password admin untuk pertama kali

  2. Pilih Antarmuka Jaringan:

    • en0: Biasanya untuk Ethernet (kabel)

    • en1: Biasanya untuk Wi-Fi

    • Anda bisa melihat deskripsi masing-masing antarmuka di sebelah kanan nama

  3. Mulai Capture:

    • Klik tombol Start capturing packets (ikon hiu biru)

    • Atau double-click pada antarmuka yang dipilih

    • Wireshark akan mulai menampilkan semua paket yang melintas

2.2 Tips Sebelum Memulai Capture

  1. Matikan aplikasi yang tidak perlu untuk mengurangi noise

  2. Gunakan filter sejak awal untuk fokus pada traffic yang relevan

  3. Siapkan aksi yang akan dilakukan (misal: buka browser, jalankan curl, dll)


Bagian 3: Membuat dan Menganalisis Traffic HTTP

3.1 Membuat Permintaan HTTP untuk Testing

Menggunakan Terminal (curl)

# Contoh POST request dengan JSON data
curl -X POST \
  -H "Content-Type: application/json" \
  -H "User-Agent: MyTestApp/1.0" \
  -d '{"nama": "Andi", "email": "andi@example.com", "pesan": "Halo Dunia!"}' \
  http://httpbin.org/post

# Contoh GET request
curl -X GET \
  -H "Accept: application/json" \
  http://httpbin.org/get?param1=value1&param2=value2

Menggunakan Browser

  1. Buka browser (Safari, Chrome, Firefox)

  2. Kunjungi website yang ingin dianalisis

  3. Lakukan aksi (klik link, submit form, dll)

3.2 Menggunakan Filter di Wireshark

Filter Dasar

# Filter hanya HTTP traffic
http

# Filter hanya POST requests
http.request.method == "POST"

# Filter traffic ke domain tertentu
http.host == "httpbin.org"

# Filter traffic dari IP tertentu
ip.src == 192.168.1.100

# Filter kombinasi
http.request.method == "POST" and http.host == "httpbin.org"

Filter Lanjutan

# Filter berdasarkan User-Agent
http.user_agent contains "MyTestApp"

# Filter berdasarkan Content-Type
http.content_type == "application/json"

# Filter berdasarkan URL
http.request.uri contains "/post"

# Filter range port
tcp.port >= 80 and tcp.port <= 90

3.3 Analisis Paket di Wireshark

Setelah menemukan paket yang relevan, klik pada paket tersebut untuk melihat detailnya:

1. Frame Layer (Lapisan Fisik & Data Link)

Frame 1: 598 bytes on wire (4784 bits), 598 bytes captured (4784 bits)
    Interface: en1
    Arrival Time: Jan 14, 2024 10:30:15.123456 UTC
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1705265415.123456000
    [Time delta from previous captured frame: 0.000000000 seconds]
    [Time delta from previous displayed frame: 0.000000000 seconds]
    [Time since reference or first frame: 0.000000000 seconds]
    Frame Number: 1
    Frame Length: 598 bytes (4784 bits)
    Capture Length: 598 bytes (4784 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ip:tcp:http]
    [Coloring Rule Name: HTTP]
    [Coloring Rule String: http]

Penjelasan:

  • Frame Length: Total ukuran frame dalam bytes

  • Interface: Antarmuka jaringan yang digunakan

  • Arrival Time: Waktu paket tiba

  • Protocols in frame: Protokol yang terkandung dalam frame

2. Internet Protocol Version 4 (Lapisan Internet)

Internet Protocol Version 4, Src: 192.168.1.100, Dst: 54.225.154.124
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
    Total Length: 584
    Identification: 0x1234 (4660)
    Flags: 0x02 (Don't Fragment)
    Fragment Offset: 0
    Time to Live: 64
    Protocol: TCP (6)
    Header Checksum: 0xabcd [unverified]
    Source Address: 192.168.1.100
    Destination Address: 54.225.154.124

Penjelasan:

  • Version: Versi IP (4 = IPv4)

  • Header Length: Panjang header IP

  • Total Length: Total panjang paket IP

  • Source/Destination Address: Alamat IP sumber dan tujuan

  • Protocol: Protokol lapisan transport (6 = TCP)

  • TTL (Time to Live): Batas hop paket

3. Transmission Control Protocol (Lapisan Transport)

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 1, Ack: 1, Len: 540
    Source Port: 54321
    Destination Port: 80
    [Stream index: 0]
    [TCP Segment Len: 540]
    Sequence Number: 1    (relative sequence number)
    Sequence Number (raw): 1234567890
    [Next Sequence Number: 541]
    Acknowledgment Number: 1    (relative ack number)
    Acknowledgment Number (raw): 987654321
    Header Length: 32 bytes (8)
    Flags: 0x018 (PSH, ACK)
    Window: 65535
    Checksum: 0x1234 [unverified]
    Urgent Pointer: 0
    Options: (12 bytes)
        NOP
        NOP
        Timestamps: tsval 123456789, tsecr 987654321
    [SEQ/ACK analysis]
        [This is an ACK to the segment in frame: 0]
        [The RTT to ACK the segment was: 0.000123000 seconds]
        [iRTT: 0.000123000 seconds]
        [Bytes in flight: 540]

Penjelasan:

  • Source/Destination Port: Port sumber dan tujuan

  • Sequence Number: Nomor urut untuk pengiriman data

  • Acknowledgment Number: Nomor ack untuk konfirmasi penerimaan

  • Flags: Flag TCP (SYN, ACK, PSH, FIN, RST, URG)

  • Window Size: Ukuran window untuk flow control

  • Header Length: Panjang header TCP

4. Hypertext Transfer Protocol (Lapisan Aplikasi)

Hypertext Transfer Protocol
    POST /post HTTP/1.1\r\n
    Host: httpbin.org\r\n
    User-Agent: curl/7.88.1\r\n
    Accept: */*\r\n
    Content-Type: application/json\r\n
    Content-Length: 68\r\n
    \r\n
    [Full request URI: http://httpbin.org/post]
    [HTTP request 1/1]
    [Prev request in frame: 0]
    [Next request in frame: 0]
    File Data: 68 bytes
Line-based text data: application/json
    {"nama": "Andi", "email": "andi@example.com", "pesan": "Halo Dunia!"}

Penjelasan:

  • Request Line: Method, URI, dan HTTP version

  • Headers: Informasi tambahan tentang request

  • Body: Data yang dikirim (dalam hal ini JSON)


Bagian 4: Decrypt HTTPS Traffic (Advanced)

4.1 Mengapa Perlu Decrypt HTTPS?

Sebagian besar traffic web modern menggunakan HTTPS, yang terenkripsi. Tanpa decrypt, Anda tidak bisa melihat:

  • URL sebenarnya

  • Header HTTP

  • Body request/response

  • Parameter query

4.2 Setup untuk Decrypt HTTPS

Metode 1: Menggunakan Browser (Chrome/Firefox)

  1. Setup Environment Variable:

    # Untuk Chrome
    export SSLKEYLOGFILE=~/sslkeylog.log
    
    # Untuk Firefox
    # Buka about:config, cari security.ssl.enable_false_start, set ke false
  2. Jalankan Browser dengan Environment Variable:

    # Chrome
    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --ssl-key-log-file=~/sslkeylog.log
    
    # Firefox
    /Applications/Firefox.app/Contents/MacOS/firefox

Metode 2: Menggunakan curl

export SSLKEYLOGFILE=~/sslkeylog.log
curl -X POST -H "Content-Type: application/json" -d '{"test": "data"}' https://httpbin.org/post

4.3 Setup Wireshark untuk Decrypt HTTPS

  1. Buka Wireshark Preferences:

    • Menu: Edit → Preferences

    • Atau shortcut: ⌘ + ,

  2. Konfigurasi TLS/SSL:

    • Di panel kiri, pilih: Protocols → TLS (untuk Wireshark 3.x) atau SSL (untuk Wireshark 2.x)

    • Cari field: (Pre)-Master-Secret log filename

    • Klik Browse dan pilih file key log yang Anda buat

    • Klik OK

  3. Restart Capture untuk menerapkan perubahan

4.4 Analisis HTTPS Traffic yang Ter-decrypt

Setelah setup, Anda akan melihat:

  • HTTP requests muncul di bawah HTTPS packets

  • Bisa melihat URL, headers, dan body yang sebenarnya

  • Bisa follow HTTP stream seperti traffic HTTP biasa


Bagian 5: Tips dan Trik Lanjutan

5.1 Menggunakan Color Coding

Wireshark memiliki color coding otomatis untuk memudahkan identifikasi:

  • Hijau: HTTP traffic

  • Biru: TCP traffic

  • Merah: Error atau problematic packets

  • Kuning: DNS traffic

Anda bisa membuat custom color rules di View → Coloring Rules

5.2 Menggunakan Statistics

  1. Protocol Hierarchy:

    • Statistics → Protocol Hierarchy

    • Lihat distribusi protokol dalam capture

  2. IO Graphs:

    • Statistics → IO Graphs

    • Visualisasi traffic over time

  3. Endpoints:

    • Statistics → Endpoints

    • Lihat semua IP/Port yang terlibat

5.3 Export Data

  1. Export Packets:

    • File → Export Specified Packets

    • Pilih format (pcap, pcapng, dll)

  2. Export Objects:

    • File → Export Objects → HTTP

    • Export file yang dikirim via HTTP (images, documents, dll)

  3. Save as CSV/JSON:

    • File → Export Packet Dissections → As CSV/JSON


Bagian 6: Troubleshooting Umum

6.1 Tidak Bisa Capture Paket

Masalah: "You don't have permission to capture on that device"

Solusi:

  1. Pastikan ChmodBPF terinstal

  2. Ubah ownership file BPF (lihat Bagian 1.2)

  3. Restart Mac

  4. Coba jalankan Wireshark sebagai sudo:

    sudo /Applications/Wireshark.app/Contents/MacOS/Wireshark

6.2 Traffic Tidak Muncul

Masalah: Tidak ada paket yang muncul meskipun ada aktivitas jaringan

Solusi:

  1. Pastikan antarmuka yang benar dipilih

  2. Cek apakah ada firewall yang memblokir

  3. Coba antarmuka lain (en0 vs en1)

  4. Matikan VPN jika aktif

6.3 HTTPS Tidak Ter-decrypt

Masalah: Traffic HTTPS masih terlihat terenkripsi

Solusi:

  1. Pastikan SSLKEYLOGFILE environment variable ter-set

  2. Cek path ke key log file di Wireshark preferences

  3. Pastikan browser/app dijalankan dengan environment variable yang benar

  4. Restart Wireshark setelah mengubah preferences


Bagian 7: Alternatif Wireshark untuk Mac

Jika Anda merasa Wireshark terlalu kompleks, ada beberapa alternatif:

Keuntungan:

  • Native macOS app (developed in Swift)

  • UI/UX yang lebih user-friendly

  • Fokus pada HTTP/HTTPS debugging

  • Automatic device setup untuk iOS/Android

  • Built-in tools untuk modify request/response

Fitur Utama:

  • Capture HTTP/HTTPS traffic

  • Multiple Filters (Protocol, Content-Type, URL, etc)

  • GraphQL Debugging

  • Map Local/Map Remote

  • Breakpoint debugging

  • JavaScript scripting

Website: proxyman.io

7.2 tcpdump (Command Line)

Keuntungan:

  • Sudah terinstal di macOS

  • Ringan dan cepat

  • Bisa di-automate dengan scripts

Contoh Penggunaan:

# Capture semua traffic di interface en1
sudo tcpdump -i en1

# Capture traffic ke port 80 (HTTP)
sudo tcpdump -i en1 port 80

# Save capture ke file
sudo tcpdump -i en1 -w capture.pcap

# Read dari file
tcpdump -r capture.pcap

7.3 Charles Proxy

Keuntungan:

  • UI yang intuitif

  • Bagus untuk debugging mobile apps

  • Mendukung SSL Proxying

Website: charlesproxy.com


Bagian 8: Best Practices

8.1 Keamanan

  1. Jangan capture di public network tanpa izin

  2. Hapus capture yang mengandung data sensitif setelah analisis

  3. Gunakan dummy data untuk testing (seperti httpbin.org)

  4. Hati-hati dengan capture yang berisi password/token

8.2 Performance

  1. Gunakan filter sejak awal untuk mengurangi noise

  2. Matikan capture saat tidak digunakan

  3. Save capture secara berkala untuk analisis nanti

  4. Gunakan ring buffer untuk capture jangka panjang

8.3 Etika

  1. Hanya capture traffic yang Anda miliki atau punya izin

  2. Hormati privacy pengguna lain di jaringan

  3. Gunakan pengetahuan untuk tujuan pembelajaran dan troubleshooting


Wireshark adalah alat yang sangat powerful untuk analisis jaringan di Mac. Dengan panduan ini, Anda sekarang memiliki pengetahuan lengkap untuk:

  1. Menginstal Wireshark dengan benar di Mac

  2. Mengatasi masalah permission yang sering terjadi

  3. Melakukan capture dan analisis paket jaringan

  4. Memahami setiap lapisan protokol secara detail

  5. Decrypt HTTPS traffic untuk analisis mendalam

  6. Menggunakan alternatif tools jika diperlukan

Praktikkan langkah-langkah di atas secara bertahap, dan Anda akan mahir dalam analisis jaringan menggunakan Wireshark. Ingatlah untuk selalu menggunakan pengetahuan ini dengan bertanggung jawab dan mengikuti aturan etika yang berlaku.

Cara Baca Laporan Wireshark

Frame 91: Packet, 269 bytes on wire (2152 bits), 269 bytes captured (2152 bits) on interface en0, id 0
    Section number: 1
    Interface id: 0 (en0)
        Interface name: en0
        Interface description: Wi-Fi
    Encapsulation type: Ethernet (1)
    Arrival Time: Oct 13, 2025 15:21:06.942743000 WIB
    UTC Arrival Time: Oct 13, 2025 08:21:06.942743000 UTC
    Epoch Arrival Time: 1760343666.942743000
    [Time shift for this packet: 0.000000000 seconds]
    [Time delta from previous captured frame: 180.000 microseconds]
    [Time since reference or first frame: 27.325979000 seconds]
    Frame Number: 91
    Frame Length: 269 bytes (2152 bits)
    Capture Length: 269 bytes (2152 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ethertype:ip:tcp:http:json]
    Character encoding: ASCII (0)
    [Coloring Rule Name: HTTP]
    [Coloring Rule String: http || tcp.port == 80 || http2]
Ethernet II, Src: 8e:c3:47:d6:f1:01 (8e:c3:47:d6:f1:01), Dst: MS-NLB-PhysServer-02_a5:90:00 (02:02:00:a5:90:00)
    Destination: MS-NLB-PhysServer-02_a5:90:00 (02:02:00:a5:90:00)
        .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: 8e:c3:47:d6:f1:01 (8e:c3:47:d6:f1:01)
        .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
    [Stream index: 0]
Internet Protocol Version 4, Src: 10.126.79.11, Dst: 52.202.135.65
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x02 (DSCP: CS0, ECN: ECT(0))
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..10 = Explicit Congestion Notification: ECN-Capable Transport codepoint '10' (2)
    Total Length: 255
    Identification: 0x0000 (0)
    010. .... = Flags: 0x2, Don't fragment
        0... .... = Reserved bit: Not set
        .1.. .... = Don't fragment: Set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 64
    Protocol: TCP (6)
    Header Checksum: 0x2463 [validation disabled]
    [Header checksum status: Unverified]
    Source Address: 10.126.79.11
    Destination Address: 52.202.135.65
    [Stream index: 14]
Transmission Control Protocol, Src Port: 51324, Dst Port: 80, Seq: 1, Ack: 1, Len: 203
    Source Port: 51324
    Destination Port: 80
    [Stream index: 6]
    [Stream Packet Number: 4]
    [Conversation completeness: Complete, WITH_DATA (31)]
        ..0. .... = RST: Absent
        ...1 .... = FIN: Present
        .... 1... = Data: Present
        .... .1.. = ACK: Present
        .... ..1. = SYN-ACK: Present
        .... ...1 = SYN: Present
        [Completeness Flags: ·FDASS]
    [TCP Segment Len: 203]
    Sequence Number: 1    (relative sequence number)
    Sequence Number (raw): 1031841318
    [Next Sequence Number: 204    (relative sequence number)]
    Acknowledgment Number: 1    (relative ack number)
    Acknowledgment number (raw): 2386980244
    1000 .... = Header Length: 32 bytes (8)
    Flags: 0x018 (PSH, ACK)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Accurate ECN: Not set
        .... 0... .... = Congestion Window Reduced: Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...1 .... = Acknowledgment: Set
        .... .... 1... = Push: Set
        .... .... .0.. = Reset: Not set
        .... .... ..0. = Syn: Not set
        .... .... ...0 = Fin: Not set
        [TCP Flags: ·······AP···]
    Window: 2059
    [Calculated window size: 131776]
    [Window size scaling factor: 64]
    Checksum: 0xff30 [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - Timestamps: TSval 2160006692, TSecr 2900989057
            Kind: Time Stamp Option (8)
            Length: 10
            Timestamp value: 2160006692
            Timestamp echo reply: 2900989057
    [Timestamps]
        [Time since first frame in this TCP stream: 330.244000 milliseconds]
        [Time since previous frame in this TCP stream: 180.000 microseconds]
    [SEQ/ACK analysis]
        [iRTT: 330.064000 milliseconds]
        [Bytes in flight: 203]
        [Bytes sent since last PSH flag: 203]
    [Client Contiguous Streams: 1]
    [Server Contiguous Streams: 1]
    TCP payload (203 bytes)
Hypertext Transfer Protocol
    POST /post HTTP/1.1\r\n
        Request Method: POST
        Request URI: /post
        Request Version: HTTP/1.1
    Host: httpbin.org\r\n
    Accept: */*\r\n
    Content-Type: application/json\r\n
    User-Agent: MyTestApp/1.0\r\n
    Content-Length: 69\r\n
        [Content length: 69]
    \r\n
    [Response in frame: 96]
    [Full request URI: http://httpbin.org/post]
    File Data: 69 bytes
JavaScript Object Notation: application/json
    Object
        Member: nama
            [Path with value: /nama:Andi]
            [Member with value: nama:Andi]
            String value: Andi
            Key: nama
            [Path: /nama]
        Member: email
            [Path with value: /email:andi@example.com]
            [Member with value: email:andi@example.com]
            String value: andi@example.com
            Key: email
            [Path: /email]
        Member: pesan
            [Path with value: /pesan:Halo Dunia!]
            [Member with value: pesan:Halo Dunia!]
            String value: Halo Dunia!
            Key: pesan
            [Path: /pesan]

1. Lapisan Frame (Fisik & Tautan Data)

Bagian pertama ini adalah informasi dasar tentang paket yang ditangkap oleh Wireshark.

  • Frame 91: Ini adalah paket ke-91 yang ditangkap dalam sesi Wireshark.

  • 269 bytes on wire: Ukuran total paket saat melintas di jaringan.

  • Interface name: en0: Antarmuka jaringan yang digunakan, yaitu Wi-Fi.

  • Arrival Time: Waktu paket ini ditangkap, lengkap dengan milidetik.

  • [Protocols in frame: eth:ethertype:ip:tcp:http:json]: Ini adalah ringkasan yang paling penting. Urutan ini menunjukkan lapisan-lapisan protokol dari bawah ke atas: Ethernet -> IP -> TCP -> HTTP -> JSON. Ini membuktikan bahwa data JSON Anda dienkapsulasi di dalam setiap lapisan di bawahnya.


2. Lapisan Ethernet (Tautan Data)

Bagian ini menunjukkan informasi dari lapisan Ethernet. Ini adalah "amplop" pertama yang membungkus paket.

  • Src: 8e:c3:47:d6:f1:01: Alamat MAC (Media Access Control) sumber. Ini adalah alamat fisik unik dari kartu jaringan (Wi-Fi card) komputer Anda.

  • Dst: 02:02:00:a5:90:00: Alamat MAC tujuan. Ini adalah alamat MAC dari perangkat berikutnya di jaringan Anda, kemungkinan router Anda.

  • Type: IPv4 (0x0800): Nilai ini menunjukkan bahwa "amplop" berikutnya yang ada di dalam bingkai Ethernet ini adalah paket IPv4.


3. Lapisan Internet (IP)

Ini adalah informasi alamat logis dari paket.

  • Source Address: 10.126.79.11: Alamat IP (Internet Protocol) lokal komputer Anda.

  • Destination Address: 52.202.135.65: Alamat IP tujuan, yaitu IP dari server httpbin.org.

  • Protocol: TCP (6): Nilai ini mengindikasikan bahwa "amplop" berikutnya yang ada di dalam paket IP ini adalah segmen TCP.


4. Lapisan Transport (TCP)

Bagian ini menunjukkan rincian komunikasi yang andal antara dua aplikasi.

  • Src Port: 51324: Port sumber, yaitu port yang digunakan oleh aplikasi (misalnya browser atau curl) di komputer Anda untuk mengirim permintaan.

  • Dst Port: 80: Port tujuan. Ini adalah port standar untuk lalu lintas HTTP di server.

  • Flags: PSH, ACK: Ini adalah flag TCP. PSH (Push) menandakan bahwa paket ini berisi data yang harus segera dikirim ke lapisan aplikasi di atasnya. ACK (Acknowledgement) berarti paket ini juga mengakui penerimaan paket sebelumnya dari server.

  • TCP payload (203 bytes): Ini menunjukkan bahwa ada 203 byte data HTTP yang berada di dalam segmen TCP ini.


5. Lapisan Aplikasi (HTTP & JSON)

Ini adalah bagian paling atas, di mana data asli Anda berada.

  • POST /post HTTP/1.1: Ini adalah Request Line dari permintaan HTTP. Anda mengirim permintaan POST ke server.

  • Host: httpbin.org: Header HTTP yang menunjukkan nama domain tujuan.

  • Content-Type: application/json: Header yang memberitahu server bahwa data yang dikirim adalah format JSON.

  • Content-Length: 69: Panjang data JSON yang ada di bagian body.

  • JavaScript Object Notation: application/json: Wireshark secara otomatis mengenali data ini sebagai JSON.

  • Object: Bagian ini memecah struktur data JSON yang Anda kirim.

    • Member: nama : String value: Andi

    • Member: email : String value: andi@example.com

    • Member: pesan : String value: Halo Dunia!


Program Go

Mari kita buat program sederhana untuk menangani berbagai jenis permintaan HTTP (JSON, form data, dan multipart) dan kemudian menangkapnya dengan Wireshark. Program Go ini akan berfungsi sebagai server lokal yang berjalan di localhost:8080.

1. Program Server Golang

Buat file baru bernama main.go. Program ini akan mendengarkan permintaan di port 8080 dan memiliki tiga endpoint yang berbeda untuk setiap jenis data.

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

// Endpoint untuk menangani JSON
func handleJSON(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}

	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		http.Error(w, "Error reading request body", http.StatusInternalServerError)
		return
	}

	var data map[string]interface{}
	err = json.Unmarshal(body, &data)
	if err != nil {
		http.Error(w, "Error decoding JSON", http.StatusBadRequest)
		return
	}

	fmt.Printf("Received JSON data: %+v\n", data)
	fmt.Fprintf(w, "JSON data received successfully!")
}

// Endpoint untuk menangani Form Data
func handleFormData(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}

	err := r.ParseForm()
	if err != nil {
		http.Error(w, "Error parsing form data", http.StatusInternalServerError)
		return
	}

	fmt.Printf("Received Form Data: %+v\n", r.Form)
	fmt.Fprintf(w, "Form data received successfully!")
}

// Endpoint untuk menangani Multipart Form Data
func handleMultipart(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}

	r.ParseMultipartForm(10 << 20) // Batasi ukuran file hingga 10MB
	file, handler, err := r.FormFile("myFile")
	if err != nil {
		http.Error(w, "Error retrieving the file", http.StatusBadRequest)
		return
	}
	defer file.Close()

	fmt.Printf("Received file: %s\n", handler.Filename)
	fmt.Fprintf(w, "File '%s' received successfully!", handler.Filename)
}

func main() {
	http.HandleFunc("/json", handleJSON)
	http.HandleFunc("/form", handleFormData)
	http.HandleFunc("/multipart", handleMultipart)

	fmt.Println("Server is running on http://localhost:8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

2. Menjalankan Program dan Mengirim Permintaan

  1. Buka terminal, navigasi ke direktori tempat Anda menyimpan main.go, dan jalankan server Go:

    go run main.go
  2. Server akan mulai berjalan dan menunggu permintaan. Biarkan terminal ini tetap terbuka.

3. Menggunakan Wireshark untuk Menangkap Paket

  1. Buka aplikasi Wireshark.

  2. Pilih antarmuka jaringan Loopback (atau lo0 di macOS). Ini adalah antarmuka virtual yang digunakan untuk lalu lintas jaringan lokal (dari komputer ke komputer itu sendiri).

  3. Klik tombol Start capturing packets.

  4. Di bilah filter, ketik: tcp.port == 8080 dan tekan Enter. Ini akan memastikan Anda hanya melihat lalu lintas ke server lokal Anda.

4. Simulasi dan Analisis

Sekarang, buka terminal baru untuk mengirim permintaan menggunakan curl dan amati hasilnya di Wireshark.


Simulasi 1: Permintaan JSON

  1. Di terminal, kirim permintaan POST dengan data JSON:

    curl -X POST \
      -H "Content-Type: application/json" \
      -d '{"nama": "Budi", "umur": 25}' \
      http://localhost:8080/json
  2. Kembali ke Wireshark. Anda akan melihat paket TCP yang berisi permintaan HTTP. Klik pada paket tersebut.

  3. Luaskan bagian Hypertext Transfer Protocol. Anda akan melihat header seperti Content-Type: application/json.

  4. Luaskan bagian Line-based text data untuk melihat data JSON asli: {"nama": "Budi", "umur": 25}. Ini menunjukkan bagaimana data JSON murni terlampir di dalam permintaan HTTP.


Simulasi 2: Permintaan Form Data

  1. Di terminal, kirim permintaan POST dengan form data:

    curl -X POST \
      -d "nama=Siti&kota=Jakarta" \
      http://localhost:8080/form
  2. Di Wireshark, cari paket baru. Klik paket POST yang relevan.

  3. Di bagian Hypertext Transfer Protocol, perhatikan header Content-Type yang akan menjadi application/x-www-form-urlencoded.

  4. Di bawah header, Anda akan melihat data form dalam format key=value, yaitu nama=Siti&kota=Jakarta.


Simulasi 3: Permintaan Multipart Form Data

  1. Buat file teks sederhana (misalnya, test.txt) dengan konten apa pun.

  2. Di terminal, kirim permintaan POST yang berisi file tersebut:

    curl -X POST \
      -F "myFile=@test.txt" \
      http://localhost:8080/multipart
  3. Di Wireshark, cari paket POST yang baru.

  4. Di bagian Hypertext Transfer Protocol, Anda akan melihat Content-Type yang sangat berbeda, yaitu multipart/form-data; boundary=....

  5. Luaskan bagian Multipart Mime Media Encapsulation. Anda akan melihat bagian-bagian terpisah (parts) dari data multipart. Satu bagian akan berisi header Content-Disposition dengan nama file (test.txt), dan di bawahnya, Anda akan menemukan konten dari file tersebut. Ini menunjukkan bagaimana data dan file dipaketkan secara terpisah di dalam satu permintaan.


Simulasi Beberapa Segmen

Ini akan memperjelas bagaimana TCP memecah data HTTP menjadi potongan-potongan yang lebih kecil.


1. Memodifikasi Program Go (Golang)

Kita akan mengirimkan data yang sangat besar. Kita bisa menggunakan endpoint /json karena sangat fleksibel.


2. Menjalankan Program dan Mengirim Permintaan

  1. Jika server Go Anda belum berjalan, jalankan kembali:

    go run main.go
  2. Buka Wireshark dan mulai menangkap lalu lintas di antarmuka Loopback (lo0 di macOS) dengan filter tcp.port == 8080.

  3. Buat file JSON berukuran besar. Anda bisa membuat file ini secara manual atau menggunakan skrip sederhana. Misalnya, buat file large_data.json .

  4. Di terminal, kirim permintaan POST dengan file JSON berukuran besar:

    Bash

    curl -X POST \
      -H "Content-Type: application/json" \
      -d @large_data.json \
      http://localhost:8080/json

    Perintah @large_data.json memberitahu curl untuk membaca konten dari file dan mengirimkannya sebagai body permintaan.


3. Analisis di Wireshark

  1. Setelah perintah curl selesai, kembali ke Wireshark dan hentikan penangkapan paket.

  2. Di bilah filter, gunakan tcp.port == 8080 dan cari paket POST yang Anda kirim. Anda akan melihat satu baris untuk permintaan POST Anda.

  3. Namun, di bawah baris tersebut (atau dengan mengklik panah di sampingnya), Anda akan melihat beberapa paket TCP terpisah. Ini adalah paket-paket yang mewakili setiap segmen.

  4. Klik pada paket pertama (yang memiliki POST di bagian infonya). Di panel bawah, Anda akan melihat header HTTP dan bagian pertama dari data JSON. Perhatikan header TCP. Anda akan melihat Sequence Number yang menandai awal data.

  5. Sekarang, klik pada paket kedua (yang akan memiliki "TCP segment of a reassembled PDU" di bagian info).

    • Perhatikan header TCP-nya. Anda akan melihat Sequence Number yang melanjutkan dari paket sebelumnya. Ini membuktikan bahwa paket ini adalah kelanjutan dari data yang sama.

    • Wireshark akan merakit kembali data ini secara otomatis untuk Anda, tetapi Anda bisa melihatnya di panel bawah.

  6. Jika Anda memiliki lebih dari dua segmen, periksa paket-paket berikutnya. Setiap paket akan memiliki Sequence Number yang meningkat, menunjukkan urutan pengiriman.

Dengan cara ini, Anda bisa melihat bagaimana data yang secara konseptual adalah satu kesatuan (satu file JSON) dipecah oleh protokol TCP menjadi beberapa segmen yang lebih kecil untuk pengiriman yang lebih efisien dan andal.

Last updated