Modul Praktikum Mandiri

Mata Kuliah: Jaringan Multimedia & Distribusi Data | Topik: Analisis Log TCP & UDP

PENGANTAR: Hari ini kita akan membuktikan teori jaringan yang telah dibahas. Kalian akan melihat langsung bagaimana protokol menangani file kecil vs file besar, dan apa yang terjadi jika jalanan jaringan sedang "macet". Kumpulkan hasil log (*screenshot*) dan analisis kalian di akhir sesi.

Tahap 1: Persiapan Jaringan & File Uji

Praktikum ini mensimulasikan jaringan Client-Server. Silakan bekerja berpasangan atau berkelompok.

  1. Tentukan Peran: Pilih satu komputer teman kalian sebagai Server (Penerima). Komputer lainnya bertindak sebagai Client (Pengirim).
  2. Cari Alamat Server: Pada komputer Server, buka Command Prompt (CMD), ketik ipconfig, dan catat angka IPv4 Address (misal: 192.168.1.15). Angka ini akan dipakai oleh Client nanti.
  3. Siapkan 4 File Uji: Di dalam folder tempat kalian menyimpan skrip Python, siapkan 4 file multimedia ini (pastikan namanya sesuai atau ubah nama di dalam skrip nanti):
    • foto_kecil.jpg (ukuran sekitar 50 - 150 KB)
    • foto_besar.jpg (ukuran sekitar 2 - 5 MB)
    • video_pendek.mp4 (ukuran sekitar 2 MB)
    • video_hd.mp4 (ukuran di atas 15 MB)

Tahap 2: Uji Jalur Garansi (Protokol TCP)

Jalur ini digunakan untuk mengunduh dokumen atau foto master. Lambat, tapi file dijamin 100% utuh.

💻 1. Skrip untuk Komputer SERVER (Simpan sebagai: tcp_server.py)
import socket
import time

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 7777))
server.listen(5)

print("[LOG] 🟢 Server TCP Siap di Port 7777. Menunggu file masuk...")

while True:
    koneksi, alamat = server.accept()
    print(f"\n[LOG] 🤝 Koneksi masuk dari: {alamat}")
    
    waktu_mulai = time.time()
    total_byte = 0
    
    while True:
        data = koneksi.recv(4096)
        if not data:
            break # File habis
        total_byte += len(data)
        
    waktu_selesai = time.time()
    durasi = waktu_selesai - waktu_mulai
    
    print("-" * 40)
    print(f"📄 HASIL LOG TCP (Jalur Garansi)")
    print(f"Asal Pengirim : {alamat[0]}")
    print(f"Total Diterima: {total_byte / 1024:.2f} KB")
    print(f"Waktu Tempuh  : {durasi:.4f} detik")
    print(f"Status        : 100% UTUH (Tidak ada packet loss)")
    print("-" * 40)
    
    koneksi.close()
💻 2. Skrip untuk Komputer CLIENT (Simpan sebagai: tcp_client.py)
import socket
import time
import os

# PENTING: Ganti nama file dan IP di bawah ini!
nama_file = "foto_kecil.jpg" 
ip_server = '192.168.1.100'  # <--- GANTI DENGAN IP KOMPUTER SERVER TEMAN KALIAN

ukuran_asli = os.path.getsize(nama_file)
print(f"[LOG] 📦 Mempersiapkan File: {nama_file} ({ukuran_asli / 1024:.2f} KB)")

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((ip_server, 7777))

waktu_mulai = time.time()

with open(nama_file, 'rb') as file:
    data = file.read()
    client.sendall(data) # TCP memastikan semua data terkirim

waktu_selesai = time.time()

print(f"[LOG] ✅ File berhasil dikirim utuh!")
print(f"[LOG] ⏱️ Waktu proses di pengirim: {waktu_selesai - waktu_mulai:.4f} detik")
client.close()

Cara Pengujian: Jalankan tcp_server.py terlebih dahulu. Kemudian jalankan tcp_client.py untuk mengirim foto_kecil.jpg. Catat hasil log di server. Ubah nama file di skrip client menjadi foto_besar.jpg, jalankan lagi, dan catat hasilnya.

Tahap 3: Uji Jalur Cepat (Protokol UDP)

Skenario ini mensimulasikan Live Streaming Video. Pengirim menembakkan potongan video dengan cepat tanpa peduli *Packet Loss* atau *Jitter*.

💻 1. Skrip untuk Komputer SERVER (Simpan sebagai: udp_server.py)
import socket
import time

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
server.settimeout(2.0)

print("[LOG] 📻 Server UDP Siap di Port 8888. Memantau Siaran & Jitter...")

