브라우저에서 서버에 data 요청하면 서버에서 어떻게 클라이언트를 찾아 응답을 주는지 아시는분

s97083의 이미지

안녕하세요
web쪽 하시는 분한테는 기초적인 것일거 같긴 한데... 얼마전 대답을 잘 못하는일이 생겨서요.

브라우저에서 서버쪽에 data요청하면 서버는 public ip니까 쉽게 찾아간다고 하는데

서버가 클라이언트에 응답을 줄때는 클라이언트는 private ip 를 가지고 있는데 어떻게 돌려주냐

이런 질문이었습니다.

http 가 지나간 ip를 record해두기 때문에 이걸로 찾아간다고 애기해 버렸는데 이거 어떻게
서버에서 클라이언트로 응답이 가는건가요?

접 네트웍이 걸려있을거 같기도 하고 쉬운듯 어렵네요...

peecky의 이미지

클라이언트가 보내는 패킷에 클라이언트의 IP 주소를 포함해서 보냅니다.

패킷의 계층 구조는 [IP header, [TCP header, [HTTP header, HTTP body]]] 이런 형식이 됩니다.
IP 헤더 부분에 클라이언트의 IP 주소가 들어가고요.

private IP 일 경우 public IP를 가진 라우터(예를 들어 가정집의 공유기)의 IP 주소가 서버에 전달되고, 서버에서 해당 라우터로 응답 패킷을 보내면, 라우터가 TCP 포트 번호를 참고해서 최종 클라이언트에 패킷을 전달해줍니다.

http://nmap.org/book/tcpip-ref.html

익명 사용자의 이미지

클라이언트에서 서버에 연결을 요청하면 서로 연결 스트림이 생깁니다.

스트림은 각각 서버와 클라이언트 1:1 매칭이니 아이피주소가 public 이든 private든 관계없이 통신이 가능하다고 알고있습니다.

뭐 서버가 보낸 데이터는 어찌됐든 클라이언트 앞단에 있는 라우터가 수신하겠지만요.

익명 사용자의 이미지

윗 분들의 설명에 좀 더 부가해서

NAT에 대해서 찾아보시면 좀 더 자세히 알 수 있으실 것 같습니다.

a287848의 이미지

HTTP 가 기본적으로 Request/Response 방식이며

Client가 Request 한 Socket 연결에 답변을 하는 구조입니다.

따라서 서버가 Client 를 찾을 필요는 없습니다.(Basically)

이런 방식으로 인해 Client 가 Server 로 Notification을 받을때에 문제가 생기는데

그래서 별도로 Push Server 등을 이용합니다..

Bosh 같은 Protocol 을 보면 전체적으로 이해하는데에 도움이 되지 않으실까 하네요.

Bosh 를 이용하면 양방향 Communication 을 사용할 수 있습니다.

그러나 Bosh가 그렇듯이 많은 Push Mechanism 도 결국에는 Persistent 연결에 기술적 기반을 두고 있는 경우가 있습니다.

더 관심있으시면 XMPP 같은걸 보는 것도 좋으실 듯 합니다.

Dig it.

twinwings의 이미지

HTTP 프로토콜은

HTTP - TCP - IP 로 TCP/IP를 기반으로 하고 있습니다.

웹쪽은 깊이 안파서 정확히는 기억이 나지 않으나,

1) 문서 1개 요청할때마다 TCP 세션이 맺어짐. 전송 후 세션 해제. 기본적으로 TCP 포트 80을 사용.

  • 구글의 경우 크롬같은 자사 브라우저 이용 시 문서단위로 TCP 세션을 해제 하지 않음으로서 반응속도를 향상 시킨다 들었습니다.
  • 즉, 첫 페이지 띄우면 두번째 페이지부터는 훨씬 빠른속도를 보인 다는 것이죠. 얼핏 주워들은 이야기니 그냥 흘려 들어주세요.

*** 2) 내용은 틀린 것 같아 내용 삭제 합니다. ***

3) ""서버가 클라이언트에 응답을 줄 때는 클라이언트는 private ip 를 가지고 있는데 어떻게 돌려주냐""

공유기에 의해 NAT 된다고 가정 하겠습니다.

[Client] - [공유기/NAT] - [생략] - [Server]

이 때, 서버가 받는 IP는 공유기의 Public IP입니다. 즉, 서버는 Client와 통신하는게 아니라,

공유기와 통신하는걸로 알고있고 해당 패킷을 실제 Client에게 전달하는건 공유기의 책임입니다.

Necromancer의 이미지

데이터 주고받는 대상을 정해서 정확하게 전달하는 작업은 IP레이어 담당이고,
대량의 데이터를 송수신할때 전송순서 보장은 IP위에 있는 TCP 레이어 담당인데, 이부분은 OS가 알아서 다 해줍니다.

아 그리고 포트는 클라이언트의 포트와 서버의 포트가 있는데
서버측의 포트는 고정되어 있지만(http면 80) 클라이언트의 포트는 랜덤입니다. 이걸로 다 구별됩니다.
TCP는 전송순서뿐만 아니라 여러 link의 데이터를 한 라인에 섞어 실어서 보내주고 분배하는 Multiplexing 역할도 있습니다.

TCP는 서버측 포트 같아도 클라이언트 포트가 다르면 다른 link로 인식합니다.

브라우저에서 접속할 때에 랜덤으로 정해지는 클라이언트 포트가 결정되기 때문에 한 컴퓨터에서 여러 링크 만들어도 이걸로 다 구별 됩니다. HTTP는 요청할때마다 매번 TCP 접속 만들어 낸다는거 아시죠.

Written By the Black Knight of Destruction

댓글 달기

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