HTTP sunucusu nasıl yazılır?


17

Başlığın dediği gibi, bir HTTP sunucusu yazmak istiyorum. Sorum şu, bunu nasıl yaparım? Bu ÇOK genel ve çok "yüksek seviye" geliyor biliyorum, ama benim delilik için bir yöntem var. Bu soruya bir cevap, bence dil agnostik olmalıdır; yani, hangi dili kullanırsam kullanın (örneğin, C, C ++, Java, vb.) cevap aynı olmalıdır. Bunun nasıl çalışması gerektiği konusunda genel bir fikrim var:

  1. 80 numaralı bağlantı noktasında bir soket açın.
  2. Bir istemcinin istek yapmasını bekleyin.
  3. İsteği okuyun (yani, bu kişi "contact-us.html" sayfasını istiyor).
  4. "Contact-us.html" dosyasını bulun ve okuyun.
  5. Bir html başlığı gönderin, ardından "contact-us.html" içeriğini gönderin
  6. Bitti

Dediğim gibi, bunun süreç olduğuna inanıyorum, ama% 100 emin değilim. Bu beni sorumun kalbine götürüyor. Bir kişi bu bilgiyi nasıl veya nerede öğrenir?

Yalnızca bir HTTP sunucusu yazmak istemiyorsam, bir FTP sunucusu, bir sohbet sunucusu, bir resim görüntüleyici vb. Yazmak istersem ne olur? Bir kişi, çalışan bir HTTP sunucusu oluşturmak için gereken tam adımları / süreci nasıl bulur?

Bir iş arkadaşı bana html başlığından bahsetti, bu yüzden bunu onsuz ASLA bilemezdim. Ayrıca her talebi yeni bir konuya sunmakla ilgili bir şeyler söyledi. İşlerin nasıl işlediğine dair büyük bir kitap var mı? HTTP sunucusu olmak için gerekenlere dair bir kılavuz var mı?

"Bir HTTP sunucusu nasıl çalışır" diye çalışmayı denedim, ancak bulabildiğim tek yanıt, bir HTTP sunucusu programlamak isteyen bir kişiye değil, ortalama Joe'nuza yönelikti.


12
RFC2616 , sizin için HTTP protokolünün tüm cesur ayrıntılarına sahip olmalıdır. RFC959 , FTP için de aynı şeydir.
Mike

3
Alternatif olarak (veya ek olarak), mevcut basit HTTP sunucularının nasıl uygulandığına bakın. Birden fazla, bu size yapıların ne anlam ifade ettiği hakkında bir fikir vermelidir.
Michael Borgwardt

Michael Borgwardt - Bunu yapardım, ama diğer koda baktığımda gördüklerimi kopyalama eğilimindeyim. Ben bu hile gitmek, "hile" olmadan kendi başıma yapabilirim görmek umuyordum.
Brian

web arama ifadeniz yanlış, kullanıcıları hedefliyor, bu yüzden ortalama Joe şeyler alıyorsunuz. Kullanın: "HTTP sunucusu nasıl geliştirilir" , aradığınızı daha iyi yansıtır. Sadece Google ile denedim ve bunları açıklayan referansların tam bir sayfasını aldım
gnat

apache tomcat gibi diğer uygulamaları gözden geçirmeyi düşünebilirsiniz. Muhtemelen istediğinizden daha fazlasını yapar, ancak sorunu çözmek için bir teknik gösterecektir.
DwB

Yanıtlar:


19

RFC2616'yı kullan , Luke!

RFC 2616'yı HTTP / 1.1 üzerinde okuyorsunuz ve bunun için gidiyorsunuz.

Bu aslında 3. sınıfımda mühendislik okulunda bir projeydi ve bu neredeyse proje açıklaması.

Araçlar

Araçlarınız:

  • temel ağ oluşturma (soket yönetimi, bağlama, adresleri anlama),
  • I / O akışlarının iyi anlaşılması,
  • RFC'nin bazı gölgeli kısımlarını almak için çok sabır (mime türleri eğlencelidir).

