Setiap kali program Python mengambil data cuaca, mengirim pesan ke rekan kerja, atau memanggil API pembayaran, program sedang berbicara melalui jaringan. Semua percakapan tersebut berdiri di atas beberapa konsep sederhana: alamat IP, port, DNS, dan protokol transport. Pada Chapter ini kita akan membedah konsep-konsep tersebut satu per satu, sehingga kode jaringan pada chapter berikutnya tidak terasa seperti mantra ajaib.
Alamat IP dan Port #
Alamat IP berperan seperti alamat rumah pada dunia nyata: paket data dikirim ke alamat tersebut agar sampai ke perangkat yang tepat. Angka port (0 sampai 65535) berperan seperti nomor pintu di dalam rumah tersebut — satu perangkat menjalankan banyak program, dan setiap program mendengarkan port yang berbeda. Beberapa port sudah dipesan untuk layanan populer:
| Port | Layanan | Keterangan |
|---|---|---|
| 80 | HTTP | Halaman web tanpa enkripsi |
| 443 | HTTPS | Halaman web dengan enkripsi TLS |
| 22 | SSH | Akses terminal jarak jauh |
| 53 | DNS | Penerjemahan nama domain menjadi IP |
Alamat IP hadir dalam dua versi. IPv4 terdiri dari 32 bit dan ditulis sebagai empat kelompok angka seperti 192.168.1.10, sedangkan IPv6 terdiri dari 128 bit dan ditulis dengan notasi heksadesimal seperti 2001:db8::7. Module ipaddress pada standard library memungkinkan kita memeriksa kedua versi tersebut:
import ipaddress
alamat = ipaddress.ip_address("192.168.1.10")
print(alamat, "adalah IPv", alamat.version)
loopback = ipaddress.ip_address("127.0.0.1")
print("127.0.0.1 loopback:", loopback.is_loopback)
alamat_v6 = ipaddress.ip_address("2001:db8::7")
print(alamat_v6, "adalah IPv", alamat_v6.version)Output yang Dihasilkan:
192.168.1.10 adalah IPv 4
127.0.0.1 loopback: True
2001:db8::7 adalah IPv 6Mari kita telaah baris-baris kode di atas:
- Baris 1 (
import ipaddress): Interpreter memuat moduleipaddressdari standard library, tanpa instalasi tambahan. - Baris 3 (
alamat = ...): Functionip_address()memvalidasi string"192.168.1.10", lalu mengembalikan objectIPv4Addresskarena pola string tersebut cocok dengan format IPv4. - Baris 6-7: Attribute
.versionbernilai4atau6sesuai jenis alamat, sedangkan.is_loopbackbernilaiTrueuntuk alamat yang tidak pernah meninggalkan mesin sendiri. - Baris 9: Notasi
2001:db8::7adalah bentuk ringkas IPv6; dua tanda titik dua berarti “isi sisanya dengan nol”.
Alamat 127.0.0.1 dikenal sebagai alamat loopback. Nama localhost adalah alias untuk alamat tersebut, sehingga program dapat berbicara dengan dirinya sendiri tanpa menyentuh jaringan luar.
DNS, Penerjemah Nama Menjadi Alamat #
Manusia menghafal example.com, bukan 93.184.216.34. DNS (Domain Name System) adalah sistem yang menerjemahkan nama domain menjadi alamat IP sebelum koneksi dibuat. Function socket.gethostbyname() memperlihatkan proses tersebut:
import socket
nama = "localhost"
ip = socket.gethostbyname(nama)
print(f"Alamat IP untuk {nama}: {ip}")Output yang Dihasilkan:
Alamat IP untuk localhost: 127.0.0.1Interpreter bertanya ke resolver DNS milik sistem operasi, lalu mendapat jawaban bahwa localhost beralamat 127.0.0.1. Untuk domain publik, jawaban dapat berbeda-beda bergantung DNS server dan lokasi kita — itulah sebabnya latihan pada Section ini memakai localhost yang hasilnya selalu stabil.
Bagaimana jika tidak ada program yang mendengarkan pada sebuah port? Sistem operasi langsung menolak koneksi:
import socket
try:
koneksi = socket.create_connection(("127.0.0.1", 59999), timeout=1)
koneksi.close()
except ConnectionRefusedError as err:
print("Koneksi ditolak:", err)Output yang Dihasilkan:
Koneksi ditolak: [Errno 111] Connection refusedTCP dan UDP, Dua Jalur Pengiriman #
Setelah alamat dan port diketahui, data harus dikirim melalui salah satu protokol transport. TCP dan UDP menawarkan filosofi yang berbeda:
| Aspek | TCP | UDP |
|---|---|---|
| Cara mulai | Handshake tiga arah sebelum kirim data | Kirim langsung tanpa perkenalan |
| Urutan data | Dijamin sampai berurutan | Tidak dijamin |
| Keandalan | Paket yang hilang dikirim ulang otomatis | Tidak ada pengiriman ulang |
| Overhead | Lebih besar | Sangat kecil |
| Contoh pemakaian | HTTP, SSH, transfer file | Streaming video, query DNS, game online |
Analogi sederhananya: TCP seperti menelepon — kedua pihak saling menyapa dulu, saling memastikan pesan sampai, lalu menutup dengan sopan. UDP seperti mengirim surat massal — cepat dan murah, tetapi tanpa jaminan tiba.
Model Klien-Server #
Hampir semua komunikasi jaringan kita berbentuk klien-server: satu pihak mendengarkan (server), pihak lain menyapa (klien). Alur lengkapnya terlihat pada diagram berikut:
Klien mengirim request ke alamat dan port server, server memproses, lalu mengirim response kembali. Ketika kita memanggil requests.get() pada chapter-chapter berikutnya, di balik layar terjadi pekerjaan berlapis: protokol aplikasi (HTTP) menyusun pesan, TCP memotong dan menomori potongan data, dan IP menulis alamat tujuan pada setiap potongan agar router tahu ke mana meneruskannya. Memahami pembagian lapisan ini membuat pesan error seperti “Connection refused” atau “Read timed out” mudah dibaca — pesan tersebut menunjuk lapisan mana yang gagal, bukan sekadar kalimat misterius.