TCP 윈도우 사이즈 감소 문제

dummy999의 이미지

tcp통신프로그램을 짰습니다.
상대방과 통신을 하는데
자꾸 송신쪽 시스템의 윈도우사이즈가 감소한다고 합니다.
그런데 이게 왜일어나며 이걸해결할수있는 방법이 없을까요?
좀급합니다.

작업환경은 NT입니다.

monac의 이미지

뭘보고 윈도우사이즈가 감소한다고 말씀하시는지 배경이 전혀 없어서 모르겠네요. 자세한정보를 주시면 좋겠는데요...
그리고 tcp 프로토콜의 윈도우 사이즈 말씀하시는게 맞나요? 이것을 어떻게 왜 측정했는지도 궁금하네요... 보통 이 윈도사이즈가 파이프 버퍼 크기랑 관계가 있긴 하지만 그건 어디까지나 시스템 내부적인 사항이라 일반 프로그래머한테는 관계없는 애긴데..

emptysky의 이미지

송신측은 수신측과 양방향 데이터 통신을 하나요?

『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』

dummy999의 이미지

---------------------배경 ---------------------
아참.. 제가 그걸 말안했군요..
상황은 이렇습니다.
두명의 개발자가 서로 통신프로그램을짰습니다.
한명은 서버를 개발하고 다른한명은 클라이언트를 개발합니다. 그게저입니다.
서로 개발하고 프로그램을 테스트하기위해서
프로그램을 서로 시스템에 복사를 햇습니다.

---------------------상황 ---------------------
그리고 통신을 하니까. 첨엔 잘되다가 나중엔 멈추더라구요.
그런데 서버쪽 회사는 허브에 어널라이져를 걸어서 그것을 분석했다고 하더라구요
뭐 그툴이 여러가지있는거같은데
아마도 그런툴이 옵서버나 스니핑프로나 이더리얼같은게 아닐까싶습니다.
여튼 제가 본툴은 옵서버라는 상용프로그램이었습니다.
그리고 서버개발쪽에서 파일을 하나보여주면서 자꾸 윈도우사이즈를 말하더라구요
그런데 그문서안에는 실제로 Window라는 항목이있었고 그것이 자꾸 감소하는것을
알수있었습니다.
0이되자 애플리케이션이 멈추더라구요.

---------------------어느쪽잘못인지..? ---------------------
그리고 그들이 말하길 클라이언트가 뭔가 건네주고있는데 그양이 자꾸 줄어서
결국0이되는데 0이되면 멈춘다고하니
누가 줄고있는지 몰겠습니다.

제가 뭔가 큰데이터를 조금씩 던져주다가 결국엔 없어서 그만큼주는건 아닐꺼같고
그쪽에서 수신큐같은것이 뭔가 싸여서 제가 크기만큼못주고 자꾸 사이즈가 주는게
아닐까 추측되더라구요..

하지만 아쉽게도 서버개발사는 테스트시점에서 개발자를 대려온게아니라.
슈퍼바이져를 모셔왔더라구요(실질적으로 그사람은 플그램은 잘모르는거같더라구요)

---------------------현재상황 ---------------------
서버개발쪽에서 어떻게 해결해서 윈도우사이즈가 줄지않는다고 했습니다.

---------------------결론 ---------------------
그게 무엇이며
왜 그런거며
저는 그것을 떠들어댈때 아무것도 못했는데 해결방안좀 알려주세요

참 아울러 TCP레이어의 ACK를 C프로그램에서 감지할수있는지 알고싶습니다.
왜냐면 어떤사람들은 ACK를 받지못해서그런게 아니냐? 라고 말도핟라구요..

------------------------------------
F/OSS bless you... ^^*

monac의 이미지

네트웍 프로그래밍 하고 테스트 하면서 문제점 찾아내는데, 허브 (아마 서버에 패킷검사툴을 뛰웠나보죠..) 단에서 패킷검사로 문제점 찾아내려 하는건 이해가 안가는 상황입니다. 옛날에 첨 컴터공부하는사람들이 프로그램 만든게 잘 안돈다고 컴파일러 다시깔고 바이러스 검사 하는거랑 비슷해 보이는군요.

윈도사이즈가 주는 이유는 데이터를 받는 측의 버퍼가 다 찼거나 그런 비슷한 이유로 생각됩니다. 보내는측이 어떻게 해서 tcp/ip하부의 윈도사이즈가 줄어드는건 저도 잘 모르겠습니다.

보내는측이 데이터를 보내는데 받는측이 데이터를 다 못받으면 윈도 사이즈가 너무 크다고 판단하고 윈도 사이즈를 줄여서 보내게 되죠. 윈도 사이즈라는건 tcp/ip가 패킷을 보내는 segment 크기라고 보시면 될거 같습니다.

서버/클라이언트라고 해도 양방향 통신이고 서로 데이터를 주고받을테니깐, 어느쪽 버퍼가 차서 윈도가 줄어드는지는 알 수 없습니다. 이정도 문제라면 프로그램 디버깅 해보면 금방 알수 있는 일일텐데 네트웍 관리자도 아니고 프로그래머가 네트웍 검사하면서 프로그램 분석해봤자 시간만 낭비가 아닐가 합니다.

