Soket mentah TCP/IP

Soket mentah adalah jenis soket yang memungkinkan akses ke penyedia transportasi yang mendasar. Topik ini hanya berfokus pada soket mentah dan protokol IPv4 dan IPv6. Ini karena sebagian besar protokol lain dengan pengecualian ATM tidak mendukung soket mentah. Untuk menggunakan soket mentah, aplikasi harus memiliki informasi terperinci tentang protokol dasar yang digunakan.

Penyedia layanan Winsock untuk protokol IP dapat mendukung jenis soket SOCK_RAW. Penyedia Windows Sockets 2 untuk TCP/IP yang disertakan pada Windows mendukung jenis soket SOCK_RAW ini.

Ada dua jenis dasar soket mentah tersebut:

  • Jenis pertama menggunakan jenis protokol yang diketahui yang ditulis di header IP yang dikenali oleh penyedia layanan Winsock. Contoh jenis soket pertama adalah soket untuk protokol ICMP (jenis protokol IP = 1) atau protokol ICMPv6 (jenis procotol IP = 58).
  • Jenis kedua memungkinkan jenis protokol apa pun ditentukan. Contoh jenis kedua adalah protokol eksperimental yang tidak didukung langsung oleh penyedia layanan Winsock seperti Protokol Transmisi Kontrol Aliran (SCTP).

Menentukan apakah Soket Mentah Didukung

Jika penyedia layanan Winsock mendukung soket SOCK_RAW untuk keluarga alamat AF_INET atau AF_INET6, jenis soket SOCK_RAW harus disertakan dalam struktur WSAPROTOCOL_INFO yang dikembalikan oleh fungsi WSAEnumProtocols untuk satu atau beberapa penyedia transportasi yang tersedia.

Anggota iAddressFamily dalam struktur WSAPROTOCOL_INFO harus menentukan AF_INET atau AF_INET6 dan anggota iSocketType dari struktur WSAPROTOCOL_INFO harus menentukan SOCK_RAW untuk salah satu penyedia transportasi.

Anggota iProtocol dari struktur WSAPROTOCOL_INFO dapat diatur ke IPROTO_IP. Anggota iProtocol dari struktur WSAPROTOCOL_INFO juga dapat diatur ke nol jika penyedia layanan memungkinkan aplikasi untuk menggunakan jenis soket SOCK_RAW untuk protokol jaringan lain selain Protokol Internet untuk keluarga alamat.

Anggota lain dalam struktur WSAPROTOCOL_INFO menunjukkan properti lain dari dukungan protokol untuk SOCK_RAW dan menunjukkan bagaimana soket SOCK_RAW harus diperlakukan. Anggota lain dari WSAPROTOCOL_INFO untuk SOCK_RAW ini biasanya menentukan bahwa protokol tanpa koneksi, berorientasi pesan, mendukung siaran/multicast (XP1_CONNECTIONLESS, XP1_MESSAGE_ORIENTED, XP1_SUPPORT_BROADCAST, dan bit XP1_SUPPORT_MULTIPOINT diatur dalam anggota dwServiceFlags1), dan dapat memiliki ukuran pesan maksimum 65.467 byte.

Pada Windows XP dan yang lebih baru, perintah NetSh.exe dapat digunakan untuk menentukan apakah soket mentah didukung. Perintah berikut yang dijalankan dari jendela CMD akan menampilkan data dari katalog Winsock di konsol:

netsh winsock show catalog

Output akan mencakup daftar yang berisi beberapa data dari struktur WSAPROTOCOL_INFO yang didukung di komputer lokal. Cari istilah RAW/IP atau RAW/IPv6 di bidang Deskripsi untuk menemukan protokol yang mendukung soket mentah.

Membuat Soket Mentah

Untuk membuat soket jenis SOCK_RAW, panggil fungsi soket atau WSASocket dengan parameter af (keluarga alamat) yang diatur ke AF_INET atau AF_INET6, parameter jenis diatur ke SOCK_RAW, dan parameter protokol diatur ke nomor protokol yang diperlukan. Parameter protokol menjadi nilai protokol di header IP (SCTP adalah 132, misalnya).

Catatan

Aplikasi mungkin tidak menentukan nol (0) sebagai parameter protokol untuk fungsi soket, WSASocket, dan WSPSocket jika parameter jenis diatur ke SOCK_RAW.

 

Soket mentah menawarkan kemampuan untuk memanipulasi transportasi yang mendasar, sehingga dapat digunakan untuk tujuan berbahaya yang menimbulkan ancaman keamanan. Oleh karena itu, hanya anggota grup Administrator yang dapat membuat soket jenis SOCK_RAW pada Windows 2000 dan yang lebih baru.

Operasi Kirim dan Terima

