Làm thế nào để viết một máy chủ HTTP?


16

Như tiêu đề đã nói, tôi muốn viết một máy chủ HTTP. Câu hỏi của tôi là này, làm thế nào để tôi làm điều này? Tôi biết điều này nghe có vẻ RẤT chung chung và quá "cao cấp", nhưng có một phương pháp cho sự điên rồ của tôi. Một câu trả lời cho câu hỏi này là, tôi tin, ngôn ngữ bất khả tri; nghĩa là, bất kể tôi sử dụng ngôn ngữ nào (ví dụ: C, C ++, Java, v.v.), câu trả lời phải giống nhau. Tôi có một ý tưởng chung về cách thức hoạt động của nó:

  1. Mở một ổ cắm trên cổng 80.
  2. Chờ một khách hàng đưa ra yêu cầu.
  3. Đọc yêu cầu (nghĩa là người này muốn trang "contact-us.html").
  4. Tìm và đọc "contact-us.html".
  5. Gửi một tiêu đề html, sau đó gửi nội dung của "contact-us.html"
  6. Làm xong

Như tôi đã nói, tôi tin rằng đây là quá trình, nhưng tôi không chắc chắn 100%. Điều này dẫn tôi đến trung tâm của câu hỏi của tôi. Làm thế nào hoặc ở đâu một người tìm ra thông tin này?

Điều gì sẽ xảy ra nếu tôi không muốn chỉ viết một máy chủ HTTP, nếu tôi muốn viết một máy chủ FTP, máy chủ trò chuyện, trình xem hình ảnh, v.v. thì sao? Làm thế nào để một người tìm ra các bước / quy trình chính xác cần thiết để tạo một máy chủ HTTP hoạt động?

Một đồng nghiệp đã nói với tôi về tiêu đề html, vì vậy tôi KHÔNG BAO GIỜ biết điều này nếu không có anh ta. Ông cũng nói điều gì đó về việc đưa ra từng yêu cầu cho một chủ đề mới. Có một số cuốn sách lớn về cách mọi thứ hoạt động? Có một số hướng dẫn về những gì nó cần để trở thành một máy chủ HTTP?

Tôi đã thử googling "máy chủ HTTP hoạt động như thế nào", nhưng câu trả lời duy nhất tôi có thể tìm được là hướng tới Joe trung bình của bạn chứ không phải hướng tới một người muốn lập trình máy chủ HTTP.


12
RFC2616 nên có tất cả các chi tiết khó chịu của giao thức HTTP cho bạn. RFC959 là điều tương tự cho FTP.
Mike

3
Ngoài ra (hoặc bổ sung), hãy xem cách các máy chủ HTTP đơn giản hiện có được triển khai. Nhiều hơn một, điều đó sẽ cho bạn một ý tưởng về cấu trúc có ý nghĩa.
Michael Borgwardt

Michael Borgwardt - Tôi sẽ làm điều đó, nhưng tôi có xu hướng sao chép những gì tôi đã thấy khi tôi nhìn vào mã khác. Tôi đã hy vọng đi vào nơi sạch sẽ này, để xem liệu tôi có thể tự làm điều đó mà không "gian lận" không.
Brian

cụm từ tìm kiếm trên web của bạn sai, nó được nhắm mục tiêu vào người dùng, đó là lý do tại sao bạn nhận được công cụ Joe trung bình. Sử dụng: "cách phát triển máy chủ HTTP" thay vào đó, nó phản ánh tốt hơn những gì bạn đang tìm kiếm. Tôi vừa thử nó với Google và có một trang đầy đủ các tài liệu tham khảo giải thích nội dung này
gnat

xem xét xem xét các triển khai khác, ví dụ như tomcat apache. Nó có thể làm nhiều hơn bạn muốn, nhưng nó sẽ thể hiện một kỹ thuật để giải quyết vấn đề.
DwB

Câu trả lời:


18

Sử dụng RFC2616 , Luke!

Bạn đọc RFC 2616 trên HTTP / 1.1 và bạn tìm nó.

Đó thực sự là một dự án trong năm thứ 3 của tôi ở trường kỹ sư, và đó gần như là mô tả dự án.

Công cụ

Công cụ của bạn là:

  • công cụ mạng cơ bản (quản lý ổ cắm, ràng buộc, hiểu địa chỉ),
  • hiểu rõ về các luồng I / O,
  • rất nhiều kiên nhẫn để có được một số phần mờ ám của RFC (loại mime rất thú vị).

