จะเขียนเซิร์ฟเวอร์ HTTP ได้อย่างไร?


17

ตามที่ชื่อบอกว่าฉันต้องการเขียนเซิร์ฟเวอร์ HTTP คำถามของฉันคือสิ่งนี้ฉันจะทำสิ่งนี้ได้อย่างไร ฉันรู้ว่ามันฟังดูธรรมดามากและ "ระดับสูง" ด้วย แต่ก็มีวิธีหนึ่งสำหรับความบ้าคลั่งของฉัน ฉันเชื่อว่าคำตอบของคำถามนี้คือฉันไม่เชื่อเรื่องพระเจ้า ความหมายไม่ว่าฉันจะใช้ภาษาใด (เช่น C, C ++, Java ฯลฯ ) คำตอบควรเหมือนกัน ฉันมีความคิดทั่วไปว่ามันควรจะทำงานอย่างไร:

  1. เปิดซ็อกเก็ตที่พอร์ต 80
  2. รอให้ลูกค้าทำการร้องขอ
  3. อ่านคำขอ (เช่นบุคคลนี้ต้องการหน้า "contact-us.html")
  4. ค้นหาและอ่าน "contact-us.html"
  5. ส่งส่วนหัว html จากนั้นส่งเนื้อหาของ "contact-us.html"
  6. เสร็จสิ้น

อย่างที่ฉันพูดฉันเชื่อว่านี่เป็นกระบวนการ แต่ฉันไม่แน่ใจ 100% สิ่งนี้ทำให้ฉันเป็นหัวใจของคำถาม บุคคลค้นหาข้อมูลนี้ได้อย่างไรหรือที่ไหน?

ถ้าฉันไม่ต้องการเขียนเฉพาะเซิร์ฟเวอร์ HTTP จะเกิดอะไรขึ้นถ้าฉันต้องการเขียนเซิร์ฟเวอร์ FTP เซิร์ฟเวอร์แชทโปรแกรมดูรูปภาพ ฯลฯ บุคคลค้นหาขั้นตอน / กระบวนการที่แน่นอนที่จำเป็นในการสร้างเซิร์ฟเวอร์ HTTP ที่ใช้งานได้อย่างไร

เพื่อนร่วมงานคนหนึ่งบอกฉันเกี่ยวกับส่วนหัว html ดังนั้นฉันจะไม่มีทางรู้เรื่องนี้เลยถ้าไม่มีเขา นอกจากนี้เขายังพูดบางอย่างเกี่ยวกับการส่งคำขอใหม่ให้กับแต่ละเธรด มีหนังสือเล่มใหญ่เล่มหนึ่งว่าสิ่งต่าง ๆ ทำงานอย่างไร? มีคู่มือบางอย่างสำหรับการเป็นเซิร์ฟเวอร์ HTTP หรือไม่?

ฉันลองใช้ googling "เซิร์ฟเวอร์ HTTP ทำงานอย่างไร" แต่คำตอบเดียวที่ฉันสามารถหาได้คือมุ่งไปที่ Joe โดยเฉลี่ยของคุณและไม่ใช่สำหรับคนที่ต้องการเขียนโปรแกรมเซิร์ฟเวอร์ HTTP


12
RFC2616ควรมีรายละเอียดทั้งหมดของโปรโตคอล HTTP สำหรับคุณ RFC959เป็นสิ่งเดียวกันสำหรับ FTP
Mike

3
หรืออีกวิธีหนึ่ง (หรือเพิ่มเติม) ดูว่ามีการใช้เซิร์ฟเวอร์ HTTP แบบง่ายที่มีอยู่อย่างไร มากกว่าหนึ่งที่ควรให้ความคิดแก่คุณว่าโครงสร้างใดเหมาะสม
Michael Borgwardt

Michael Borgwardt - ฉันจะทำอย่างนั้น แต่ฉันมีแนวโน้มที่จะคัดลอกสิ่งที่ฉันเห็นเมื่อฉันดูรหัสอื่น ฉันหวังว่าจะทำความสะอาดนี้เพื่อดูว่าฉันสามารถทำได้ด้วยตัวเองโดยไม่ต้อง "โกง"
Brian

วลีค้นหาเว็บของคุณผิดมีการกำหนดเป้าหมายที่ผู้ใช้นั่นคือสาเหตุที่คุณได้รับข้อมูลโจเฉลี่ย ใช้: "วิธีการพัฒนาเซิร์ฟเวอร์ HTTP"แทนมันจะสะท้อนสิ่งที่คุณกำลังมองหาได้ดียิ่งขึ้น ฉันเพิ่งลองกับ Google และมีหน้าอ้างอิงแบบเต็มซึ่งอธิบายสิ่งนี้
gnat

พิจารณาการใช้งานอื่น ๆ เช่น apache Tomcat มันอาจจะทำมากกว่าที่คุณต้องการ แต่มันจะแสดงให้เห็นถึงเทคนิคหนึ่งในการแก้ปัญหา
DwB

คำตอบ:


19

ใช้RFC2616ลุค!

คุณอ่านRFC 2616บนHTTP / 1.1แล้วไปเลย

นั่นเป็นโครงการในปีที่ 3 ของฉันในโรงเรียนวิศวกรรมและนั่นคือรายละเอียดโครงการ

เครื่องมือ

เครื่องมือของคุณคือ:

  • เครือข่ายพื้นฐาน (การจัดการซ็อกเก็ตการเชื่อมโยงเข้าใจที่อยู่)
  • ความเข้าใจที่ดีของ I / O สตรีม
  • ความอดทนอย่างมากที่จะได้รับส่วนต่าง ๆ ของ RFC (ประเภท mime สนุก)

