TCP 와 connection 에 대한 질문

declspec의 이미지

리눅스에서 TCP 로 멀티미디어 네트워킹 어플리케이션을 개발하고있는데요
윈도우와 리눅스간에 서로 TCP 로 연결을 하는데 TCP 연결이 가끔
이유없이 안될때가 있습니다.

리눅스 서버에서 TCP 수락소켓을 열고
accept 하면서 기다리고 있는 상태이고...

윈도우 클라이언트가 connect 를 호출하는
아주 단순한 부분인데

모든 조건(포트번호, 컴퓨터, 네트워크환경)이 동일한 상태에서 항상 잘 되다가 가끔씩
원인모르게 접속이 안될때가 있는데 accept 랑 connect 함수 자체에 어떤 뭔가가 더 있는걸까요?

그리고 TCP 연결에서 연결이 종료되었다는것을 어떻게해야 확실하게 알 수 있을까요?
저는 처음에 TCP 연결을 맺고 어느 한쪽에서 recv 를 호출했을때 음의 값이 리턴되는거로
확실히 알 수 있을줄 알았는데 커넥션이 종료된뒤에 recv 가 무한히 대기를 할때가 종종 있더군요...

TCP 커넥션이 종료되는 상황은 어느 한쪽에서 FIN 패킷을 날리는 경우밖에 없나요?
종료를 하게되는 시점은 소켓이 닫힐때 인가요? 즉 운영체제의 TCP 모듈이 FIN 을 자동으로
날려주는 건가요? 자세한 메커니즘이 매우 궁금하네요

bejoy4him의 이미지

1. 잘되다가 가끔씩 접속이 안되는 이유
connect, accept에 문제가 있다면 항상 안되는 것이지, 잘되다가 안되는 경우는 없습니다.
환경적인 부분을 살펴보는게 맞습니다.
혹시 패킷 캡쳐를 위해 더미허브를 물려놓은 경우라면, 제거하세요. 더미허브에서 패킷 유실되는 경우가 많습니다.

1:1 연결이 아닌 N:1 연결일 경우 여러 장애상황을 대비해, 소켓에 여러가지 속성을 걸어두기는 합니다.
하지만 위와 같은 단순한 상황에서는 디폴트로 써도 문제가 없어야합니다.

2. TCP연결 종료를 알아내는 법
기본적으로는 recv의 return값을 보고 알아내는게 맞습니다.
그러나 다량의 패킷 유실이 생겨서, TCP세션이 깨진경우에는 recv에서 무한히 대기할 수 있습니다.

이에 대한 해결책으로는 주기적으로 heartbeat메시지를 주고 받으면서 세션을 체크하고
소켓에 recv timeout속성을 부여해 정해진 시간이 경과하도록 recv에서 대기되면, 에러처리하거나
heartbeat메시지가 정해진 시간내에 안들어오면 에러처리하는 방법이 있습니다.

3. 정상적인 경우에는 FIN을 받아야, 끊어집니다.
정확히는 FIN을 보내고 FIN ACK를 받아야 끊어지고, 상대방은 FIN을 받으면 FIN ACK를 보내고 소켓을 닫습니다.

RST를 보내서 세션을 종료하는 수도 있습니다.
TCP 상태 천이도(http://blog.naver.com/PostView.nhn?blogId=airbag1&logNo=80037429661) 참조하시기 바랍니다.

댓글 달기

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