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 서버가되기위한 매뉴얼이 있습니까?

"HTTP 서버는 어떻게 작동합니까?"인터넷 검색을 시도했지만 찾을 수있는 유일한 답변은 HTTP 서버를 프로그래밍하려는 사람이 아니라 평균적인 Joe를위한 것입니다.


12
RFC2616 에는 HTTP 프로토콜에 대한 모든 세부 사항이 포함되어 있어야합니다. RFC959 는 FTP와 동일합니다.
Mike

3
대안으로 (또는 추가적으로) 기존의 단순 HTTP 서버가 어떻게 구현되는지 살펴보십시오. 하나 이상의 구조는 어떤 구조가 의미가 있는지에 대한 아이디어를 제공해야합니다.
Michael Borgwardt 2014 년

Michael Borgwardt-그렇게 할 것이지만, 다른 코드를 볼 때 본 내용을 복사하는 경향이 있습니다. 나는이 부정 행위를하지 않고 스스로 할 수 있는지 확인하기 위해이 청소에 들어가기를 바랐다.
Brian

귀하의 웹 검색 문구가 잘못되어 사용자를 대상으로하므로 평균 Joe 물건을 얻는 이유입니다. 사용 : "HTTP 서버 개발 방법" 대신 원하는 것을 더 잘 반영하십시오. 방금 Google에서 시도한
결과이

다른 구현 (예 : Apache Tomcat)을 검토하십시오. 아마도 당신이 원하는 것보다 더 많은 일을 할 수 있지만 문제를 해결하는 한 가지 기술을 보여줄 것입니다.
DwB 2016 년

답변:


19

RFC2616 , 루크를 사용하십시오 !

HTTP / 1.1RFC 2616 을 읽으 십시오.

그것은 실제로 공학 학교 3 학년의 프로젝트였으며 프로젝트 설명과 거의 같습니다.

도구

도구는 다음과 같습니다.

  • 기본 네트워킹 (소켓 관리, 바인딩, 주소 이해)
  • I / O 스트림에 대한 이해
  • RFC의 그늘진 부분을 얻는 데 많은 인내심이 있습니다 (마임 유형은 재미 있습니다).

재미있는 고려 사항

추가 재미를 위해 고려할 사항 :

  • CGI / mod 지원을 추가하기위한 플러그인 아키텍처
  • 여러 가지를위한 구성 파일
  • 전송 최적화 방법에 대한 많은 실험,
  • CPU와 메모리 측면에서로드를 관리하고 디스패치 모델 (큰 지방 짝수 루프, 단일 수락 디스패치, 멀티 스레드, 멀티 프로세스 등)을 선택하는 방법에 대한 많은 실험.

즐기세요 보는 것은 매우 멋진 일입니다.

다른 (더 간단한) 제안

  • FTP 클라이언트 / 서버 (주로 RFC959 이지만 이전 버전과 일부 확장명도 있음)
  • IRC 클라이언트 / 서버 (주로 RFC1459 이지만 확장이 있습니다)

그것들은 먼저 다루기가 더 쉽고 RFC는 소화하기가 훨씬 쉽습니다 (물론 IRC는 이상한 부분이 있지만 FTP는 명확합니다).

언어 선택

물론 일부 구현 세부 사항은 구현에 사용하는 언어 및 스택에 따라 크게 달라집니다. 나는 C로 모든 것에 접근했지만 다른 언어에서도 재미있을 수 있다고 확신합니다 (좋아요, 재미는 없지만 여전히 재미 있습니다).


그래, 나는 학교에서도 프로젝트로서 이것을해야했다. 놀랍도록 재미 있고 "산업용"웹 서버에 대해 더 많은 감사를드립니다.
Evicatos

프로토콜 구현을 올바르게하는 것은 한 부분입니다. 서버 설계는 또 다른 방법입니다.
tdammers

@ tdammers : RFC는 꽤 좋습니다. 따라서 따라 가면 괜찮은 베어 본 청사진이 이미 있습니다. 여전히 아키텍처 디자인을위한 공간이 많이 있지만, 꽤 좋은 지침입니다.
haylem

@haylem : 그렇습니다. 사양을 구현하면 개별 작업자에게 제공되지만이 작업자를 더 큰 그림에 포함시켜야합니다. 동시 요청을 처리하는 방법은 무엇입니까? 유용한 콘텐츠를 어떻게 제공합니까? 당신은 어디에 주를 유지합니까?
tdammers 2016 년

@ tdammers : 나 : 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에 지정됩니다 .

사양에 따르면 RFC는 제 생각에 읽기 쉽습니다.


이 RFC와 혼동됩니다. HTTP RFC를 업데이트 할 예정입니까? 위의 답변에는을 나타내는 주석이 있습니다 In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. 그렇다면 업데이트 된 RFC가있는 경우 어떻게 찾을 수 있습니까? Obsoleted by목록을 확인해야합니까 ?
SkrewEverything

@SkrewEverything : RFC는 업데이트되지 않지만 최신 RFC로 대체됩니다. "사용하지 않는 사람"링크를 따라 가면 최신 버전을 찾을 수 있습니다.
Bart van Ingen Schenau
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.