Setelah aplikasi membuat soket jenis SOCK_RAW, soket ini dapat digunakan untuk mengirim dan menerima data. Semua paket yang dikirim atau diterima pada soket jenis SOCK_RAW diperlakukan sebagai datagram pada soket yang tidak terhubung.

Aturan berikut berlaku untuk operasi melalui soket SOCK_RAW :

  • Fungsi sendto atau WSASendTo biasanya digunakan untuk mengirim data pada soket jenis SOCK_RAW. Alamat tujuan dapat berupa alamat yang valid dalam keluarga alamat soket, termasuk alamat siaran atau multicast. Untuk mengirim ke alamat siaran, aplikasi harus menggunakan setsockopt dengan SO_BROADCAST diaktifkan. Jika tidak, sendto atau WSASendTo akan gagal dengan kode kesalahan WSAEACCES. Untuk IP, aplikasi dapat mengirim ke alamat multicast apa pun (tanpa menjadi anggota grup).

  • Saat mengirim data IPv4, aplikasi memiliki pilihan tentang apakah akan menentukan header IPv4 di bagian depan datagram keluar untuk paket. Jika opsi soket IP_HDRINCL diatur ke true untuk soket IPv4 (keluarga alamat AF_INET), aplikasi harus menyediakan header IPv4 dalam data keluar untuk operasi pengiriman. Jika opsi soket ini salah (pengaturan default), maka header IPv4 tidak boleh disertakan data keluar untuk operasi pengiriman.

  • Saat mengirim data IPv6, aplikasi memiliki pilihan tentang apakah akan menentukan header IPv6 di bagian depan datagram keluar untuk paket. Jika opsi soket IPV6_HDRINCL diatur ke true untuk soket IPv6 (keluarga alamat AF_INET6), aplikasi harus menyediakan header IPv6 dalam data keluar untuk operasi pengiriman. Pengaturan default untuk opsi ini adalah false. Jika opsi soket ini salah (pengaturan default), maka header IPv6 tidak boleh disertakan dalam data keluar untuk operasi pengiriman. Untuk IPv6, seharusnya tidak perlu menyertakan header IPv6. Jika informasi tersedia menggunakan fungsi soket, header IPv6 tidak boleh disertakan untuk menghindari masalah kompatibilitas di masa mendatang. Masalah ini dibahas dalam RFC 3542 yang diterbitkan oleh IETF. Menggunakan opsi soket IPV6_HDRINCL tidak disarankan dan mungkin tidak digunakan lagi di masa mendatang.

  • Fungsi recvfrom atau WSARecvFrom biasanya digunakan untuk menerima data pada soket jenis SOCK_RAW. Kedua fungsi ini memiliki opsi untuk mengembalikan alamat IP sumber tempat paket dikirim. Data yang diterima adalah datagram dari soket yang tidak terhubung.

  • Untuk IPv4 (keluarga alamat AF_INET), aplikasi menerima header IP di bagian depan setiap datagram yang diterima terlepas dari opsi soket IP_HDRINCL .

  • Untuk IPv6 (keluarga alamat AF_INET6), aplikasi menerima semuanya setelah header IPv6 terakhir di setiap datagram yang diterima terlepas dari opsi soket IPV6_HDRINCL . Aplikasi tidak menerima header IPv6 menggunakan soket mentah.

  • Datagram yang diterima disalin ke semua soket SOCK_RAW yang memenuhi kondisi berikut:

    • Nomor protokol yang ditentukan dalam parameter protokol ketika soket dibuat harus cocok dengan nomor protokol di header IP dari datagram yang diterima.
    • Jika alamat IP lokal ditentukan untuk soket, alamat tersebut harus sesuai dengan alamat tujuan seperti yang ditentukan di header IP dari datagram yang diterima. Aplikasi dapat menentukan alamat IP lokal dengan memanggil fungsi ikatan . Jika tidak ada alamat IP lokal yang ditentukan untuk soket, datagram disalin ke dalam soket terlepas dari alamat IP tujuan di header IP dari datagram yang diterima.
    • Jika alamat asing ditentukan untuk soket, alamat tersebut harus sesuai dengan alamat sumber seperti yang ditentukan di header IP dari datagram yang diterima. Aplikasi dapat menentukan alamat IP asing dengan memanggil fungsi sambungkan atau WSAConnect . Jika tidak ada alamat IP asing yang ditentukan untuk soket, datagram disalin ke dalam soket terlepas dari alamat IP sumber di header IP dari datagram yang diterima.

