네트워크 관련 원초적인 질문입니다.

jika의 이미지

안녕하세요..

저는 지금 udp 기반에서 동작하는 프로토콜을 구현하는중에 있습니다.

여러가지 문제들이 있지만 지금 현재 패킷 시퀀스 리오더링 하는 부분을 하고 있는데요..

시나리오를 써야 하는데

유저데이터가 네트워크를 통해 전송되는데 전송되는 페킷의 순서가 바뀌어도 상관없는 케이스와 순서가 바뀌면 안되는 케이스가 어떤게 있을까요..

아 질문이 좀 이상합니다만..

유저 어플리케이션에서 리오더링을 하려면 할수도 있는데 네트워크단에서 굳이 페킷 리오더링을 해야 한다면 어떤 케이스가 있을수 있는지에 대한 질문입니다.

경험많으신 분들의 조언 부탁드립니다.

shamlock의 이미지

네트워크단이라면 커널레벨을 말씀하시는 거죠?

제 생각엔
UDP 소켓 서버가 있는데
이것이 클라이언트가 보내준 명령에 대해 처리후 응답을 하고 끝나는 방식이라면 패킷 재조립이 필요없겠구요
흠..이 경우 클라이언트의 명령은 대용량 데이타가 아니어야 합니다.
만약 ...클라이언트의 명령이 65535-20-8=65507 byte 보다 작으면
IP 프로토콜에서 재조립해주지만, 이보다 크면 IP 상위레벨에서 재조립을
해야합니다.
(여기서 65535=16 비트 최대값, 20은 IP 헤더크기, 8은 UDP 헤더크기)
sendto(sock,buf,65507); 이런식으로 보낸경우입니다.
이러한 예로는 간단히 daytimeserver 같은 것이 있겠네요
---------------------------------------------------
TCP FTP 서버처럼, UDP로 대용량 파일전송을 한다면 이때는 IP 상위레벨에서 패킷의 재조립을 해야겠죠
TCP의 경우는 자동으로 재조립을 해줍니다만..

Effective TCP/IP 책을 보면
부하를 줄이기 위해 UDP로 TCP 흉내내는 코드를 작성해서 디버깅 하느니
걍 TCP를 쓰라고 ..아니다.. 신중히 생각해보라고나오네요
(UDP로 TCP를 흉내내는것에 비해...정말로 TCP가 그렇게 부하가 큰것인지에 대해서..신중히 생각해보라고..)

제 생각도 UDP로 TCP 프로토콜을 흉내내다가... 결국은 TCP쓰고 마는 상황이
발생하는 경우가 많을 것이라는 생각이 들더군요

만약 UDP로 TCP 흉내를 낸다면 TCP를 거의 완벽하게 이해하고 난 다음에야
그니깐 TCP가 왜 이런 저런 알고리즘과 그 많은 연구 논문들을 통해서
개선을 시키고 어떻고 저떻고를 했는지..
그래야 UDP로 딱 필요한 TCP기능만 뽑아내서 만들수 있을것 같은 생각이
듭니다.

@.@

익명 사용자의 이미지

jika wrote:

...
유저데이터가 네트워크를 통해 전송되는데 전송되는 페킷의 순서가 바뀌어도 상관없는 케이스와 순서가 바뀌면 안되는 케이스가 어떤게 있을까요..
...

어떤 레코드가 다음과 같다고 가정 합시다.
본명, 별명
"이순신", "충무공"
"홍길동", "신출귀몰"
"나미모", "이쁜이"
...
이를 네트워크로 전송하는데, 우연하게도 패킷을 본명, 별명으로 전송했다고 가정합니다.
도착 순서가,
"이순신", "충무공" ==> 문제 없군요.
"신출귀몰", "홍길동" => 받는 측에서 신출귀몰을 본명으로, 홍길동을 별명으로 처리하겠군요. 문제군요.
숫자를 보내는 경우에도 그렇고,.... 메시지인 경우에도 그러합니다.
바이너리 데이터? 음 ,,,쿵....

보통 순서는 라우터를 경유할때 바뀌게 됩니다. 로컬 망에서(단순한 토폴로지를 갖는)는 순서바뀌는 경우는 잘 발생하지 않습니다. 단지, 손실은 발생할 수 있습니다. 손실이 발생하는 주요 위치는 로컬망에서는 송신/수신하는 컴퓨터내부(kernel)입니다. 외부는 주로 라우터단이 됩니다. 손실에 대한 파악로직과 이로 인한 재전송이 있다면 보다 복잡해지겠습니다.

