웹서버와 클라이언트간의 데이터 전송은 어떻게 이루어지나요?

jagalchee의 이미지

리눅스에서 C 를 이용하여, 간단한 웹 서버 와 클라이언트 프로그래을 짜고 있습니다.

우선, 기능은 그냥 클라이언트에서 요청한 파일(예 : html 파일)을 서버에서 확인해서 클라이언트에게 보내주는 것이 전부입니다. ^^

근데, 아직 잘 이해가 가지 않는 부분이 있습니다. 바로, 서버에서 클라이언트로 파일을 전송할 때 한번에 얼마만큼의 크기의 메세지가 주고 받아지는가 입니다.

예를 들어 .html 파일을 전송할 때, 서버에서는 .html 파일을 열어서, 거기 있는 텍스트를 일정량 읽어서 클라이언트에게 보내고, 클라이언트에서는 그것들을 받아서 버퍼에 저장하고, .... 서버는 요청한 html 파일을 끝까지 다 읽을 때 까지 이 작업을 계속하겠지요.. 끝까지 다 보낸 후에, 클라이언트는 버퍼에 있는 내용을 출력하게 될텐데요.(근데, 이런 메카니즘이 맞나요?)

여기서 잘 이해가 안가는 부분은 바로, "일정량" 입니다. 만약 클라이언트측에서 지정한 버퍼의 크기보다 더 큰 크기의 메세지가 서버에서 전달되어져 온다면, 클라이언트에서는 그 메세지를 제대로 받을 수 없을거 같은데요..
현재 HTTP 프로토콜에서는 이를 어떻게 정의하고 있는지 궁금하네요.
그리고 우리가 흔히 사용하는 웹 서버인 아파치나, IIS 와 웹 클라이언트 프로그램인 모질라, 익스플로러 사이에서는 또 이를 어떻게 지키고 있는지도 궁금합니다.

소타의 이미지

그 부분은 HTTP가 관여할 부분이 아닌 것 같습니다. 물론 어플이 정확하게 잘라서 소켓을 통해 내보낼수 있으면 좋겠지만 1000 이라는 크기를 보내도 900이 갈지 800이 갈지 정확히 예측하기는 힘듭니다.
write() 의 리턴값이 보낸 크기를 나타내는 것을 보시면 아실수 있겠지만 보내고 싶다고 다 가는 것이 아니고
클라이언트에서도 마찬가지고 1000이 도착했다고 해서 꼭 1000을 모두 읽어야 하는 것은 아닙니다.
read() 도 마찬가지로 읽을 버퍼와 읽을 버퍼의 크기를 지정해줍니다. 미처 못읽은 데이터는 여전히 커널단에서 관리를 하고 있고요.
어플은 1000을 보낼때 10씩 100번 보낼지, 100씩 10번 보낼지, 1000씩 1번 보낼지만 결정 할 수 있습니다. 그 이후의 동작은 예측할 순 있지만 100%정확한 것은 아닙니다.
어플단에서는 어플이 할 수 있는 부분에만 충실하면 될 듯 싶습니다.

불량청년의 이미지

갑자기 게시판에 웹서버에 대한 질문이 많아 지네요. *^^*

님께서 생각하시는 메커니즘이 맞고요.

클라이언트, 서버가 데이터 주고 받는 것에 대한것은

기본인데... 소켓에 대한 기본지식이 많이 필요하신거

같습니다.

지금 여기 프로그래밍 게시판을 조금만 검색해 보시면

님이 궁금하시는 답글이 아주~ 아주 많이 있습니다.

검색은 "and" 글자를 이용해서 검색하시면 됩니다.

예) 소켓 and 데이터 이런식으로...

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.