데이터를 보내면서 몇 바이트를 보낼 예정인데, 몇바이트가 송신되었다... 이렇게 찍어보고... 받는쪽도.. read() 전과 후에 로그를 찍어보시면 금방 알수 있지 않을까 합니다.

emptysky의 이미지

dummy999 님의 글을 읽어보았는데 글이 어떠어떠한 조건인지 명확하지 않지만, 짐작가는대로 적어보겠습니다.

먼저 서버측에서 dummy999님이 짠 클라이언트에게 파일하나를 전송하면서 클라이언트 측의 윈도 사이즈를 체크한것 같습니다. (맞나요?)
파일을 전송받는 클라이언트의 윈도사이즈가 줄어든다는거는 여러이유가 있지만, 간단하게 설명하자면, 네트웤 상황에비해 절대적으로 cpu 처리능력(응용계층 처리율)이 떨어질때 윈도 사이즈는 0 으로 향하게 되고, 실제 0 이 된다면 네트웤 전송은 윈도사이즈 0의 ack 만이 전송되고 이는 곧 지연을 뜻하게 됩니다.
그래서 실제 빠른 수신데이터처리(실시간)이나 큰 데이터 단위로 수신받는 네트워크 프로그램들은 수신시 수신큐를 강제로 비워내죠
(바로 이부분을 처리를 한것 같습니다.)

Quote:
참 아울러 TCP레이어의 ACK를 C프로그램에서 감지할수있는지 알고싶습니다.
왜냐면 어떤사람들은 ACK를 받지못해서그런게 아니냐? 라고 말도핟라구요..

pcap 라이브러리를 사용하면 됩니다.

『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』

dummy999의 이미지

제 추측에도 서버가 수신큐(이게아마 윈도우사이즈크기같은데)에서 데이터를 전부 recv()하지못하고
있기때문이라고 생각합니다.
그러니까. 응답 ack에도 자꾸 그런메시지를 담아서 응답하고 그러다보니까.
자꾸 제쪽에서 사이즈를 줄여가면서 통신을 하는게 아닐까싶습니다.

사실 클라이언트 컴퓨터는 수많은 TASK가 떠있습니다. 약 20개정도가 백그라운드로 떠있습니다.
그리고 그런TASK의 운영을 위해서 OS를 NT4.0을 썻다고 합니다.
물론 지금이라면 리눅스로 바꾸고있겠지만. 예전에 NT4.0을 채택한 회사들은 NT를 버리지않고
지금까지 쓰고있다고들 합니다.
제가있는곳에는 윈도 2000이상 서버는 한대도 없던거같습니다. -_-;;

한가지더 알아낸사실인데
스위칭허브(이걸 인텔리전트 허브라고하던가?)를 쓰면 어널라이징이 안걸린다고 합니다.
그래서 더미허브(예전꺼 꼬진허브)를 써야한다고하네요.
여기서 어널라이징이란 분석툴(이더리얼, 스니핑프로, 옵서버)을 이용한 패킷감시를 의미합니다.

참 여기서 제가 말하는 어널라이징의 환경은
A ---(허브)---B
|
C
(A는 서버 B는 클라이언트 C는 엑스트라 -_-;;)
이런구조일때 C가 중간에서 A와 B의 패킷을 가로채는것을 의미합니다.

인텔리전트 허브에는 말그대로 지능적으로 그런 패킷가로채기를 감지하고 못하게 하는그런기능도
포함된게 아닐까 싶네요..

아이 모르겠습니다. 그거때문에 날밤까고 고생하고 허리는 디스크때문에 다리통증이 생기고
돈은 돈대로 박봉이고.. 그래서 여기다만 글을씁니다.
IT는 오픈소스로만 참여하시고 아직 무직자분들께서는 IT로는 그다지 승산이 없어뵈지않을까 생각됩니다.
정말 쓸때없는 말까지 해부럿군요..

그럼

------------------------------------
F/OSS bless you... ^^*

dummy999의 이미지

제 추측에도 서버가 수신큐(이게아마 윈도우사이즈크기같은데)에서 데이터를 전부 recv()하지못하고
있기때문이라고 생각합니다.
그러니까. 응답 ack에도 자꾸 그런메시지를 담아서 응답하고 그러다보니까.
자꾸 제쪽에서 사이즈를 줄여가면서 통신을 하는게 아닐까싶습니다.

사실 클라이언트 컴퓨터는 수많은 TASK가 떠있습니다. 약 20개정도가 백그라운드로 떠있습니다.
그리고 그런TASK의 운영을 위해서 OS를 NT4.0을 썻다고 합니다.
물론 지금이라면 리눅스로 바꾸고있겠지만. 예전에 NT4.0을 채택한 회사들은 NT를 버리지않고
지금까지 쓰고있다고들 합니다.
제가있는곳에는 윈도 2000이상 서버는 한대도 없던거같습니다. -_-;;

