신뢰성있는 TCP 통신

gazam의 이미지

안녕하세요 최근에 리눅스로 넘어와서 프로그래밍 하다가
궁금한것이 생겨서 이렇게 질문합니다.
현재 하고 있는 일은 비동기 소켓클래스를 작성하는 것입니다.
여기 저기 뒤져보고 select로 구현해놓았는데요.
궁금한것은 TCP 소켓을 사용하다가 물리적네트워크가 끊겨버렸을 경우입니다.
KLDP에서 열심히 검색한 결과 TCP는 끊겨도 별다른 응답이 없더군요.ㅡㅡ;
send는 단지 하위버퍼에 채우는 역할만 하는거 같더군요.
그래서 연결이 끊겨도 버퍼를 다 채우고는 넌블럭의 경우에 EAGAIN 에러를 내더군요.
질문 1.
만약 끊겨버리면 어떤 메시지가 끊겨버렸는지 알 수 있는 방법이 있을까요?
TCP는 스트림인데 어떤 메시지까지 잘 도착했는지 알 방법이 궁금하네요
무선상에서 사용할 것이고 신뢰성도 중요해서 그럽니다.
만약 서버에서 클라이언트로 데이터를 보내는 도중 끊겨 버리면 어플리케이션 상의 시퀀스 넘버 같은것을
안쓰고는 서버 차제적으로는 알 수가 없을까요?

질문2.
이건 그냥 궁금한건데 제가 그냥 데이터를 빠르게 주고 받는 프로그램을 테스트용으로 돌려보다가
속도가 얼마나 나오나 궁금해서 봤더니 100Mbps환경에서 이것저것 변수나 메시지 크기를 바꿔보면서
해보니까 30메가정도밖에는 안나오더군요. 이거 100Mbps까지 되게 하려면 어떠한 테크닉이 필요한가요?

gazam의 이미지

엇 댓글 지우는 방법을 모르겠네요.ㅡㅡ;

bejoy4him의 이미지

이전에도 비슷한 글이 있었던 것으로 기억합니다...

어쨌던 추천 되는 방법으로는 heart beat에 해당하는 메시지를 주기적으로 보내서 응답이 없을 경우에 끊어지는 것으로 판단하는 방법으로 알고 있습니다.

gazam의 이미지

heart beat를 한다고 하면 연결되어 있는 소켓과는 별도로 클라이언트와 새로 소켓을 만들어서
돌려야 하는건가요?아니면 간간히 그냥 메시지 날리다가 heart beat도 날려서 해도 되겠지요?
끊어질 때 어떤 메시지가 유실되었는지는 알 수 없을까요?
답변 감사합니다~ 점심 맛있게 드세요~~^^

jick의 이미지

대략 추측은 할 수 있지만 확실하게 아는 건 불가능합니다. 다음과 같은 상황을 생각해 보시면 됩니다.

A가 B에게 패킷 100번을 보냅니다. B는 패킷을 받아서 처리하고, A에게 "100번을 받았다."라는 응답을 보냅니다. 그런데 이 순간 연결이 끊겨 A는 응답을 받지 못합니다.

자, A는 B가 100번을 받았는지 안 받았는지 알 도리가 없습니다.

그렇다면 이 문제를 없애기 위해 A가 응답을 받은 다음에만 B가 메시지를 처리하게 하면 어떻게 될까요? 그러면 B는 A가 "니가 100번을 받았다는 응답을 내가 받았다."라는 메시지를 보낼 때까지 기다려야 합니다. 이 때 접속이 끊깁니다. A는 B한테 응답을 보냈으니 당연히 B가 100번을 받아서 처리했다고 생각하지만 B는...

이런 식으로 무한 루프에 빠지기 때문에, 일단 접속이 끊겨 버리면 절대 어디까지 받았는지 정확히 아는 것은 불가능합니다. 다시 접속할 때 확인하거나, 마지막으로 ack를 받은 시점을 기억해서 "그 이후의 적당한 시점까지 받았겠구나"라고 추측하는 수밖에 없습니다.

음 다 써놓고 보니 원래 질문의 의도가 이 "마지막으로 ACK를 받은 시점을 어떻게 아나요?"였을 수도 있다는 생각이 드네요. -.-

gazam의 이미지

음...말씀하신 ACK는 TCP상의 ACK인가요? 아니면 자체적인 ACK인가요?
TCP상의 ACK는 받을 방법이 있나요? ㅋ 계속 질문만...ㅡㅡ;
TCP 구현 자체가 바로바로 ACK를 받을 수 없게끔 되어있는걸로 알거든요.

댓글 달기

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