Những cân nhắc thú vị

Những điều cần xem xét để thêm niềm vui:

  • kiến trúc trình cắm để thêm hỗ trợ CGI / mod
  • tập tin cấu hình cho, tốt, nhiều thứ,
  • rất nhiều thử nghiệm về cách tối ưu hóa chuyển khoản,
  • rất nhiều thử nghiệm để xem cách quản lý tải về CPU và bộ nhớ và chọn mô hình công văn (vòng lặp lớn, vòng lặp chấp nhận đơn, đa luồng, đa tiến trình, v.v.).

Chúc vui vẻ. Đó là một điều rất tuyệt để xem xét.

Đề xuất khác (Đơn giản hơn)

  • Máy khách / máy chủ FTP (chủ yếu là RFC959 nhưng có phiên bản cũ hơn và cũng có một số tiện ích mở rộng)
  • Máy khách / máy chủ IRC (chủ yếu là RFC1459 , nhưng có phần mở rộng)

Trước tiên, chúng dễ dàng xử lý hơn và RFC của chúng dễ tiêu hóa hơn rất nhiều (tốt, IRC có một số phần kỳ lạ, nhưng FTP thì khá rõ ràng).

Lựa chọn ngôn ngữ

Tất nhiên, một số chi tiết triển khai sẽ phụ thuộc nhiều vào ngôn ngữ và ngăn xếp bạn sử dụng để thực hiện nó. Tôi đã tiếp cận tất cả những điều đó trong C, nhưng tôi chắc chắn nó cũng có thể vui như các ngôn ngữ khác (ok, có thể không nhiều niềm vui, nhưng vẫn vui vẻ).


Vâng, tôi cũng phải làm điều này như một dự án ở trường. Thật thú vị và mang đến cho bạn nhiều sự đánh giá cao đối với các máy chủ web "sức mạnh công nghiệp".
Evicatos

Bắt đúng giao thức là một phần; kiến trúc máy chủ là một ...
tdammers

@tdammers: RFC là khá tốt, nếu bạn theo dõi họ, bạn đã có một kế hoạch chi tiết barebone phong nha để theo dõi. Bạn vẫn còn nhiều chỗ cho thiết kế kiến ​​trúc của mình, nhưng đó là một thông số khá tốt và trực tiếp.
haylem

@haylem: có và không. Việc triển khai thông số kỹ thuật mang lại cho bạn một công nhân riêng lẻ, nhưng bạn vẫn cần nhúng công nhân này vào một bức tranh lớn hơn - làm thế nào để bạn xử lý các yêu cầu đồng thời? Làm thế nào để bạn cung cấp nội dung hữu ích? Nơi nào bạn giữ nhà nước?
tdammers

@tdammers: tôi: You still have lots of room for your architecture design, but it's a pretty good and directive spec.bạn : yes and no. Tôi nghĩ rằng chúng tôi đã thu hẹp hơn RFC không phải là tất cả. Và tôi nghĩ rằng tùy thuộc vào OP để khám phá những điều này thay vì trực tiếp chỉ ra chúng nhiều hơn những gì tôi đã làm trong phần "cân nhắc thêm" và những thứ khác. Đó là một phần của niềm vui.
haylem

2

Mỗi giao thức được sử dụng trên internet được chỉ định trong một hoặc nhiều tài liệu công khai gọi là RFC. Tất cả các RFC hiện tại có thể được tìm thấy tại http://www.rfc-editor.org/ , cũng có chức năng tìm kiếm phong nha.

Giao thức HTTP (phiên bản 1.1), ví dụ, được chỉ định trong RFC2616 và giao thức FTP được chỉ định trong RFC959 .

Theo đặc điểm kỹ thuật, theo tôi, RFC là rất dễ đọc.


Tôi thực sự bối rối với RFC này. Họ có bao giờ cập nhật HTTP RFC không? Trong câu trả lời trên, có một bình luận cho biết In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Vậy, làm thế nào để tìm RFC cập nhật nếu chúng có mặt? Tôi có nên kiểm tra Obsoleted bydanh sách?
SkrewEverything 15/03/18

@SkrewEverything: RFC không được cập nhật nhưng chúng được thay thế bằng RFC mới hơn. Bạn tìm thấy những cái mới hơn thực sự bằng cách theo liên kết "Đã lỗi thời".
Bart van Ingen Schenau 16/03/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.