jika wrote:

...
유저 어플리케이션에서 리오더링을 하려면 할수도 있는데 네트워크단에서 굳이 페킷 리오더링을 해야 한다면 어떤 케이스가 있을수 있는지에 대한 질문입니다.
...

* 한마디로 하면, 유저가 하게하면 힘들고, 실수할까봐.가 아닐까요?
응용로직(비지니스로직)도 할게 많은데, 아직도, 패킷조립하고 있다면(버그도 많고..메이저 운영체제들도 프로토콜 스택의 버그가 많았었지요), 언제 그거 다하나?겠지요. 장난스런 예를 들면, 하드디스크에 전세계의 모든 영화를 저장하려고 하는데, 무한한 저장용량을 가진 하드디스크를 선택해서, 포맷이 아직도 안끝난경우랄까요 :twisted:
그래서, 대부분 운영체제들이 프로토콜 스택(Layer 4까지)은 커널에 포함시켰습니다. 마치 디바이스드라이버도 유저응용프로그램에서 다 만들수도 있는데, 왜 구지 커널에서 하느냐랑 비슷한 얘기가 되겠습니다. 또는 운영체제없이 응용프로그램을 만들수도 있는데(커널이 하는 일도 다 짜서) 왜 운영체제를 만드냐는...
layering의 필요성과도 상통한다고 봅니다.

* 유저어플리케이션에서 하게 할수도 있고 실제로 그렇게 한 경우도 있습니만 쉽지는 않습니다.
- 라이브러리 운영체제인 MIT Exokernel concept(한10여년전)을 구현한 몇몇 library os(최근에도 진행중인듯)들은 라이브러리에 TCP/IP및 기존(?) 운영체제 기능이 대부분 있습니다.
- 유저레벨 프로세스로 라우터를 만든다던지,
- 프로토콜 스택을 유저계층에 구현한다던지:Watt-32, trumpet socket등
- IDS또는 IPS개발을 위해서 한다던지(end-to-end가 아니라 중간에서 몰래 보려고..) : snort, prelude, libnids, bro등
- 패킷분석을 위해 한다던지 : ethereal의 follow Tcpstream참고
- 서버를 패킷부터 조립해서(layer 2부터) 만든다던지...
-그외 uip등도 고려가 되겠습니다.

* TCP가 운영체제에서 기본제공이 아니었다면, 아마도 네트워크 프로그램을 초보(?)들은 엄두조차 못냈을것이고, 현재 인터넷도 존재하지도 않을듯합니다(비약이 심한가?). 순서, 플로우, 에러, 재전송,등을 유저 어플리케이션이 다 책임져라 하면, 소수몇명이 살아남아서 코딩하겠지만, 대다수는 눈물을 머금고, 네트워크 쪽을 떠났을것이라는 상상도 해봅니다.

* IP에서 fragmentation/refragmentation이 생긴 이유는, 그보다 밑인 물리계층(physical layer)에 비의존적인 운영을 보장하기 위해서였습니다. 물리계층의 MTU가 53인 ATM이건, 1500인 Ethernet이건, 시리얼, 패러렐, Token Ring....하여간 임의의 매체를 쓸지라도, 그 물리매체위에서 IP라는 논리 계층을 보장하라. 라는 것이지요. 그러니, 특정 MTU(하드웨어 한계치)보다 큰 IP데이터그램은 잘라서 보내고, 다시 언젠가는 합쳐야하고... 이런게 필요했습니다. 또, 한번에 원격지까지 보낼 수 없으니(물리적으로도 전기저항때문도 있고, 전용선로 구축은 비효율적이고), 중간에 누군가 중계를 해줘야 하는데(라우터, 리피터등), 라우터도 한계가 있는법, 가끔 데이터 까먹기도 하고, 계산된 라우팅 경로가 한개가 아니면 여러경로로 패킷을 보내게되고, 그러다 보면, 빠른 경로 타고 빠르게 오다가, 느린경로 타고 느리게도 오고, 그러다 보면 중복되기도 하고, 잃어버리도 하고 , 한번에 보낼수 있는 프레임크기가 틀려서 잘라서 보내기도 하고, 순서가 바뀌기도 하고 모 그렇겠지요.
이런 것에 대한 고려를 유저가 해라!라고 하면 못할 것은 없지만, 좀... 하지요.

댓글 달기

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