การพิจารณาที่สนุกสนาน

สิ่งที่ต้องพิจารณาเพื่อความสนุกสนานเป็นพิเศษ:

  • สถาปัตยกรรมปลั๊กอินเพื่อเพิ่มการรองรับ CGI / mod
  • ไฟล์กำหนดค่าสำหรับดีหลาย ๆ อย่าง
  • มีการทดลองมากมายเกี่ยวกับวิธีเพิ่มประสิทธิภาพการถ่ายโอน
  • การทดลองจำนวนมากเพื่อดูวิธีจัดการโหลดในแง่ของ CPU และหน่วยความจำและเลือกโมเดลการจัดส่ง (ไขมันใหญ่แม้ลูปเดียวยอมรับการแจกจ่ายแบบมัลติเธรดกระบวนการหลายกระบวนการ ฯลฯ ... )

มีความสุข. มันเป็นเรื่องที่น่าสนใจมาก ๆ

คำแนะนำอื่น ๆ (เรียบง่าย)

  • ไคลเอนต์FTPเซิร์ฟเวอร์ / (ส่วนใหญ่RFC959แต่มีเวอร์ชั่นเก่ากว่าและมีนามสกุล)
  • IRCไคลเอนต์ / เซิร์ฟเวอร์ (ส่วนใหญ่RFC1459แต่มีนามสกุล)

มันง่ายกว่าที่จะจัดการก่อนและ RFC ของพวกเขานั้นย่อยง่ายกว่ามาก (เช่นกัน IRC หนึ่งมีบางส่วนที่แปลก แต่ FTP อันนั้นค่อนข้างชัดเจน)

การเลือกภาษา

แน่นอนว่ารายละเอียดการใช้งานบางอย่างจะขึ้นอยู่กับภาษาและสแต็กที่คุณใช้ในการติดตั้ง ฉันเข้าใกล้ทุกอย่างใน C แต่ฉันแน่ใจว่ามันสนุกเหมือนกันในภาษาอื่น (โอเคบางทีอาจจะไม่สนุกเท่าไหร่ แต่ก็ยังสนุก)


ใช่ฉันต้องทำเช่นนี้เป็นโครงการในโรงเรียนด้วย มันสนุกอย่างน่าประหลาดใจและให้ความชื่นชมแก่คุณมากขึ้นสำหรับเว็บเซิร์ฟเวอร์ "ความแข็งแกร่งทางอุตสาหกรรม"
Evicatos

การทำให้การใช้โปรโตคอลถูกต้องเป็นส่วนหนึ่ง architecting เซิร์ฟเวอร์ที่อื่น ...
tdammers

@tdammers: RFCs ค่อนข้างดีถ้าคุณทำตามพวกคุณก็มีพิมพ์เขียวแบร์โบนที่น่าติดตามอยู่แล้ว คุณยังคงมีพื้นที่มากมายสำหรับการออกแบบสถาปัตยกรรมของคุณ แต่มันเป็นสเป็คที่ดีและสั่งการได้สวย
haylem

@haylem: ใช่และไม่ใช่ การนำข้อมูลจำเพาะไปใช้จะช่วยให้คุณมีพนักงานแต่ละคน แต่คุณยังต้องฝังคนงานนี้ในภาพรวมที่ใหญ่ขึ้น - คุณจะจัดการกับคำขอที่เกิดขึ้นพร้อมกันได้อย่างไร คุณให้เนื้อหาที่มีประโยชน์ได้อย่างไร คุณรักษาสถานะที่ไหน
tdammers

@tdammers: me: คุณ:You still have lots of room for your architecture design, but it's a pretty good and directive spec. yes and noฉันคิดว่าเราแคบลงกว่า RFC ไม่ใช่ทุกอย่าง และฉันคิดว่ามันเป็นเรื่องของ OP ที่จะค้นพบสิ่งเหล่านี้แทนที่จะชี้ให้พวกเขาเห็นโดยตรงมากกว่าสิ่งที่ฉันได้ทำไปแล้วในส่วน "ข้อควรพิจารณาพิเศษ" และสิ่งอื่น ๆ มันเป็นส่วนหนึ่งของความสนุก
haylem

2

แต่ละโพรโทคอลที่ใช้บนอินเทอร์เน็ตถูกระบุในเอกสารสาธารณะหนึ่งฉบับหรือมากกว่าที่เรียกว่า RFC RFC ปัจจุบันทั้งหมดสามารถดูได้ที่http://www.rfc-editor.org/ซึ่งมีฟังก์ชั่นการค้นหาที่ดี

โปรโตคอล HTTP (เวอร์ชั่น 1.1) ยกตัวอย่างเช่นที่ระบุไว้ในRFC2616และโปรโตคอล FTP จะระบุไว้ในRFC959

ตามที่ระบุไว้ไป RFCs ในความคิดของฉันอ่านได้เป็นอย่างดี


ฉันสับสนกับ RFC นี้จริงๆ พวกเขาจะอัปเดต HTTP RFCs หรือไม่ ในคำตอบข้างต้นมีความคิดเห็นที่ระบุIn 2014, RFC2616 was replaced by multiple RFCs (7230-7237).ไว้ ดังนั้นจะหา RFC ที่อัพเดทได้อย่างไรถ้ามีอยู่? ฉันควรตรวจสอบObsoleted byรายการหรือไม่
SkrewEvery สิ่งมีค่า

@SkrewEverything: RFC ไม่ได้รับการอัพเดต แต่จะถูกแทนที่ด้วย RFC ที่ใหม่กว่า คุณพบสิ่งใหม่กว่านี้โดยไปตามลิงก์ "เลิกใช้แล้ว"
Bart van Ingen Schenau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.