Kadang-kadang dalam melakukan penyelesaian masalah (troubleshooting) sebuah service, kita perlu mengetes langsung dengan berkomunikasi dengan server, tanpa bantuan program klien, untuk mengetahui pesan kesalahan persis dari server. Contohnya, jika gagal mengambil email via POP atau mengirim email via SMTP, banyak program klien email termasuk Mozilla Thunderbird tidak melaporkan pesan kesalahan yang cukup detil. Malah kadang-kadang program klien tertentu, atas nama “user friendliness”, hanya melaporkan pesan kesalahan standar seperti ini: “Telah terjadi sebuah kesalahan. Silakan coba beberapa saat lagi, atau hubungi admin Anda.” Kesalahan seperti apa? Di mana? Penyebabnya apa? Bagaimana cara saya bisa memperbaikinya selain mencoba lagi atau menghubungi admin? Sebab, sayalah adminnya!

Untunglah, protokol-protokol internet sebagian besar sifatnya teks dan terdokumentasi dengan baik lewat dokumen-dokumen bernama RFC. Untuk berkomunikasi langsung dengan sebuah service internet, seringkali kita hanya membutuhkan program telnet saja dan langsung mengetikkan dengan tangan perintah-perintah dalam bahasa protokol yang sesuai.

Artikel ini menjelaskan beberapa protokol popular disertai cara pemakaian umumnya.

Menggunakan program telnet

Program telnet digunakan untuk konek ke sebuah mesin/server tertentu dan ke port tertentu lalu kita dapat mengirimkan perintah dengan mengetikkan langsung, dan kita juga akan mendapatkan respon output dari si server. Dengan kata lain, kita berinteraksi langsung dengan sebuah server. Setelah konek, kita lalu perlu “berbahasa” protokol yang sesuai dengan aplikasi server yang kita hubungi. Misalnya jika kita menghubungi port 80, maka kemungkinan besar kita harus berbicara protokol HTTP. Jika ke port 25, maka protokol SMTP, dst.

Catatan: Jangan dibingungkan antara protokol internet yang disebutkan di artikel ini dengan “protokol telnet” (port 23) yaitu yang digunakan untuk login ke shell sebuah mesin. Protokol ini telah amat tua dan ditinggalkan karena tidak aman, dan kini biasanya diganti dengan protokol SSH (port 22).

Program telnet sendiri adalah program generik untuk konek port mana saja dan host mana saja.

Di Unix/Linux, untuk menjalankan telnet:

$ telnet HOSTNAME_ATAU_IP PORT

Contoh:

$ telnet example.com 80

Untuk keluar dari sesi telnet, tekan tombol Ctrl-] (tahan Control setelah itu tekan tombol berlabel kurung siku tutup), lalu tekan Enter. Anda akan kembali ke prompt telnet. Tekan Ctrl-D atau ketik quit diikuti Enter.

Di Windows juga tersedia program telnet. Anda dapat menjalankannya dari Start Menu > Run… lalu ketik telnet diikuti Enter. Atau bukalah terlebih dahulu Command Prompt, lalu ketik telnet diikuti Enter.

Defaultnya localecho di program telnet Windows dimatikan, jadi jika kita mengetik perintah ke sebuah server maka kita sendiri tidak melihat apa yang kita ketikkan. Maka kita harus menyalakannya dulu agar bisa lebih mudah bekerja.

Setelah mengetik telnet, ketikkan:

set localecho

Barulah konek ke server yang diinginkan dengan perintah o, misalnya (perhatikan urutan: huruf “o” kecil, spasi, hostname, spasi, port):

o example.com 80

Sama seperti di Unix/Linux, untuk keluar dari sesi telnet, tekan tombol Ctrl-] (tahan Control setelah itu tekan tombol berlabel kurung siku tutup), lalu tekan Enter. Anda akan kembali ke prompt telnet. Tekan Ctrl-Z atau ketik quit diikuti Enter.

Troubleshooting program telnet

Jika Anda menerima pesan kesalahan “Connection refused”, artinya di server tidak ada daemon/program/service yang listen di port tersebut. Atau bisa juga karena firewall di sisi Anda atau di sisi server.

Jika saat ingin konek, hasilnya diam saja atau timeout, bisa jadi karena koneksi Anda lambat atau ada firewall di sisi Anda/server.

Berbicara dengan web server

Oke, setelah mulai familiar dengan program telnet, mari kita mencoba berbicara dengan service paling popular di seantero jagad internet, yaitu web, yang menggunakan protokol HTTP (Hyper Text Transfer Protocol). Untuk berbicara langsung dengan server HTTP, kita dapat menggunakan program telnet dan konek ke port HTTP (defaultnya 80, tapi dapat berbeda).

