Common Internet File System

**CIFS** atau ***<u>C</u>ommon <u>I</u>nternet <u>F</u>ile <u>S</u>ystem*** merupakan sebuah implementasi dari protokol berbagi berkas/*file-sharing* ''Server Message Block'' (SMB) yang telah diusulkan agar menjadi standar Internet (statusnya saat ini masih menjadi *draft*), sehingga dapat diperoleh secara mudah. Perbedaan dari protokol SMB adalah bahwa protokol ini telah diperbaiki agar dapat digunakan melalui Internet. Protokol ini merupakan "saingan tidak langsung" dari protokol Network File System yang digunakan dalam keluarga sistem operasi UNIX. Protokol ini menggunakan arsitektur client/server. Microsoft telah memberikan draf rancangan protokol CIFS kepada Internet Engineering Task Force (IETF) untuk dijadikan standar Internet. Meskipun demikian, klien dan server CIFS telah ada dalam Windows 2000 ke atas.

## Selayang pandang
Protokol CIFS mengizinkan sekelompok pengguna agar dapat berkolaborasi dan berbagi berkas melalui Internet atau intranet perusahaan. CIFS, saat ini banyak diimplementasikan, sehingga dukungannya pun semakin banyak, meski pada awalnya protokol ini hanya dimiliki oleh sistem operasi IBM OS/2 dan Microsoft Windows saja. Dengan adanya beberapa implementasi dari protokol SMB dalam berbagai sistem operasi, CIFS pun dapat didukung oleh kebanyakan sistem operasi. Salah satu implementasi yang populer, selain yang terdapat dalam Microsoft Windows dan IBM OS/2 adalah SAMBA yang dapat digunakan dalam keluarga sistem operasi UNIX.

CIFS telah dilihat sebagai kemungkinan pengganti protokol ''File Transfer Protocol'' (FTP) dan ''Network File System'' (NFS) sebagai protokol berbagi berkas dan sistem manajemen berkasnya. CIFS mendukung penggunaan password yang terenkripsi, serta nama berkas dengan pengodean Unicode. Selain itu CIFS juga dapat digunakan untuk mengaitkan (mount) sebuah sistem berkas jarak jauh sebagai sebuah direktori atau drive dalam mesin lokal, seolah-olah sistem berkas jarak jauh tersebut merupakan sistem berkas lokal.

Keunggulan CIFS dibandingkan dengan protokol FTP dan HTTP sebagai protokol berbagi berkas adalah bahwa CIFS mendukung akses baca dan tulis terhadap sebuah berkas secara simultan; sementara HTTP dan FTP hanya mendukung transfer berkas sederhana saja.

Sementara, jika dibandingkan dengan protokol NFS, CIFS menawarkan beberapa keunggulan peningkatan performa dengan adanya fitur *read-ahead*, *write-behind* dan fitur *opportunistic locks*.

## Implementasi
Beberapa implementasi yang dilakukan dari standar CIFS adalah sebagai berikut:
* Microsoft Distributed File System (DFS) yang merupakan pengembangan pertama CIFS oleh Microsoft yang diterapkan dalam Windows 2000 Server dan Windows Server 2003.
* smbfs, yang dapat digunakan oleh sebagian besar distribusi UNIX dan GNU/Linux, dan bersifat *[[open-source]]*. Dapat diperoleh secara bebas di alamat http://www.samba.org.
* dan beberapa lainnya 

## Protokol lapisan transport yang digunakan
Meski pada awalnya protokol SMB dibuat menggunakan protokol NetBIOS sebagai protokol lapisan *transport*-nya, berjalan di atas stack protokol TCP/IP, IPX/SPX, atau NetBEUI secara opsional, sekarang protokol SMB mendukung secara penuh protokol-protokol lapisan transport tersebut. Sebuah klien CIFS yang hendak mengakses sebuah file server atau print server akan membuat sebuah koneksi dengan server (dengan menggunakan protokol yang kompatibel di antara dua buah host yang saling berkomunikasi tersebut). Selanjutnya, klien akan membuat sesi NetBIOS di atas sesi koneksi yang sebelumnya dibuat, sebelum akhirnya klien pun menggunakan sesi NetBIOS tersebut untuk membuat sesi *print-sharing* atau *file-sharing* dengan server. Jika protokol TCP/IP digunakan sebagai protokol lapisan transport-nya, klien CIFS akan membuat sesi NetBIOS over TCP/IP, dengan membuka port 139 yang terdapat pada sisi server.

Ketika Windows 2000 dirilis, yang di dalamnya terdapat komponen Distributed File System (DFS), dan berkurangnya dukungan Microsoft terhadap protokol NetBIOS, *file server* pun dapat secara langsung menyediakan layanan *file sharing* dan *print sharing*, tanpa menggunakan NetBIOS lagi. Klien dapat membuka koneksi langsung dengan server dengan membuat sesi koneksi TCP dengan menggunakan port 445.

## Operasi CIFS

Langkah-langkah yang terjadi dalam protokol CIFS dapat diringkas menjadi hal-hal seperti di bawah ini:
# Klien SMB/CIFS akan menentukan alamat IP dari server dan membuat koneksi dengan server SMB/CIFS dengan membuka port TCP 445 (koneksi langsung) atau port TCP 139 (jika protokol NetBIOS over TCP/IP digunakan) pada sisi server.
# Jika klien juga menggunakan protokol NetBIOS, maka sesi NetBIOS akan dibuat di atas koneksi TCP yang telah terjadi sebelumnya.
# Klien selanjutnya melakukan negosiasi mengenai dialek SMB yang hendak digunakan. Server akan memilih dialek yang dipahami oleh kedua belah pihak dan memberikan balasan kepada klien mengenai kemampuan server.
# Klien selanjutnya akan melakukan request terhadap sebuah sesi kepada server, dengan mengirimkan informasi keamanan (*password*, dan *user name*). Pertukaran informasi keamanan tersebut tergantung dari mekanisme yang digunakan oleh kedua belah pihak (bisa dengan enkripsi, atau tidak, contohnya adalah LMHash atau NTLM atau Kerberos). Jika sesi dapat dibuat, server akan meresponsnya dengan memberikan ***User Identifier*** (UID) kepada klien.
# Klien selanjutnya melakukan "*browsing*" terhadap direktori-direktori yang terdapat dalam server (dalam hal ini adalah direktori yang di-*share* oleh server) dengan menggunakan UID yang tadi diberikan. Setelah klien menentukan direktori mana yang hendak dibuka, maka server pun memberikan respons kepada klien dengan ***Tree Identifier*** (TID) yang berkaitan dengan direktori tersebut.
# Klien selanjutnya akan membuka berkas dalam direktori yang sebelumnya dibuka dengan menggunakan TID dan UID yang sebelumnya dimiliki oleh klien. Server meresponsnya dengan ***File Identifier*** (FID) untuk mengidentifikasikan berkas yang hendak dibuka oleh klien.
# Klien kemudian akan menggunakan UID, TID, dan FID untuk melakukan operasi (baca, tulis, modifikasi dan lain-lain) terhadap berkas yang bersangkutan.
# Ketika selesai, klien akan menutup berkas, menutup sesi koneksi dan terakhir menutup koneksi TCP yang akan menutup sesi file sharing dengan protokol SMB/CIFS. Jika protokol NetBIOS digunakan, menutup koneksi TCP juga akan menutup sesi NetBIOS.

Tabel berikut berisi beberapa dialek SMB/CIFS 

### Fitur ''Read-Ahead'' dan ''Write-Behind''

Untuk meningkatkan performanya, SMB dan CIFS mendukung fitur operasi *read-ahead* dan *write-behind*. Dengan menggunakan *read-ahead*, klien dapat memasukkan data yang telah dibaca ke dalam cache yang dimilikinya secara lokal, sehingga ia tidak akan meminta lagi kepada server ketika hendak melihat blok selanjutnya dari data yang ia kehendaki. Sementara *write-behind* mengizinkan klien untuk melakukan operasi penulisan (*write*) terhadap sebuah berkas dan dimasukkan ke dalam *cache* terlebih dahulu, sebelum di-*upload* ke server, yang lebih efisien jika dibandingkan dengan mengirimkan setiap operasi read dan write secara terpisah.

### Fitur ''Lock'' dan ''Unlock''

Berkas yang terdapat di dalam server juga dapat dikunci atau dibuka. Sebuah berkas yang tidak dikunci (*unlocked*) adalah berkas yang tidak ada klien yang diberikan hak akses eksklusif untuk melakukan pembacaan dan penulisan terhadapnya, sementara berkas yang dikunci (*locked*) adalah berkas yang terdapat klien yang diberikan hak akses eksklusif untuk melakukan pembacaan dan penulisan terhadapnya. CIFS mendukung penggunaan cache (*read-ahead* dan *write-behind*), baik terhadap berkas yang dikunci atau berkas yang tidak dikunci, karena berkas tersebut dianggap "aman" selama tidak ada klien yang sedang melakukan penulisan secara eksklusif terhadapnya. Jika klien mencoba untuk menulis ke sebuah berkas, maka ia harus memberikan data yang hendak ditulisi kepada server untuk selanjutnya ditulisi oleh server atau dapat meminta server untuk mengunci berkas tersebut. Cara kedua merupakan cara yang sering digunakan.

### ''Opportunistic Lock'' (''Oplock'')

Ketika klien sedang menulis ke dalam sebuah berkas dalam sebuah *CIFS server*, maka akan lebih efisien bagi klien untuk menyangga (*buffer*) data yang hendak ditulisi dan mengirimkannya sebagai sebuah *request* bertumpuk. Akan tetapi, hal ini dapat meningkatkan kemungkinan bahwa berkas yang sama juga dibaca oleh klien yang lain dan data juga mungkin ditulisi oleh klien tersebut. Untuk membantu klien meningkatkan efisiensi penyanggaan datanya, CIFS menawarkan fitur *opportunistic lock* terhadap berkas secara keseluruhan, atau sebagian dari berkas sehingga ia tidak dapat ditulisi secara simultan oleh klien lainnya.

CIFS memiliki tiga jenis oplock yang digunakan, yakni sebagai berikut:
* *Exclusive Oplock*
* *Level II Oplock*
* *Batch Oplock*
#### ''Exclusive Oplock''
Dalam *exclusive oplock*, sebuah klien (ambil contoh Klien A) meminta kepada *server* untuk mendapatkan akses secara eksklusif terhadap sebuah berkas, sehingga Klien A merupakan klien satu-satunya yang diizinkan untuk menulisi data ke dalam berkas tersebut. Ketika Klien A membuka berkas, ia akan meminta *exclusive oplock* dari server. Jika ada klien lainnya (ambil contoh Klien B) yang sedang membuka berkas yang bersangkutan, server akan menolak permintaan *exclusive oplock* dari Klien A. Ketika hal ini terjadi, Klien A tidak menyangga data dan tidak melakukan operasi *read-ahead*. Ketika tidak ada lagi klien yang membuka berkas tersebut, barulah server memberikan *exclusive oplock* kepada Klien A, dan selanjutnya Klien A pun dapat melakukan operasi *read-ahead* dan melakukan penyanggaan terhadap data yang hendak ditulisi ke dalam berkas. Jika ada klien lagi yang mencoba untuk membuka berkas ketika Klien A sedang memiliki *exclusive oplock* terhadap berkas (ambil contoh Klien C), server akan menginstruksikan kepada Klien A untuk membuka kunciannya. Dengan membuka kunciannya, maka Klien A harus memberikan *lock* yang disangganya atau menulis data yang sedang ia pegang di dalam *buffer* ke dalam berkas. Setelah kunci dibuka, maka Klien C pun dapat mengakses berkas yang bersangkutan.

#### ''Level II Oplock''
*Level II Oplock* mengizinkan beberapa klien untuk membuka berkas yang sama, sehingga tidak ada klien yang dapat menulisi berkas yang bersangkutan secara bersamaan, melainkan secara bergantian. Dalam sebuah *Level II Oplock*, Klien A dapat membuka sebuah berkas dan meminta *exclusive oplock* terhadapnya. Jika memang hanya terdapat Klien A yang mengakses berkas tersebut, maka server akan memberikan *exclusive oplock* kepadanya. Ketika Klien B mencoba untuk mengakses berkas yang sama, maka *server* akan mengontak Klien A untuk membuka kuncinya ke *level II oplock*, jika memang Klien A tidak sedang menulisi berkas. Setelah server melakukan sinkronisasi dengan Klien A untuk meyakinkan bahwa Klien A tidak lagi memiliki data yang disangganya (belum ditulisi ke dalam berkas), maka akses pun diberikan kepada Klien B dengan status *level II oplock*. Hal ini memberi tahu kepada Klien B bahwa Klien B tidak dapat menyangga setiap lock terhadap berkas meski ia diberikan akses. Klien A dan Klien B pun kemudian dapat menulisi berkas tersebut, dan jika hal ini terjadi server akan memerintahkan kepada klien untuk membuka kunci yang mereka buat, sehingga hanya satu klien saja yang dapat menulisi data ke dalam sebuah berkas. Hal ini juga menjadikan server tidak harus melakukan sinkronisasi terhadap semua klien yang terkoneksi untuk melakukan hal ini.
#### ''Batch Oplock''
*Batch oplock* seringnya digunakan oleh aplikasi-aplikasi yang menjalankan perintah-perintah yang ditumpuk (*batch*) yang terdiri atas beberapa operasi untuk membuka dan menutup berkas secara berulang-ulang yang akan dieksekusi secara berurutan.Ketika Klien A ingin memperoleh akses kepada berkas-berkas di dalam sebuah *CIFS server* dengan menggunakan *batch oplock*, ia akan meminta request terhadapnya secara langsung kepada *server*. Jika klien-klien tidak sedang memiliki berkas yang terbuka, maka batch oplock akan diberikan oleh server kepada Klien A, sehingga Klien A pun dapat membuka berkas, meninggalkannya dalam kondisi terbuka ketika mengeksekusi perintah-perintah dalam urutan perintahnya, dan tentu saja menyangga data yang dibutuhkannya. Jika muncul Klien B yang mencoba untuk mendapatkan akses terhadap berkas yang sedang dibuka oleh Klien A dengan menggunakan *batch oplock*, *server* akan memberikan notifikasi kepada Klien A untuk membersihkan penyangga data yang ia buat dan menyimpannya kembali ke server (melakukan sinkronisasi dengan *server*). Dalam beberapa kasus, hal ini menyebabkan Klien A akan menyelesaikan semua operasi yang ia lakukan terhadap berkas yang diminta dan kemudian menutup berkas tersebut sehingga mengizinkan Klien B untuk mengakses berkas tersebut.