웹서버 80포트에 대한질문입니다.

kim1158의 이미지

80포트는 웹서버가 클라이언트의 리퀘스트를 받기위해
열어두는 포트잖아요.
그럼 그 요청에 따라 패킷(html코드 내용이겠지요)들을 전송할때
서버에서 나가는 포트와 클라이언트의 수신하는 포트는
몇번이 되는건가요??
그것역시 둘다 80인가요..?

일반적인 서버/클라이언트 소켓프로그램에서는 둘이 같은 포트번호에
바인딩해서 그 포트번호로 read,write하는걸 생각하면 같을것 같긴한데요.
답변 부탁드립니다~^^

dhunter의 이미지

서버에서는 80 in 으로 80 out 으로 돌리고 (telnet 처럼) 클라이언트는 임의포트로 열고 같은 임의포트로 받습니다. 말이 좀 요상하긴 하네...

from bzImage
It's blue paper

kim1158의 이미지

네 그렇군요. 답변 감사드립니다.
그런데 또 궁금한게 생겼네요.
한포트에 여러개의 서버가 바인딩할수는 없잖아요.
그런데 아파치를 실행하면 기본적으로
5~10개의 httpd가 실행되는데요.(ps로 보면)

ps에 여러개가 보이니 쓰레드는 아닐거고요.
실제 httpd가 여러개 뜬거일텐데요.
이 경우는 어떻게 가능한걸까요.?

각각 httpd가 다른 포트를 사용하고있거나.. 이럴거 같지는 않고요.
아니면 다른 어떤방법일까요..?
확인안해봤지만 지금 드는 생각이 일단 httpd는 처음에 하나가뜨고 리퀘스트가 들어왔을때 내부에서 fork로
여러개를 띄우는식일까 싶긴합니다만.. 이래도 결국
동일한 포트에 여러개의 서버가 뜨는건 같은것 같은데..

질문이 좀 두서가없습니다.. 답변부탁드리겠습니다`^^

모든 디지털의 목표는 아날로그.

madhatter의 이미지

socket 개념에서 보자면, 서버측에서는

socket()->bind()->listen()->accept()->read()/write()->close()

위와 같이 진행이 됩니다. 여기서 client 의 connect()를 받아들이는 부분은 accept() 이므로(주로 accept이후에 fork로 child process 생성을 합니다.) port 하나에 하나의 서버가 binding 될 수 있는 것과 client 여러 개의 요청을 처리하는 것은 관계가 없을 것 같습니다.

kim1158의 이미지

질문을 잘못이해하신듯합니다.

제 질문은 동일 포트에 여러개의 서버가 바인딩불가능한데.
(이건 분명하고요)
어떻게 80포트를 사용하는 http데몬들이 복수개 떠있을수있는가
에 대한것이었습니다..^^;

모든 디지털의 목표는 아날로그.

madhatter의 이미지

kim1158 wrote:
네트워크 개념을 잘못이해하신듯합니다..
transport 레이어에서 app레이어로 진입할때
즉 일단 호스트까지 들어온 패킷이 어떤 app에 물리는가는 port번호를 보고
결정이 되기때문에 복수개의 서버(클라이언트도 마찬가지)가 동일포트를
사용할수 없는것은 개념적으로도 분명하고 실제 돌려봐도 불가합니다.
음? 당연히 복수개의 서버는 동일 포트를 가질 수 없습니다. 제가 말씀드린 것은 특정 포트를 listen 하는 서버에서 client 의 복수 요청을 처리하는 것이 문제가 없다는 뜻이었습니다.
madhatter의 이미지

kim1158 wrote:
질문을 잘못이해하신듯합니다.

제 질문은 동일 포트에 여러개의 서버가 바인딩불가능한데.
(이건 분명하고요)
어떻게 80포트를 사용하는 http데몬들이 복수개 떠있을수있는가
에 대한것이었습니다..^^;

당연히 fork 로 child process 를 생성시키는 방법을 쓰는 것 아닐까요?

랜덤여신의 이미지

kim1158 wrote:
어떻게 80포트를 사용하는 http데몬들이 복수개 떠있을수있는가
에 대한것이었습니다..^^;

글쎄요... 생각해 보니 그렇군요. 자세히 생각해 본 적이 없어서리... :o

아마, 내부적으로 서로 통신하면서 작동하지 않을까요? 그냥 추측이였습니다...

madhatter의 이미지

kim1158 wrote:

각각 httpd가 다른 포트를 사용하고있거나.. 이럴거 같지는 않고요.
아니면 다른 어떤방법일까요..?
확인안해봤지만 지금 드는 생각이 일단 httpd는 처음에 하나가뜨고 리퀘스트가 들어왔을때 내부에서 fork로
여러개를 띄우는식일까 싶긴합니다만.. 이래도 결국
동일한 포트에 여러개의 서버가 뜨는건 같은것 같은데..

질문이 좀 두서가없습니다.. 답변부탁드리겠습니다`^^

혹시 Network Program 코드를 살펴보신 적이 없으신가요? 제가 말씀드린대로 보통 Socket 통신에서 connect() 요청을 처리하는 서버는 accept() 후에 fork()로 child process 를 생성하여 service를 처리합니다. 아래 설명이 도움이 될지도 모르겠네요.

Quote:

To accept a TCP connection, use accept(). This call fills in a sockaddr structure with the client's address and returns a new socket, the communication socket, which is used to converse with the client. The original socket remains for other clients to connect to.
opt의 이미지

http://www.iee.et.tu-dresden.de/manual/misc/perf-tuning.html
에서 ctrl+f 로 select 를 찾아보시면, 개념적 코드가 나옵니다.

해당 코드의 이해에 대해선 스티븐스 아자씨의 책을 참고를....

----
LUX ET VERITAS | Just for Fun!

kim1158의 이미지

음. 넵. 힌트주신것들을 종합해서 이해했습니다.
ps상에 보이는 여러개의 http데몬들은
예상했듯이 리퀘스트요청에 의해 fork로 생성된 것이고
해당 포트에 바인드되어있는 http데몬은 하나인거죠.
다른 데몬들은 서비스를 처리용으로 생각할수있겠고요.

답변들 주셔서 모두 감사합니다- (_ _)

모든 디지털의 목표는 아날로그.

wafe의 이미지

httpd가 모두 80번 포트를 사용하고 있는 것은 맞습니다. 80번 포트에서 accept하고 있는 프로세스는 하나일 뿐이겠지만요.

Heejoon Lee

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.