도데체 소켓이 안 끊기는 이유는... 멀까요?

하하의 이미지

^^;;

실제 테스트에 앞서.. 많은 경험을 가진 분들의

의견을 듣고 싶에 질문을 올립니다.

[질문]. 소켓이 않끊김

[환경]. 클라이언트 서버

[어떨때]. 클라이언트 서버가 통신중 클라이언트의 랜선을 뽑을때

[확인]. netstat -nac 로 확인해 보면 서번.. close 리턴을 했지만.
계속 establish 상태임.

[문제점](애매함) 예를 들어 끊기기 전 36번 소켓을 사용해 통신하고
있을때 서번 끊었고 다시 다른 클라이언트가 접속하
면 보통 36번을 다시 할당하는데 이때 커널단에서
위 같은 이유로 36번은 실제 안끊겼기 때문에
POLL 에서 에러인 NOTVALID 발생...

일단 문제점은 애매할 수 있기에 재처두고 위 와 같은 현상을 경험

하거나 원인을 설명 해주시면 정말 감사하겠습니다.

전 이글 올리고.. 다시.. 위 상황을 테스트 하러 ~~ 슝~

File attachments: 
첨부파일 크기
Image icon tcp4wayhandshake.JPG39.93 KB
익명 사용자의 이미지

한번 그림으로 그려보세요.
첨부된 그림은 정상종료 시나리오입니다.

랜선을 절췌하는 등의 비정상적인 상황 대처를 테스트하시는가 본데요.
저는 응용수준의 지속적인 핸드쉐이킹(타임아웃걸고)을 수행해서 하곤 했습니다.

그림으로 그리다 보면 보다 명확해 지는 경우가 많더군요.

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트
익명 사용자의 이미지

정말 외람된 말인데요? ^^;;

실제로 해보셨나요?

위 그림을 보면.. 최소한.. 서버가 close를 했을때..

FIN은 날림니다. 헌데.. 날리질 않는군요..

그러니.. 아싸리.. 종료를 위한 어떤 상태로도 전환이 안됩니다.

한번 해보세여~~~ 만약 된다면.. 제가 먼가 큰 착각을 하고 있는거겠죠??

ㅡ,.ㅡ;;의 이미지

만일 랜선 뽑을때 TCP계층에서 실제로 끊어졌다고 즉각 판단하게된다고 했을때 발생할문제를 생각해보세요
예를들면 멀리있는 서버클라이언트간의 통신상태가 약간불안정할경우에도 모두 접속끊어짐을 리턴해버린다면
거의 통신을 할수가 없습니다.
실제로 랜선을 뽑았는지 선로가 불안정한것인지 프로그램은 알수 없는것이죠..따라서 적절히 오류를 묵쌀하는..식으로 처리하도록해야하겠죠..그상위도 그런특징을 감안하여 적절히 대처하도록해야겠죠..


----------------------------------------------------------------------------

익명 사용자의 이미지

문제는.. 랜선이 뽑힌 사용자를 서버가 polling 해서 끊는다 (close)

한다 해도..

다음 정상적인 사용자가 바로 접속할때.. 랜선 뽑힌 사용자의 sockfd를

accept에서 그대로 줘서... poll 이나 select에서.. 문제가 생긴다는 겁니당.

익명 사용자의 이미지

해결책은 시스템 단에선.. establish 인데

응용단에서.. 끊긴걸로 생각하고.. 안끊긴 sockfd를 그대로 돌려준다는데서...

zienie의 이미지

하하.. wrote:
문제는.. 랜선이 뽑힌 사용자를 서버가 polling 해서 끊는다 (close)

한다 해도..

다음 정상적인 사용자가 바로 접속할때.. 랜선 뽑힌 사용자의 sockfd를

accept에서 그대로 줘서... poll 이나 select에서.. 문제가 생긴다는 겁니당.

