Page |1
Tumpukan Jaringan Protokol dalam Standard ML
A. Perkenalan The FoxNet merupakan implementasi dari standar protokol TCP / IP networking tumpukan menggunakan bahasa Standard ML (SML). SML adalah bahasa pemrograman jenis-aman dengan pengumpulan sampah, sistem modul yang unik dan canggih, dan mesin independen semantik. The FoxNet adalah implementasi user-space dari TCP / IP yang dibangun di SML dengan menyusun elemen protokol modular; setiap elemen independen mengimplementasikan salah satu protokol standar. Salah satu kombinasi spesifik dari unsur-unsur mengimplementasikan standar TCP / IP stack. kombinasi lainnya juga mungkin dan dapat digunakan untuk dengan mudah dan nyaman membangun adat, jaringan non-standar tumpukan. Makalah ini menjelaskan secara rinci desain akhir dan pelaksanaan FoxNet, termasuk banyak rincian yang krusial dipengaruhi oleh pilihan SML sebagai bahasa pemrograman. Proyek Fox dimulai pada tahun 1991 dengan tujuan penulisan systems level kode dalam bahasa pemrograman tingkat tinggi. Tujuan melakukan ini dan ada dua: untuk meningkatkan keadaan seni dalam sistem pengembangan dengan menggunakan bahasa yang lebih maju, dan untuk menantang kedua desain dan implementasi dari bahasa canggih dengan menerapkan mereka untuk beberapa masalah pemrograman yang paling sulit dikenal. Proyek Fox memutuskan untuk membangun sebuah implementasi standar TCP / IP stack protokol [23, 22] menggunakan compiler SML / NJ [2] untuk Standard ML (SML) bahasa pemrograman [17, 18]. Hasilnya adalah FoxNet [4, 7], implementasi standar-sesuai dari TCP / IP yang berjalan pada berbagai arsitektur hardware, mendukung segala sesuatu dari perangkat untuk server web, dan memiliki modular, implementasi yang beraturan. Implementasi stack protokol tradisional yang monolitik, desain dan pelaksanaan setiap protokol dapat membuat asumsi tentang keberadaan dan rincian desain dan implementasi lainnya protokol dalam tumpukan. Sebaliknya, dalam pelaksanaan berlapis dari stack protokol setiap protokol dirancang dan diimplementasikan dalam isolasi, eksplisit menyatakan asumsi yang dibuat tentang protokol lain. Protokol ini kemudian berturut-turut dikumpulkan ke dalam tumpukan protokol. Implementasi berlapis memungkinkan fleksibilitas dalam menggunakan komponen protokol untuk membangun tujuan khusus tumpukan protokol, dapat lebih mudah untuk mengembangkan dan debug dari implementasi monolitik sejak protokol dapat diuji dalam isolasi, dan umumnya lebih jelas daripada implementasi monolitik karena ketergantungan antar protokol yang eksplisit. Salah satu proyek yang telah memiliki beberapa keberhasilan dalam membangun implementasi berlapis protokol jaringan standar proyek x-kernel. Beberapa karakteristik dari x-kernel yang layak dicatat. Implementasi protokol individu dikodekan dalam C, namun bahasa ini tidak menyediakan mekanisme untuk mengekspresikan meta-protokol, untuk memeriksa kesesuaian protokol dengan meta-protokol, dan untuk penggantian nama otomatis fungsi diekspor dibutuhkan ketika protokol yang tersusun.
Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.
Page |2
Setiap lapisan dari FoxNet sesuai dengan implementasi protokol, dan setiap implementasi protokol merupakan parameter bagi lapisan protokol terendah. Misalnya, seperti yang ditunjukkan pada Gambar 1, protokol IP mengambil sebuah protokol yang memenuhi ARP_PROTOCOL dan IP_PROTOCOL sebagai parameter. Dalam pelaksanaan IP, struktur Arp menyediakan semua fungsi dari protokol yang lebih rendah berikutnya dalam tumpukan. Tidak ada implementasi yang sebenarnya diperlukan dari Arp sampai pelaksanaan IP dipakai. Dalam Waktu pemakaian IP, satu-satunya persyaratan yaitu protokol yang lebih rendah memenuhi ARP_PROTOCOL.
Gambar 1. Implementasi Protokol IP Parameter untuk pelaksanaan protokol TCP yang hampir identik dengan parameter untuk pelaksanaan IP, kecuali bahwa protokol yang lebih rendah daripada Arp yaitu dibatasi oleh NETWORK_PROTOCOL seperti yang di tunjukkan pada Gambar 2.
Gambar 2. Implementasi Protocol TCP Setelah semua implementasi protokol telah ditulis dan disusun, membangun sebuah tumpukan adalah masalah menyusun protokol individual. Pada Gambar 3, telah dirakit sebuah tumpukan TCP/IP standar yang memberi implementasi protokol untuk IP, TCP, UDP, ARP, dan Ethernet, dan "perangkat" protokol yang memungkinkan komunikasi dengan perangkat baku. Setiap implementasi ini kecuali untuk perangkat dengan parameter yaitu protokol yang lebih rendah.
Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.
Page |3
Gambar 3. Pembuatan Tumpukan Protokol TCP/IP
B. Mekanisme Dasar Mekanisme dasar yang telah digunakan dalam pelaksanaan FoxNet antara lain yaitu Functor koneksi. Tanda tangan protokol memberlakukan persyaratan tertentu pada setiap protokol yang memenuhi itu. Secara khusus, fungsi yang diperlukan termasuk berikut. 1. Sesi manajemen. Hal ini bertanggung jawab untuk menjaga setiap negara yang berhubungan dengan protokol secara keseluruhan, misalnya tabel routing dari protokol IP. 2. Manajemen Connection. Hal ini bertanggung jawab untuk membuka dan menutup koneksi, dalam menanggapi permintaan dari kedua aplikasi Program (protokol tingkat tinggi) atau jaringan (tingkat rendah protokol). 3. Data pengiriman. Ini adalah proses penyampaian data yang masuk ke protokol tingkat tinggi yang sesuai. Kadang-kadang hanya ada satu -Tingkat yang lebih tinggi protokol, dan kemudian proses ini sederhana, dan kadang-kadang ada banyak, jadi kita harus menentukan protokol data untuk. 4. Manajemen koneksi Pasif. Hal ini memungkinkan tingkat yang lebih tinggi protokol untuk mendengarkan permintaan koneksi masuk. Bagian dari functor Connection yang paling menarik adalah data algoritma pengirimanb untuk data yang diterima. Data handler diteruskan ke protokol yang lebih rendah adalah fungsi yang sama untuk semua koneksi yang lebih rendah, setiap kali khusus menggunakan informasi koneksi yang berbeda. spesialisasi ini, atau aplikasi parsial, disebut currying, dan merupakan salah satu cara yang bahasa fungsional mendukung fungsi tingkat tinggi. Contoh currying ditunjukkan pada gambar di bawah ini.
Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.
Page |4
Gambar 4. Contoh dari fungsi tingkat tinggi yang digunakan untuk membuat fungsi khusus. Penangan generik adalah kari, yang, diterapkan hanya salah satu dari dua argumen, menghasilkan fungsi tertentu single-argumen. Sebuah handler data spesifik untuk koneksi yang dibuat (dipakai) oleh currying handler pada beberapa argumen untuk menciptakan penutupan. Ini Penutupan kemudian diteruskan ke protokol yang lebih rendah sebagai pengendali data yang akan digunakan khusus untuk koneksi ini. Argumen yang data handler kari adalah kunci hubungan yang lebih rendah dan satu set penutupan. Penutupan ini diciptakan oleh currying fungsi lain, misalnya parameter functor mengidentifikasi, pada beberapa argumen mereka. tanda tangan untuk mengidentifikasi ditunjukkan pada gambar berikut.
Gambar 5. Tanda Untuk Fungsi Identifikasi Fungsi identifikasi dipanggil oleh handler data untuk memilih satu atau lebih koneksi yang tepat untuk paket yang masuk. Argumen pertama untuk mengidentifikasi salah satu dari semua curried yang teridentifikasi. Secara teori, identifikasi diterapkan untuk beberapa argumen sekali dan hasil dari fungsi curried diterapkan berkali-kali memungkinkan beberapa perhitungan yang akan dilakukan hanya sekali dan yang dihasilkan fungsi untuk mengeksekusi lebih efisien. The FoxNet menggunakan non-preemptive multithreading (coroutine) paket ditulis untuk sebagian besar di SML (system call digunakan untuk mendapatkan sistem waktu, segala sesuatu yang lain di SML). Berikut Wand [29], dengan menggunakan lanjutan untuk melaksanakan coroutines. Lanjutan diimplementasikan sangat efisien dalam SML / NJ [1, 2], dengan transfer kelanjutan khas control hanya mengambil waktu sebanyak memanggil fungsi.
Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.
Page |5
Gambar 6. FoxNet Coroutine Signature Gambar diatas memberikan highlights dari tanda tangan coroutine yang digunakan dalam FoxNet. Panggilan untuk mengeksekusi fungsi yang diberikan sebagai thread terpisah. Memanggil keluar untuk mengakhiri thread saat ini dan mulai pelaksanaan beberapa thread lain, atau menimbulkan No_Ready_Thread jika tidak ada thread yang tersisa untuk dijalankan. Pemrograman sistem dan pemrograman jaringan perlu sering khawatir dengan efisien pemindahan data sekitar. Dalam tumpukan protokol, data yang harus ditransfer di seluruh lapisan protokol, sementara itu menambahkan protokol header data keluar dan menghapus header dari data yang masuk. Untuk efisiensi, semua ini harus dilakukan tanpa menyalin data. Untuk networking, koleksi diberikan data dapat berbagai dilihat sebagai: 1. 2. 3. 4.
Memerintahkan urutan byte (misalnya untuk pengecekan error) – sebuah array byte Sebuah "sepotong memori" beralamat (untuk buffering) – memori penyangga Koleksi kata-kata (untuk transmisi efisien untuk perangkat) – sebuah kata Array Koleksi memerintahkan kata-kata yang berbeda ukuran (untuk header decoding)
Sebuah bahasa yang aman seperti SML tidak menyediakan pointer. Pelaksanaannya menggunakan bahasa dengan tipe built-in bytearrays, dengan sub dan pembaruan operasi yang memungkinkan membaca dan menulis byte individual dalam array dengan aman. Interface ini menyediakan fungsi dasar yang dibutuhkan untuk manipulasi data tetapi tidak cukup untuk akses cepat ke data.
Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.
Page |6
Gambar 7. Fungi Untuk Penulisan Array Akses cepat membutuhkan akses kata-bijaksana untuk data dan batas cek data sedikit mungkin. Ketika perulangan lebih dari satu array byte SML / NJ, biasanya kita harus memiliki syarat untuk memeriksa akhir array dan pernyataan untuk mengakses data; ini setara dengan dua batas pemeriksaan per byte atau kata diakses, satu untuk akhir array dan yang kedua memastikan kata diakses adalah dalam batas-batas. Sangat mudah untuk mengurangi ini untuk cek tunggal jika pengecualian Subscript digunakan untuk mendeteksi outof- batas mengakses, tapi untuk array pendek overhead menangani pengecualian mungkin signifikan, dan jika lebih dari satu array menjadi dilingkarkan di atas, kondisi out-of-batas untuk array yang berbeda mungkin harus ditangani secara berbeda. Akhirnya, kebutuhan untuk aritmatika saat melakukan akses sekuensial pada array umumnya rawan kesalahan dan khusus memungkinkan pagar-post (off-per-satu) kesalahan.
C. Pengukuran Kinerja Satu pertanyaan yang sering tentang FoxNet adalah berapa banyak kode dalam tumpukan dibandingkan dengan kode dalam tumpukan lainnya. Pelaksanaan protokol yang sama atau protokol yang hampir sama. Penggunaan jalur penting untuk memperkirakan ukuran kode atau kompleksitas adalah satu dengan banyak jebakan, terutama ketika membandingkan program dengan struktur yang berbeda, agak berbeda tujuan, tingkat kemungkinan yang sangat berbeda dalam kualitas dan kelengkapan pelaksanaan, dan berbeda gaya pengkodean. Tabel 1. Baris Kode
Setiap program sistem harus, sebagai bagian dari fungsinya, mengakses memori struktur baik dari perangkat keras, atau didefinisikan oleh program yang ditulis dalam bahasa lain. Ini adalah tugas di mana C unggul - yang efisien. Mekanisme pointer dan kurangnya batas cek semua berkontribusi untuk kemampuan ini. Derby telah melakukan tes untuk membandingkan kinerja SML inline checksum perhitungan dan versi C setara dengan kode yang mirip yang melakukan perhitungan yang sama tanpa mengakses isi array. "Tidak ada akses" kode melakukan aritmatika yang sama pada nilai variabel global. Karena variabel Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.
Page |7
bersifat global, baik C maupun SML kompiler harus dapat mengoptimalkan pergi referensi dan perhitungan yang dihasilkan, meskipun kita belum benar-benar diverifikasi ini.
D. Evaluasi The FoxNet adalah proyek SML signifikan. Dengan satu hitungan, sumber termasuk lebih dari 50.000 baris kode dan komentar, dengan kontribusi dari setidaknya setengah lusin programmer selama beberapa tahun. The FoxNet adalah signifikan dalam cara lain juga. Dengan menggunakan fungsional canggih bahasa untuk menerapkan kode biasanya ditulis dalam C, kami telah membantu memajukan keadaan seni dalam desain bahasa, implementasi compiler, dan pemrograman sistem, memberikan kontribusi untuk atau membantu untuk menginspirasi banyak proyek lainnya. Dua fitur dari SML yang kita digunakan berat adalah lanjutan dan pengecualian. Lanjutan yang digunakan untuk mengimplementasikan koperasi multi-threading (Multi-tasking). Seluruh scheduler kami, kecuali untuk memperoleh sistem waktu (yang dibutuhkan untuk bangun benang tidur), ditulis dalam SML. Lanjutan bukan bagian dari bahasa SML standar, dan disediakan sebagai salah satu ekstensi SML / NJ. Dalam FoxNet, pengecualian digunakan untuk melaporkan kondisi yang tidak biasa. Sejak SML dan SML / NJ memberikan spesifikasi sempurna dan implementasi pengecualian dan penanganan eksepsi, kami umumnya senang dengan kami menggunakan pengecualian. Kami hanya kesulitan kadang-kadang mengidentifikasi yang bagian tertentu dari kode mengangkat pengecualian tertentu. kesulitan ini diperparah oleh ukuran dan sifat multi-berulir dari FoxNet. Akan lebih baik untuk percaya bahwa pengumpulan sampah akan mencegah kebocoran memori. kebocoran memori terjadi ketika mengalokasikan program yang berjalan lama memori yang tidak lagi digunakan tetapi tidak pernah kembali ke tumpukan. Sayangnya, pengumpul sampah hanya berhasil mencegah sebagian memori kebocoran. Salah satu kebocoran memori yang paling menarik kami [5] disebabkan oleh penggunaan kami dari lanjutan untuk melaksanakan benang. Fitur lain yang hilang dari SML ketika kita mulai proyek adalah jenis 32-bit tipe integer. SML / NJ memiliki bilangan bulat 31-bit, karena salah satu dari 32 bit kata (32-bit arsitektur) memungkinkan sampah kolektor untuk membedakan bilangan bulat dari pointer. Ini bekerja untuk pointer sejak orde rendah bit dari pointer kata pada arsitektur byte-addressable tidak signifikan dan semua pointer SML / NJ adalah kata pointer. Seperti yang telah disebutkan dalam Bagian 3.3, seluruh konsep array byte (atau Word8Arrays, karena mereka saat ini dimaksud dalam SML) agak primitif. Konsep Firman Array adalah bahwa dari elegan, aman, dan pointer efisien. array byte tidak efisien karena biasanya satu rentang cek harus dilakukan dalam program untuk memeriksa apakah kita telah mencapai akhir array, dan satu lagi di (compiler yang dihasilkan) akses array kode untuk memverifikasi bahwa indeks dalam batas-batas. Alternatif tidak eksplisit memeriksa akhir array dalam program dan sebaliknya penanganan pengecualian Subscript adalah ceroboh dan
Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.
Page |8
rawan kesalahan, dan membutuhkan penggunaan variabel referensi global untuk mengembalikan hasil batin lingkaran.
E. Keterangan Penutup Sistem runtime dari SML / NJ ditulis dalam C. Dari runtime ini, komponen tunggal terbesar tidak diragukan lagi pengumpul sampah. Memiliki pengumpul sampah ini di C saat ini diperlukan, sebagai SML dan SML / NJ tidak memberikan mekanisme yang efisien untuk memanipulasi memori dengan cara diperlukan dari collector. Menerapkan pengumpul sampah di SML tidak hanya secara substansial menyusut runtime, itu akan membuatnya lebih mudah untuk menyediakan jenis modularitas dan invariants bahwa sampah kolektor membutuhkan sebanyak program kompleks lainnya. Merancang dan mengimplementasikan sistem jaringan menggunakan bahasa pemrograman tingkat lanjut, menggunakan modularitas dan struktur dimanapun mungkin, mengandalkan pengetik ketat, dan mengikuti praktek pemrograman aman. Sistem yang dihasilkan adalah modular dan composable, dapat dipertahankan tanpa kerusakan, dan memiliki satu kinerja yang diharapkan dari sistem penelitian. Telah ditunjukkan bahwa SML adalah bahasa pemrograman yang memadai untuk pemrograman sistem, dan telah terdaftar sejumlah fitur yang kami percaya akan meningkat.
Tumpukan Jaringan Protokol dalam Standard ML @Teknik Informatika UHO 2016.