Sekilas protokol HTTP. Klien mengirimkan HTTP request berupa: 1 baris request, diikusi dengan nol atau lebih baris header, diakhiri dengan baris kosong (dan dapat diikuti informasi tambahan). Server akan mengirimkan HTTP response berupa 1 baris respon, diikuti nol atau lebih baris header, diikuti bodi respon.

Sintaks baris request:

METODE URI PROTOKOL

METODE misalnya GET, HEAD, POST, dll. URI misalnya “/” (untuk meminta halaman utama), “/path/file.html?id=123”, dll. PROTOKOL dapat berupa HTTP/1.0 atau HTTP/1.1.

Contoh baris request:

GET / HTTP/1.0

Contoh lain:

HEAD / HTTP/1.0

Sintaks header:

NAMA_HEADER: NILAI_HEADER

Contoh:

User-Agent: Mozilla/1.0

Contoh lain:

Pragma: no-cache

Sintaks baris respon:

PROTOKOL KODE_RESPON KETERANGAN

PROTOKOL adalah HTTP/1.0 atau HTTP/1.1. KODE_RESPON adalah angka 3 digit, 2xx artinya berhasil, 3xx artinya redirection, 4xx artinya ada kesalahan di sisi klien, 5xx artinya ada kesalahan di sisi server. Kode-kode umum adalah 200 (OK), 302, 303, 401, 403 (Forbidden), 404 (Not Found), 500 (Internal server error). Kode lengkap dapat dilihat di RFC.

Contoh:

HTTP/1.0 200 OK

Contoh lain:

HTTP/1.1 404 Not Found

Berikut ini contoh lengkap sebuah sesi HTTP. Yang dicetak tebal adalah yang kita ketikkan.

Meminta halaman http://www.yahoo.com/:

$ telnet www.yahoo.com 80
Trying www.yahoo.com...
Connected to www.yahoo.com.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.0 200 OK
Date: Fri, 16 Mar 2007 04:24:16 GMT
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR 
CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi 
NRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE
GOV"
Content-Type: text/html
X-Cache: MISS from server.localdomain
Connection: close

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML...

Tip: Untuk mengintip trafik HTTP, Anda bisa pula menggunakan fitur di browser seperti misalnya menggunakan plugin HTTPWatch di Internet Explorer, atau add-on seperti Firebug di Firefox. Di wget ada opsi -S (“server response”) untuk melihat header yang dikembalikan server. Di curl ada opsi -D (“dump headers”).

Spesifikasi protokol HTTP ada di RFC 2616.

Berbicara dengan mail server POP

Protokol POP3 (Post Office Protocol version 3) adalah protokol untuk mengambil email dari server. Untuk berbicara langsung dengan server POP3, kita dapat menggunakan program telnet dan konek ke port POP3 (defaultnya 110, tapi dapat berbeda).

Sekilas protokol POP3. Pertama Anda login dengan memasukkan username dan password:

USER username
PASS pass

Lalu Anda dapat mendaftar jumlah mail yang ada di mailbox dengan perintah LIST:

LIST

Outputnya adalah daftar nomor urut dan ID message.

Untuk mengambil sebuah email digunakan perintah RETR (“retrieve”):

RETR nomor_urut_message

Untuk menghapus dapat digunakan perintah DELE (“delete”):

DELE nomor_urut_message

Daftar perintah selengkapnya dapat dilihat di RFC.

Berikut ini sebuah contoh sesi POP3. Yang dicetak tebal adalah yang kita ketikkan.

Login yang berhasil:

$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
USER steven@steven.builder.localdomain
+OK Password required.
PASS xxx
+OK logged in.

Login yang gagal:

USER steven@steven.builder.localdomain
+OK Password required.
PASS xxxxx
-ERR Login failed.

Melihat email yang ada di mailbox:

LIST
+OK POP3 clients that break here, they violate STD53.
1 3273
2 14047
.

Mengambil sebuah email:

RETR 1
+OK 3273 octets follow.
Delivered-To: xxxxxxxxxxxxxxxxxxxxxx
Received: (qmail 20932 invoked from network); 16 Mar 2007 02:27:18 -0000
Received: from unknown (HELO xxxxxxxxxxx ...
...(dst)...
.

Menghapus sebuah message:

DELE 1
+OK Deleted.

Keluar:

QUIT
+OK Bye-bye.
Connection closed by foreign host.

Spesifikasi protokol POP3 ada di RFC 1989.

Berbicara dengan mail server SMTP

Protokol SMTP (Simple Mail Transfer Protocol) digunakan untuk mengirim email. Untuk berbicara langsung dengan server SMTP, kita dapat menggunakan program telnet dan konek ke port SMTP (defaultnya 25, tapi dapat berbeda). Ada juga port 587 (submission) yang juga digunakan untuk mengirim email.

Catatan: jika ingin mengirim email untuk domain katakanlah yahoo.com, terlebih dahulu kita harus mencari tahu MX record untuk yahoo.com tersebut, misalnya:

$ host -t mx yahoo.com
yahoo.com mail is handled by 1 d.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 e.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 f.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 g.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 a.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 b.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 c.mx.mail.yahoo.com.

Maka kita dapat mencoba menghubungi salah satu MX mis:

$ telnet d.mx.mail.yahoo.com 25

Kita tidak menghubungi langsung yahoo.com di port 25 karena belum tentu MX untuk domain yahoo.com itu ada di mesin yang sama dengan yahoo.com.

Sekilas protokol SMTP. Setelah konek, server akan memberikan baris banner (welcome message). Klien mengirimkan baris perintah. Server mengirimkan baris respon berupa kode hasil 3 digit diikuti keterangan. Kode 2xx artinya berhasil, kode 4xx artinya terjadi kesalahan temporer dan klien dipersilakan mencoba lagi beberapa saat mendatang, kode 5xx artinya terjadi kesalahan permanen.

Contoh, kita ingin mengirim email ke steven@serverku.com. Pertama kita mencari tahu MX untuk domain ini:

$ host -t mx serverku.com
serverku.com mail is handled by 10 mail.serverku.com.
$ telnet mail.serverku.com 25
Trying 203.130.198.32...
Connected to mail.serverku.com.
Escape character is '^]'.
220 serverku.com ESMTP ready (Spanel-SMTPD 0.4.5-sp1.3)

Lalu kita sebutkan siapa pengirimnya:

MAIL FROM:<pengirim@domain.com>
250 OK(250)

Jika tidak ingin menyebutkan pengirimnya (Return-Path kosong), kita bisa menuliskan:

MAIL FROM:<>

Lalu kita sebutkan penerimanya:

RCPT TO:<steven@serverku.com>
250 OK(250)

Baris RCPT ini dapat diulang untuk penerima-penerima yang lainnya jika ada, mis kita ingin mengirim email ini ke 3 orang lainnya di domain yang sama:

RCPT TO:<user2@serverku.com>
RCPT TO:<user2@serverku.com>
...

Catatan: jika domainnya berbeda, misalnya budi@yahoo.com, maka tentu kita harus menghubungi MX yahoo.com dan bukan di serverku.com.

Lalu kirimkanlah bodi emailnya. Akhiri dengan sebuah baris berisi titik:

DATA
354 GO_AHEAD(354)
Subject: test

Ini hanya sebuah tes, harap abaikan
.
250 QUEUED(250) - e5326248c623f66e8105345a3e3135dd

Untuk keluar:

QUIT
221 BYE(221)
Connection closed by foreign host.

Contoh lengkap sebuah sesi SMTP, mengirim email dan sukses:

$ telnet serverku.com 25
Trying 203.130.198.32...
Connected to serverku.com.
Escape character is '^]'.
220 serverku.com ESMTP ready (Spanel-SMTPD 0.4.5-sp1.3)
MAIL FROM:<pengirim@domain.com>
250 OK(250)
RCPT TO:<steven@serverku.com>
250 OK(250)
DATA
354 GO_AHEAD(354)
Subject: test

Ini hanya sebuah tes, harap abaikan
.
250 QUEUED(250) - fd641de480641ec3c3fb0eae5d2deedd
QUIT
221 BYE(221)
Connection closed by foreign host.

Contoh mengirim email yang ditolak karena user tidak dikenali:

RCPT TO:<xxx@serverku.com>
550 ERR_UNKNOWN_USER(550) - I couldn't find that mail user here

Otentikasi. Kadang untuk mengirim secara relay (mengirim ke domain lain), sebuah server membutuhkan otentikasi. Protokol otentikasi adalah sbb:

AUTH LOGIN
server akan merespon minta username
ketikkan-username-yang-diencode-menggunakan-base64
server akan merespon minta password
ketikkan-password-yang-diencode-menggunakan-base64
server akan memberitahu auth kita benar atau salah

Untuk mengencode base64, dapat digunakan skrip berikut:

$ perl -MMIME::Base64 -e'print encode_base64("1234")'
MTIzNA==
Artinya '1234' jika diencode akan menjadi 'MTIzNA=='.

Contoh SMTP authentication: (misalnya usernamenya adalah ‘steven@serverku.com’ dan passwordnya adalah ‘1234’, yang jika diencode akan menjadi ‘c3RldmVuQHNlcnZlcmt1LmNvbQ==’ dan ‘MTIzNA==’.

$ telnet serverku.com 25
Trying 203.130.198.32...
Connected to serverku.com.
Escape character is '^]'.
220 serverku.com ESMTP ready (Spanel-SMTPD 0.4.5-sp1.3)
AUTH LOGIN
334 VXNlcm5hbWU6
c3RldmVuQHNlcnZlcmt1LmNvbQ==
334 UGFzc3dvcmQ6
MTIzNA==

Spesifikasi SMTP ada di RFC 2821.

Berbicara dengan server mail IMAP

Protokol IMAP (Internet Message Access Protocol) digunakan untuk mengakses dan memanipulasi pesan dan mailbox mail di server. Untuk berbicara langsung dengan server IMAP, kita dapat menggunakan program telnet dan konek ke port IMAP (defaultnya 143, tapi dapat berbeda).

Sekilas protokol IMAP. Setiap baris request dari klien perlu diprefiks (diawali) dengan sebuah string penanda. Pada contoh-contoh di artikel ini digunakan a001.

Login:

$ telnet mail.host.com 143
Trying 1.2.3.4...
Connected to mail.host.com
Escape character is '^]'.
* OK [CAPABILITY IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS AUTH=LOGIN] mail.host.com IMAP4rev1 2004.350 at Fri, 16 Mar 2007 13:51:21 -0500 (CDT)
a01 LOGIN someuser somepass
RESPONSE: a001 OK User logged in

Mengetahui capability IMAP service:

a001 CAPABILITY
* CAPABILITY IMAP4REV1 LITERAL+ IDLE NAMESPACE MAILBOX-REFERRALS BINARY UNSELECT SCAN SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND SASL-IR LOGIN-REFERRALS AUTH=LOGIN
a001 OK CAPABILITY completed

Logout:

a001 LOGOUT
* BYE mail.host.com IMAP4rev1 server terminating connection
a002 OK LOGOUT completed
Connection closed by foreign host.

Melihat daftar mailbox yang ada (pada contoh, semua anak Inbox):

a001 LIST "Inbox" "*"
* LIST (\HasNoChildren) "." "INBOX.omail.log.old"
* LIST (\HasChildren) "." "INBOX.omail.log"
* LIST (\HasNoChildren) "." "INBOX.Trash"
* LIST (\HasNoChildren) "." "INBOX.Spam"
* LIST (\HasNoChildren) "." "INBOX.Sent"
* LIST (\HasNoChildren) "." "INBOX.Drafts"
* LIST (\Noselect \HasChildren) "." "INBOX.omail"
a001 OK LIST completed

Men-select sebuah mailbox (pada contoh, bernama INBOX):

a001 SELECT INBOX
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)]
* 1242 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1062186210]
* OK [UIDNEXT 1246]
a03 OK [READ-WRITE] Completed