응용프로그래밍에서 software 적으로 일정 시간동안
접속 유지가 되지 않으면 체크해서 강제로 끊고
해당 FD 에 대해서 프로그램 내부적으로 사용하던 할당된 메모리, 버퍼, FD_SET등...을 clear 해주면 다음번에 같은 FD 값을 반환 하더라도 문제가 안될듯 한데요.

그리고, redhat, gentoo, solaris, HPUX 등에서
accept 가 돌려주는 FD 값은 통상 일정 수준까지는
그전 값 +1 이더군요.

##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

kyeongchan의 이미지

ㅡ,.ㅡ;; wrote:
만일 랜선 뽑을때 TCP계층에서 실제로 끊어졌다고 즉각 판단하게된다고 했을때 발생할문제를 생각해보세요
예를들면 멀리있는 서버클라이언트간의 통신상태가 약간불안정할경우에도 모두 접속끊어짐을 리턴해버린다면
거의 통신을 할수가 없습니다.
실제로 랜선을 뽑았는지 선로가 불안정한것인지 프로그램은 알수 없는것이죠..따라서 적절히 오류를 묵쌀하는..식으로 처리하도록해야하겠죠..그상위도 그런특징을 감안하여 적절히 대처하도록해야겠죠..

이런식의 처리는 어떤방법으로 가능한건가요?

익명 사용자의 이미지

하하.. wrote:
문제는.. 랜선이 뽑힌 사용자를 서버가 polling 해서 끊는다 (close)

한다 해도..

다음 정상적인 사용자가 바로 접속할때.. 랜선 뽑힌 사용자의 sockfd를

accept에서 그대로 줘서... poll 이나 select에서.. 문제가 생긴다는 겁니당.

답변을 위한 질문좀 하겠습니다.

* 가정
1) 서버 IP : 1.1.1.1
2) 서버 port : 1111
3) Lan cable을 절단(뽑음!)할 클라이언트 IP : 3.3.3.3
4) Lan cable을 절단(뽑음!)할 클라이언트 port : 3333
5) 즉, tcp 5 association ( protocol, src ip, src port, dst ip, dst port)
=> (tcp, 1.1.1.1, 1111, 3.3.3.3, 3333)
6) 서버에서 5)의 5튜플정보를 파일시스템에 연동한 socket descriptor = 36
7) 현재 상태를 테스트 준비 상태라고 함
8) 클라이언트의 랜선을 뽑는다.
9) 8일때, 클라이언트(3.3.3.3)의 3333번 포트로 동작하는 프로그램의 변화, 즉, (tcp, 1.1.1.1, 1111, 3.3.3.3, 3333) 의 상태는 어떻게 되는가?
10) 8일때, 서버(1.1.1.1)의 (tcp, 1.1.1.1, 1111, 3.3.3.3, 3333) 의 상태는 ESTABLISHED이다! 이 접속은 36번 소켓디스크립터로 관리되었었다. 그리고, 랜선을 뽑은 후에도 계속 상태변화가 없다(프로그램에 이벤트도 발생하지 않으며, 따라서 연결종료시에 발생할 이벤트 처리도 안하며, netstat명령으로 보아도 상태변화 없다).
11) 제3의 클라이언트(2.2.2.2)에서 서버접속을 시도했다.
연결 레코드는 (tcp, 1.1.1.1, 1111, 2.2.2.2, ????)이다. 그런데, accept()가 리턴한 소켓 디스크립터는 36이다!

위와 같다는 얘기인가요?
질문의 데이터가 조금 부족합니다. 좀 채워서 질문해주시면....

익명 사용자의 이미지

polling 등을 통해 끊어진걸 알았거나 read / write 중 끊어진걸 알았다면 처리해 주면 됩니다. 디스크립터가 같은 걸로 나온다고 해서 문제가 될건 없다고 생각됩니다만..

혹시 아직 close 하지 않은 디스크립터가 accept()의 리턴값이란 말씀이신가요?? 질문이 좀 모호합니다.. :oops:

댓글 달기

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