한가지더 알아낸사실인데
스위칭허브(이걸 인텔리전트 허브라고하던가?)를 쓰면 어널라이징이 안걸린다고 합니다.
그래서 더미허브(예전꺼 꼬진허브)를 써야한다고하네요.
여기서 어널라이징이란 분석툴(이더리얼, 스니핑프로, 옵서버)을 이용한 패킷감시를 의미합니다.

참 여기서 제가 말하는 어널라이징의 환경은

A ---(허브)---B 
       |
       C

(A는 서버 B는 클라이언트 C는 엑스트라 -_-;; )
이런구조일때 C가 중간에서 A와 B의 패킷을 가로채는것을 의미합니다.

인텔리전트 허브에는 말그대로 지능적으로 그런 패킷가로채기를 감지하고 못하게 하는그런기능도
포함된게 아닐까 싶네요..

아이 모르겠습니다. 그거때문에 날밤까고 고생하고 허리는 디스크때문에 다리통증이 생기고 그렇게 몇날몇일을 했고 해야할지 모르겠습니다.
(돈야기는 안하겠습니다. 그냥 미니멈 머니같다는 생각입니다.)
IT는 오픈소스로만 참여하시고 아직 무직자분들께서는 IT로는 그다지 승산이 없어뵈지않을까 생각됩니다.
정말 쓸때없는 말까지 해부럿군요..

그럼

------------------------------------
F/OSS bless you... ^^*

deathrow의 이미지

Windows Size감소의 원인은 거의 대부분이...
Recv 측에서 수신한 데이타를 다 읽어가지 않아서 발생하는 것입니다.
Windows Size라는 것은 현재 자신의 Recv Buffer 에서의 Free 영역에 대한 값입니다.
그 값이 계속 줄어 간다는 것은 TCP Data를 수신하여 버퍼에 담아두고 있는데, 상위 어플에서 Read를 하지 않아서 버퍼에 값이 계속 늘어나면서, 상대적으로 Windows Size는 점차 감소하는 것입니다.

한번 Recv Program 부분을 확인해 보시기 바랍니다.
서로간의 송/수신 처리시 데이타 길이및 처리 방식이 일치하는 지를 확인해 보십시요...

Windows Size감소는 아직 Read 하지 않는 Data가 많이 있다는 뜻이니까요... 그럼..이만..

==============================
= Crazy Fighter : Kill Them All =
==============================

익명 사용자의 이미지

dummy999 wrote:
A ---(허브)---B 
       |
       C

(A는 서버 B는 클라이언트 C는 엑스트라 -_-;; )
이런구조일때 C가 중간에서 A와 B의 패킷을 가로채는것을 의미합니다.


왜 필요없이 허브와 C라는 컴을 두고 패킷 스니퍼링을 하는지 모르겠군요 :(
그냥 서버 A나, 클라이언트 B에서 패킷 캡쳐하여 분석하면 됩니다.
emptysky의 이미지

Anonymous wrote:
dummy999 wrote:
A ---(허브)---B 
       |
       C

(A는 서버 B는 클라이언트 C는 엑스트라 -_-;; )
이런구조일때 C가 중간에서 A와 B의 패킷을 가로채는것을 의미합니다.


왜 필요없이 허브와 C라는 컴을 두고 패킷 스니퍼링을 하는지 모르겠군요 :(
그냥 서버 A나, 클라이언트 B에서 패킷 캡쳐하여 분석하면 됩니다.

손님으로 썻더니 쓴게 수정이 안되네요 ㅋㅋ

한가지 덧붙이자면 스위칭방식의 허브도 여러가지 방법으로 스니핑 할수 있습니다.

『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』

익명 사용자의 이미지

프로그램을 잘못짜서 그렇습니다.
서버프로그램 사양과 클라이언트 프로그램사양을 봐야
정확히 알겠지만, 일단, 클라이언트와 관계없이(클라이언트가 폭탄프로그램일지라도......)
서버가 멈춘다면 서버 잘못입니다.
그 어떤 이유도 통할 수 없습니다. 핑계를 대고 있군요.
레이어를 낮추어서 얘기하는 못된 버릇이군요.
마치 특정 프로그램이 안돌면, 운영체제 탓하다가,
이도 안되면, CPU가 잘못되서 ..., 램이...., 전원이 불안정.....
모 이런 격이군요.

모 어쩌구 하는 격입니다.

익명 사용자의 이미지

참고로 더미허브를 중간에 두고 패킷을 잡는 것은
더미허브가 브로드캐스트를 하기 때문에
C 가 쉽게 패킷을 캡쳐할 수 있는 거죠.
스위칭 허브에서 잡기 위해서는
스위칭 허브의 포트 미러링 기능을 써야 합니다.

chozo99의 이미지

Silly Window Syndrome 에 대해서 검색 해보시면 비슷한 상황이라고 판단 됩니다.

서버와 클라이언트간의 통신중에 wait time(sleep) 을 주시고

서버와 클라이언트간의 wait time을 맞추시면 ... 아마 될듯 ....

ps . 아마 비동기 통신으로 서버나 클라이언트가 처리 할수 없을 정도로 지속적인 많은패킷을 보냈거나 받았을 경우 이를 처리 하지 못하고 윈도우 싸이즈가 줄어드는걸루 알고 있습니다.

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