Mendaftar semua message yang ada pada sebuah mailbox yang sedang di-select:

a001 FETCH 1:* FLAGS
* 1 FETCH (FLAGS (\Seen))
* 2 FETCH (FLAGS (\Seen))
* 3 FETCH (FLAGS (\Seen))
* 4 FETCH (FLAGS (\Seen))
* 5 FETCH (FLAGS (\Seen))
* 6 FETCH (FLAGS (\Seen \Answered))
...
a001 OK FETCH completed

Mengambil header-header sebuah message (pada contoh, urutan pertama dan mengambil full headers).

a001 FETCH 1 full
* 1 FETCH (FLAGS (\Seen) INTERNALDATE "15-Mar-2000 13:10:14 -0500" RFC822.SIZE 1
553 ENVELOPE ("Wed, 15 Mar 2007 13:10:11 -0600" "Perl Stuff" (("Rusty Nejdl" NIL
"rnejdl" "verio.net")) (("Rusty Nejdl" NIL "rnejdl" "verio.net")) (("Rusty Nejd
l" NIL "rnejdl" "verio.net")) ((NIL NIL "rnejdl" "verio.net")) ((NIL NIL "ttodd"
"verio.net")) NIL NIL "<20000315131011.A5381@tethys.ringofsaturn.com>") BODY ("
TEXT" "PLAIN" ("CHARSET" "us-ascii") NIL NIL "7BIT" 359 9))
a001 OK FETCH completed

Mengambil bodi message:

a001 FETCH 1 body

Set quota:

a001 SETQUOTA "" (STORAGE 512)

Get quota:

a001 GETQUOTA ""
* QUOTA "" (STORAGE 10 512)
a001 OK Getquota completed

Get quota root:

a001 GETQUOTAROOT "Inbox"