Bagaimana cara menulis server HTTP?


17

Seperti judulnya, saya ingin menulis server HTTP. Pertanyaan saya adalah ini, bagaimana saya melakukan ini? Saya tahu ini terdengar SANGAT umum dan terlalu "tingkat tinggi", tetapi ada metode untuk kegilaan saya. Saya yakin, jawaban atas pertanyaan ini adalah agnostik bahasa; artinya, tidak peduli bahasa apa yang saya gunakan (misalnya, C, C ++, Java, dll.) jawabannya harus sama. Saya memiliki ide umum tentang bagaimana ini seharusnya bekerja:

  1. Buka soket pada port 80.
  2. Tunggu klien untuk membuat permintaan.
  3. Baca permintaan (yaitu, orang ini ingin halaman "contact-us.html").
  4. Temukan dan baca "contact-us.html".
  5. Kirim tajuk html, lalu kirim konten "contact-us.html"
  6. Selesai

Seperti yang saya katakan, saya percaya ini adalah prosesnya, tetapi saya tidak 100% yakin. Ini menuntun saya ke inti pertanyaan saya. Bagaimana atau di mana seseorang mengetahui informasi ini?

Bagaimana jika saya tidak ingin menulis hanya server HTTP, bagaimana jika saya ingin menulis server FTP, server obrolan, penampil gambar, dll.? Bagaimana cara seseorang mengetahui langkah-langkah / proses yang dibutuhkan untuk membuat server HTTP yang berfungsi?

Seorang rekan kerja memberi tahu saya tentang tajuk html, jadi saya tidak akan pernah tahu ini tanpa dia. Dia juga mengatakan sesuatu tentang menyerahkan setiap permintaan ke utas baru. Apakah ada buku besar tentang cara kerja? Adakah manual yang diperlukan untuk menjadi server HTTP?

Saya mencoba googling "bagaimana cara kerja server HTTP", tetapi satu-satunya jawaban yang dapat saya temukan adalah diarahkan ke rata-rata Joe Anda, dan tidak terhadap orang yang ingin memprogram server HTTP.


12
RFC2616 harus memiliki semua rincian sepele protokol HTTP untuk Anda. RFC959 adalah hal yang sama untuk FTP.
Mike

3
Atau (atau tambahan), lihat bagaimana server HTTP sederhana yang ada diimplementasikan. Lebih dari satu, itu akan memberi Anda gambaran struktur apa yang masuk akal.
Michael Borgwardt

Michael Borgwardt - Saya akan melakukan itu, tetapi saya memiliki kecenderungan untuk menyalin apa yang telah saya lihat ketika saya melihat kode lain. Saya berharap untuk pergi ke bersih ini, untuk melihat apakah saya bisa melakukannya sendiri tanpa "curang".
Brian

frasa pencarian web Anda salah, ditargetkan pada pengguna, itu sebabnya Anda mendapatkan barang Joe biasa. Gunakan: "bagaimana mengembangkan server HTTP" sebagai gantinya, lebih baik mencerminkan apa yang Anda cari. Saya baru saja mencobanya dengan Google dan mendapat satu halaman penuh referensi yang menjelaskan hal ini
agas

pertimbangkan untuk meninjau implementasi lain, misalnya apache tomcat. Mungkin melakukan lebih dari yang Anda inginkan, tetapi itu akan menunjukkan satu teknik untuk menyelesaikan masalah.
DwB

Jawaban:


19

Gunakan RFC2616 , Luke!

Anda membaca RFC 2616 pada HTTP / 1.1 , dan Anda melakukannya.

Itu sebenarnya proyek di tahun ke-3 saya di sekolah teknik, dan itu cukup banyak deskripsi proyek.

Alat

Alat Anda adalah:

  • hal-hal dasar jaringan (manajemen soket, penjilidan, pahami alamat),
  • pemahaman yang baik tentang aliran I / O,
  • banyak kesabaran untuk mendapatkan bagian teduh dari RFC (tipe pantomim itu menyenangkan).

