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:

PortLayananKeterangan
80HTTPHalaman web tanpa enkripsi
443HTTPSHalaman web dengan enkripsi TLS
22SSHAkses terminal jarak jauh
53DNSPenerjemahan 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:

python
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:

text
192.168.1.10 adalah IPv 4
127.0.0.1 loopback: True
2001:db8::7 adalah IPv 6

Mari kita telaah baris-baris kode di atas:

  1. Baris 1 (import ipaddress): Interpreter memuat module ipaddress dari standard library, tanpa instalasi tambahan.
  2. Baris 3 (alamat = ...): Function ip_address() memvalidasi string "192.168.1.10", lalu mengembalikan object IPv4Address karena pola string tersebut cocok dengan format IPv4.
  3. Baris 6-7: Attribute .version bernilai 4 atau 6 sesuai jenis alamat, sedangkan .is_loopback bernilai True untuk alamat yang tidak pernah meninggalkan mesin sendiri.
  4. Baris 9: Notasi 2001:db8::7 adalah 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:

python
import socket

nama = "localhost"
ip = socket.gethostbyname(nama)
print(f"Alamat IP untuk {nama}: {ip}")

Output yang Dihasilkan:

text
Alamat IP untuk localhost: 127.0.0.1

Interpreter 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:

python
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:

text
Koneksi ditolak: [Errno 111] Connection refused

TCP 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:

AspekTCPUDP
Cara mulaiHandshake tiga arah sebelum kirim dataKirim langsung tanpa perkenalan
Urutan dataDijamin sampai berurutanTidak dijamin
KeandalanPaket yang hilang dikirim ulang otomatisTidak ada pengiriman ulang
OverheadLebih besarSangat kecil
Contoh pemakaianHTTP, SSH, transfer fileStreaming 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.