while True:
    total_paket = 0
    total_byte = 0
    waktu_mulai = 0
    waktu_sebelumnya = None
    jitter_tertinggi = 0
    pengirim_terakhir = None
    
    try:
        while True:
            data, alamat = server.recvfrom(4096)
            waktu_sekarang = time.time()
            
            if total_paket == 0:
                waktu_mulai = waktu_sekarang
                print(f"\n[LOG] 🌊 Aliran data masuk dari {alamat}...")
                
            if data == b'END_OF_STREAM':
                break
            
            # Deteksi Jitter
            if waktu_sebelumnya is not None:
                jeda = (waktu_sekarang - waktu_sebelumnya) * 1000
                if jeda > jitter_tertinggi:
                    jitter_tertinggi = jeda
                
                # Tampilkan peringatan jika paket mendadak nyangkut > 20ms
                if jeda > 20.0:
                    print(f"   ⚠️ JITTER TERDETEKSI! Paket terlambat {jeda:.1f} ms")
                    
            waktu_sebelumnya = waktu_sekarang
            pengirim_terakhir = alamat
            total_paket += 1
            total_byte += len(data)
            
    except socket.timeout:
        if total_paket > 0:
            print("[LOG] ⏳ Waktu habis. Aliran terputus.")
            
    if total_paket > 0:
        durasi = time.time() - waktu_mulai
        print("-" * 40)
        print(f"🎬 HASIL LOG UDP (Live Streaming)")
        print(f"Asal Pengirim   : {pengirim_terakhir[0]}")
        print(f"Paket Ditangkap : {total_paket} paket (Gayung)")
        print(f"Total Diterima  : {total_byte / 1024:.2f} KB")
        print(f"Waktu Tempuh    : {durasi:.4f} detik")
        print(f"Jitter Terparah : {jitter_tertinggi:.2f} ms")
        print("-" * 40)
💻 2. Skrip untuk Komputer CLIENT (Simpan sebagai: udp_client.py)
import socket
import time
import os

# PENTING: Ganti nama file dan IP Server!
nama_file = "video_pendek.mp4" 
ip_server = '192.168.1.100'

ukuran_asli = os.path.getsize(nama_file)
print(f"[LOG] 🎥 Mempersiapkan Siaran: {nama_file} ({ukuran_asli / 1024:.2f} KB)")

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

waktu_mulai = time.time()
paket_dikirim = 0
UKURAN_GAYUNG = 4096 # Potong video per 4 KB

with open(nama_file, 'rb') as file:
    while True:
        potongan = file.read(UKURAN_GAYUNG)
        if not potongan:
            break
            
        client.sendto(potongan, (ip_server, 8888))
        paket_dikirim += 1
        
        # Simulasi Kecepatan Tembak (Komentari baris di bawah untuk melihat Packet Loss!)
        time.sleep(0.0001) 

client.sendto(b'END_OF_STREAM', (ip_server, 8888))
waktu_selesai = time.time()

print(f"[LOG] 🚀 Siaran selesai ditembakkan!")
print(f"[LOG] Paket Terkirim: {paket_dikirim} paket")
print(f"[LOG] Waktu tembak  : {waktu_selesai - waktu_mulai:.4f} detik")
client.close()

Cara Pengujian: Uji pertama gunakan video_pendek.mp4. Kemudian ubah ke video_hd.mp4.
Eksperimen Wajib: Pada saat mengirim video_hd.mp4, ubah baris time.sleep(0.0001) menjadi # time.sleep(0.0001) (jadikan komentar agar tidak ada jeda). Tembakkan paketnya, dan perhatikan apa yang terjadi pada jumlah paket di Log Server!

Tugas Analisis (Dikumpulkan)

Salin tabel di bawah ini ke dalam dokumen (Word/Google Docs), isi berdasarkan hasil log dari Terminal/CMD kalian, dan jawab ketiga pertanyaannya. Kumpulkan beserta screenshot Terminal Server kalian.

Skenario Ukuran Dikirim (Client) Ukuran Diterima (Server) Waktu Tempuh Catatan Log Server
1. TCP (Foto Kecil) Status: ?
2. TCP (Foto Besar) Status: ?
3. UDP (Video Pendek) ... Paket... PaketJitter: ?
4. UDP (Video HD + Tanpa Jeda/Sleep) ... Paket... PaketAda Packet Loss?

Pertanyaan Analisis:

  1. Pada pengujian TCP (Uji 1 dan 2), mengapa waktu tempuhnya lebih lama dibandingkan jika kita menembakkan ukuran yang sama via UDP?
  2. Pada Uji 4 (Video HD), apakah jumlah "Paket Terkirim" di Client sama dengan "Paket Ditangkap" di Server? Jika jumlahnya berbeda (Server lebih sedikit), jelaskan fenomena apa yang sedang terjadi di kabel/switch kampus!
  3. Apa yang menyebabkan munculnya tulisan peringatan ⚠️ JITTER TERDETEKSI pada layar Server UDP? (Petunjuk: Coba jalankan skrip bersamaan dengan kelompok lain di satu ruangan)