Pertimbangan yang Menyenangkan

Hal-hal yang perlu dipertimbangkan untuk kesenangan ekstra:

  • arsitektur plug-in untuk menambahkan dukungan CGI / mod,
  • file konfigurasi untuk, well, banyak hal,
  • banyak eksperimen tentang cara mengoptimalkan transfer,
  • banyak eksperimen untuk melihat bagaimana mengelola beban dalam hal CPU dan memori, dan untuk memilih model pengiriman (loop gemuk besar, pengiriman terima tunggal, multi-thread, multi-proses, dll ...).

Selamat bersenang-senang. Ini hal yang sangat keren untuk dilihat.

Saran Lainnya (Lebih Sederhana)

  • Klien FTP / server (kebanyakan RFC959 tetapi ada versi yang lebih lama dan juga beberapa ekstensi)
  • Klien / server IRC (kebanyakan RFC1459 , tetapi ada ekstensi)

Mereka lebih mudah diatasi terlebih dahulu, dan RFC mereka jauh lebih mudah dicerna (well, IRC memiliki beberapa bagian yang aneh, tetapi yang FTP cukup jelas).

Pilihan Bahasa

Tentu saja, beberapa detail implementasi akan sangat tergantung pada bahasa dan tumpukan yang Anda gunakan untuk mengimplementasikannya. Saya mendekati semua itu di C, tapi saya yakin itu bisa menyenangkan juga dalam bahasa lain (ok, mungkin tidak terlalu menyenangkan, tapi tetap menyenangkan).


Ya saya harus melakukan ini sebagai proyek di sekolah juga. Sangat mengherankan dan memberi Anda lebih banyak penghargaan untuk server web "kekuatan industri".
Evicatos

Menjalankan implementasi protokol dengan benar adalah satu bagian;
Merancang

@tdammers: RFC cukup bagus, jika Anda mengikutinya, Anda sudah memiliki cetak biru barebone yang layak untuk diikuti. Anda masih memiliki banyak ruang untuk desain arsitektur Anda, tetapi itu adalah spec yang cukup bagus dan direktif.
haylem

@haylem: ya dan tidak. Menerapkan spesifikasi memberi Anda seorang pekerja perorangan, tetapi Anda masih perlu menanamkan pekerja ini dalam gambaran yang lebih besar - bagaimana Anda menangani penanganan permintaan secara bersamaan? Bagaimana Anda menyediakan konten yang bermanfaat? Di mana Anda menjaga negara?
Pelaku

@tdammers: saya: You still have lots of room for your architecture design, but it's a pretty good and directive spec.Anda: yes and no. Saya pikir kita sudah mempersempit daripada RFC bukan segalanya. Dan saya pikir terserah OP untuk kemudian menemukan hal-hal ini daripada langsung menunjukkan mereka lebih dari apa yang telah saya lakukan di bagian "pertimbangan ekstra" dan hal-hal lain. Itu bagian dari kesenangan.
haylem

2

Setiap protokol yang digunakan di internet ditentukan dalam satu atau lebih dokumen publik yang disebut RFC. Semua RFC saat ini dapat ditemukan di http://www.rfc-editor.org/ , yang juga memiliki fungsi pencarian yang layak.

Protokol HTTP (versi 1.1), misalnya, ditentukan dalam RFC2616 dan protokol FTP ditentukan dalam RFC959 .

Sesuai spesifikasi, RFC menurut saya sangat mudah dibaca.


Saya benar-benar bingung dengan RFC ini. Apakah mereka akan memperbarui RFC HTTP? Dalam jawaban di atas, ada komentar yang menyatakan In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Jadi, bagaimana cara menemukan RFC yang diperbarui jika ada? Haruskah saya memeriksa Obsoleted bydaftar?
SkrewEverything

@ SkrewEverything: RFC tidak diperbarui tetapi diganti oleh RFC yang lebih baru. Anda memang menemukan yang lebih baru dengan mengikuti tautan "Usang oleh".
Bart van Ingen Schenau
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.