Eğlenceli Hususlar

Ekstra eğlence için dikkat edilmesi gerekenler:

  • CGI / mod desteği eklemek için eklenti mimarisi,
  • birçok şey için yapılandırma dosyaları,
  • transferlerin nasıl optimize edileceğine dair çok sayıda deneme,
  • CPU ve bellek açısından yükün nasıl yönetileceğini görmek ve bir sevk modeli seçmek için büyük deneyler (büyük yağ çift döngü, tek kabul gönderme, çoklu iş parçacığı, çoklu işlem, vb ...).

İyi eğlenceler. Bakmak çok güzel bir şey.

Diğer (Daha Basit) Öneriler

  • FTP istemcisi / sunucusu (çoğunlukla RFC959, ancak eski sürümler ve bazı uzantılar vardır)
  • IRC istemci / sunucu (çoğunlukla RFC1459 , ancak uzantılar var)

İlk olarak üstesinden gelmek çok daha kolay ve RFC'lerinin sindirimi çok daha kolay (IRC'de bazı garip parçalar var, ancak FTP'de oldukça açık).

Dil Seçimi

Tabii ki, bazı uygulama ayrıntıları büyük ölçüde onu uygulamak için kullandığınız dile ve yığına bağlı olacaktır. Ben C tüm bunlara yaklaştı, ama eminim diğer dillerde de eğlenceli olabilir (tamam, belki çok eğlenceli değil, ama yine de eğlenceli).


Evet bunu okulda da bir proje olarak yapmak zorunda kaldım. Şaşırtıcı derecede eğlenceli ve "endüstriyel güç" web sunucuları için daha fazla takdir verir.
Evicatos

Protokol uygulamasının doğru yapılması bir parçasıdır; sunucuyu mimar bir başka ...
tdammers

@tdammers: RFC'ler oldukça iyi, eğer onları takip ederseniz, takip etmeniz gereken iyi bir barebone planınız var. Mimari tasarımınız için hala çok yeriniz var, ancak oldukça iyi ve yönlendirici bir özellik.
haylem

@haylem: evet ve hayır. Spesifikasyonu uygulamak size bireysel bir işçi verir, ancak yine de bu çalışanı daha büyük bir resme yerleştirmeniz gerekir - eşzamanlı istekleri nasıl ele alırsınız? Yararlı içeriği nasıl sağlarsınız? Nerede devlet tutuyorsun?
tdammers

@tdammers: ben: You still have lots of room for your architecture design, but it's a pretty good and directive spec.sen: yes and no. Sanırım zaten RFC'nin her şey olmadığından daralmıştık. Ve bence bu şeyleri doğrudan "ekstra düşünceler" bölümlerinde ve diğer şeylerde yaptığımdan daha çok göstermekten ziyade keşfetmek OP'ye bağlıdır. Eğlencenin bir parçası.
haylem

2

İnternette kullanılan protokollerin her biri RFC adı verilen bir veya daha fazla genel belgede belirtilmiştir. Mevcut tüm RFC'leri de iyi bir arama fonksiyonu olan http://www.rfc-editor.org/ adresinde bulabilirsiniz .

Örneğin HTTP protokolü (sürüm 1.1) RFC2616'da ve FTP protokolü RFC959'da belirtilmiştir .

Spesifikasyon gittikçe, RFC'ler bence çok iyi okunabilir.


Bu RFC'lerle gerçekten kafam karıştı. Hiç HTTP RFC'lerini güncelleyecekler mi? Yukarıdaki cevapta şöyle bir yorum var In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Peki, eğer mevcutsa güncellenmiş RFC'leri nasıl bulabilirim? Obsoleted byListeyi kontrol etmeli miyim ?
SkrewEverything

@SkrewEverything: RFC'ler güncellenmez ancak yeni RFC'ler ile değiştirilir. Gerçekten yeni olanları "Eskimiş" bağlantılarını izleyerek bulabilirsiniz.
Bart van Ingen Schenau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.