Penting untuk dipahami bahwa beberapa soket jenis SOCK_RAW mungkin menerima banyak datagram yang tidak terduga. Misalnya, program PING dapat membuat soket jenis SOCK_RAW untuk mengirim permintaan gema ICMP dan menerima respons. Meskipun aplikasi mengharapkan respons gema ICMP, semua pesan ICMP lainnya (seperti ICMP HOST_UNREACHABLE) juga dapat dikirimkan ke aplikasi ini. Selain itu, jika beberapa soket SOCK_RAW terbuka di komputer pada saat yang sama, datagram yang sama dapat dikirimkan ke semua soket terbuka. Aplikasi harus memiliki mekanisme untuk mengenali datagram yang menarik dan mengabaikan semua yang lain. Untuk program PING, mekanisme tersebut mungkin termasuk memeriksa header IP yang diterima untuk pengidentifikasi unik di header ICMP (ID proses aplikasi, misalnya).

Catatan

Untuk menggunakan soket jenis SOCK_RAW memerlukan hak istimewa admin. Pengguna yang menjalankan aplikasi Winsock yang menggunakan soket mentah harus menjadi anggota grup Administrator di komputer lokal, jika tidak, panggilan soket mentah akan gagal dengan kode kesalahan WSAEACCES. Pada Windows Vista dan yang lebih baru, akses untuk soket mentah diberlakukan pada pembuatan soket. Di versi Windows yang lebih lama, akses untuk soket mentah diberlakukan selama operasi soket lainnya.

 

Penggunaan Umum Soket Mentah

Salah satu penggunaan umum soket mentah adalah pemecahan masalah aplikasi yang perlu memeriksa paket IP dan header secara rinci. Misalnya, soket mentah dapat digunakan dengan SIO_RCVALL IOCTL untuk memungkinkan soket menerima semua paket IPv4 atau IPv6 yang melewati antarmuka jaringan. Untuk informasi selengkapnya, lihat referensi SIO_RCVALL .

Batasan pada Soket Mentah

Pada Windows 7, Windows Vista, Windows XP dengan Paket Layanan 2 (SP2), dan Windows XP dengan Paket Layanan 3 (SP3), kemampuan untuk mengirim lalu lintas melalui soket mentah telah dibatasi dalam beberapa cara:

  • Data TCP tidak dapat dikirim melalui soket mentah.

  • Datagram UDP dengan alamat sumber yang tidak valid tidak dapat dikirim melalui soket mentah. Alamat sumber IP untuk datagram UDP keluar harus ada di antarmuka jaringan atau datagram dihilangkan. Perubahan ini dilakukan untuk membatasi kemampuan kode berbahaya untuk membuat serangan penolakan layanan terdistribusi dan membatasi kemampuan untuk mengirim paket spoofed (paket TCP/IP dengan alamat IP sumber yang ditempa).

  • Panggilan ke fungsi ikat dengan soket mentah untuk protokol IPPROTO_TCP tidak diizinkan.

    Catatan

    Fungsi ikatan dengan soket mentah diizinkan untuk protokol lain (misalnya IPPROTO_IP, IPPROTO_UDP, atau IPPROTO_SCTP).

     

Pembatasan di atas ini tidak berlaku untuk Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, atau ke versi sistem operasi yang lebih lama dari Windows XP dengan SP2.

Catatan

Implementasi TCP/IP Microsoft pada Windows mampu membuka soket UDP atau TCP mentah berdasarkan pembatasan di atas. Penyedia Winsock lainnya mungkin tidak mendukung penggunaan soket mentah.

 

Ada batasan lebih lanjut untuk aplikasi yang menggunakan soket jenis SOCK_RAW. Misalnya, semua aplikasi yang mendengarkan protokol tertentu akan menerima semua paket yang diterima untuk protokol ini. Ini mungkin bukan yang diinginkan untuk beberapa aplikasi menggunakan protokol. Ini juga tidak cocok untuk aplikasi berkinerja tinggi. Untuk mengatasi masalah ini, mungkin diperlukan untuk menulis driver protokol jaringan Windows (driver perangkat) untuk protokol jaringan tertentu. Pada Windows Vista dan yang lebih baru, Winsock Kernel (WSK), mode kernel independen transportasi baru Antarmuka Pemrograman Jaringan dapat digunakan untuk menulis driver protokol jaringan. Pada Windows Server 2003 dan yang lebih lama, penyedia Antarmuka Driver Transportasi (TDI) dan DLL pembantu Winsock dapat ditulis untuk mendukung protokol jaringan. Protokol jaringan kemudian akan ditambahkan ke katalog Winsock sebagai protokol yang didukung. Ini memungkinkan beberapa aplikasi untuk membuka soket untuk protokol khusus ini dan driver perangkat dapat melacak soket mana yang menerima paket dan kesalahan tertentu. Untuk informasi tentang menulis penyedia protokol jaringan, lihat bagian tentang WSK dan TDI di Windows Driver Kit (WDK).

Aplikasi juga perlu menyadari dampak yang mungkin terjadi pada pengaturan firewall pada pengiriman dan penerimaan paket menggunakan soket mentah.