작은 사이즈( 50~110bytes)의 패킷을 TCP로 빠르게 통신하는 방법은 뭐가 있을까요?

digitie의 이미지

현재 VxWorks 5.4와 윈도간에 TCP로 통신을 하고 있습니다. 프로토콜상의 메세지 사이즈는 대략 50~110바이트 사이입니다.

기능 동작은 잘 합니다. 하지만, 메세지를 주고 받는데 걸리는 시간이 너무 깁니다. 100바이트 정도 되는 메세지가 한번 왕복하는데 약 150~200ms 정도 걸립니다.

현재 환경을 말씀드리면 VxWorks 5.4가 탑재된 장비와 윈도가 설치된 PC 간에는 10Mbps 이더넷으로 연결 되어 있고, TCP로 1:1 통신합니다. 현재 테스트 환경에서는 VxWorks에서는 TCP로 주고 받는 단 하나의 타스크만이 돌아가고 있고, 윈도에서도 별다른 부하는 없습니다.

속도는 윈도상에서 QueryPerformanceCounter 함수를 이용하여 메세지가 한번 왕복하는데 걸리는 시간을 측정하였습니다.

메세지를 주고 받는 방식 및 구체적인 시간 측정 방식은 아래와 같습니다.

A (VxWorks) B (Windows)
-------------------------------------------------------
(테스트를 위해 VxWorks측에서 TCP로 신호를 하나 날리고,
윈도에서는 그 때를 기준으로 타이머를 구동합니다.)
MSG (100bytes) ------------------->
<------------------- ACK (3bytes) (TCP상의 ACK아닙니다)

<------------------- MSG (100bytes)
ACK (3bytes) ------------------->
(윈도가 ACK를 받으면 타이머 구동을 멈추고
시간을 출력합니다.)

인터넷에서 이것저것 알아보니 MTU보다 패킷 사이즈가 작은 경우 setsockopt를 통해 버퍼 사이즈를 줄여주면 좋다고도 하고, TCP_NODELAY 옵션을 통해 TCP 상의 ACK를 기다리는 시간을 없애는 것도 효과적이라고 하는데, 버퍼 사이즈를 줄이는 것은 별 재미를 못봤습니다. 어떨때는 꽤 빠른 응답을 보여주다가도 더 느려질때도 있더군요. TCP_NODELAY는 안타깝게도 현재 사용중인 VxWorks에서는 지원을 하지 않아 윈도상에서만 켰는데, 조금 빨라지는 것 같기는 합니다만 오차범위 안이더군요.

잡설이 길었습니다. 질문을 정리해서 말씀드리면, 작은 사이즈의 메세지를 TCP상에서 주고 받을 때, 응답성을 높이는 방법은 어떤게 있을까요?

jick의 이미지

왠지 제 생각엔 쉬운 방법이 없을 것 같네요. -.-

Nagle's algorithm 때문에 저렇게 작은 패킷을 연속으로 여러 번 보내는 경우 사이에 상당한 delay가 생깁니다. (한 개씩만 주고받는 경우에는 문제가 없습니다.)

이런 경우 ACK와 바로 다음에 보내는 MSG를 합쳐서 하나의 packet으로 보내면 확실히 문제를 해결할 수 있습니다. 덤으로 system call을 두 번에서 한번으로 줄이는 효과도... -.-

byung82의 이미지

TCP상에서 굳이 ACK를 받으실 이유가 있으신지 모르겠습니다.
일단 Protocol을 다시 한번 보시고 필요없는것은 삭제하시는게 맞다고 보입니다.
윈도 상이시면 IOCP구현으로 성능향상을 올릴수 있습니다.
만약 Multi platform이 목적이시라면 거기에 맞게 epoll, IOCP를 같이 구현한 라이브러리를 아니면 ACE Framework를
사용하시는것도 좋습니다.
그럼

digitie의 이미지

답변 감사합니다.

ACK를 없애는 것에 불가능합니다. 표준에 있는 규약이라 마음대로 바꿀 수 없거든요. 맘 같아선 메세지 하나에 다 처리해버리고 싶지만 어쩔 수 없네요 ㅜㅡ

윈도쪽에서 특별히 여러개의 클라이언트를 다룰 일이 없고, 프로그램상에서 IO로 인한 다른 병목이 없어서 IOCP가 얼마나 효율적일지는 모르겠습니다. 뭐든 한번 해 봐야죠.

다시 한번 답변 감사드립니다. (__)

showmethemoney

showmethemoney

byung82의 이미지

꼭 병목이 있어야만 IOCP를 쓰는것이 아니기 때문에 ^^;;
^^; 그럼

seoleda의 이미지

TCP 표준에 있는 ACK 처럼, 슬라이딩 윈도우를 사용하는 것은 어떨까요?
^^

alwaysrainy의 이미지

비슷한 경우가 있었는데, 결국에는 메시지 뒤에
dummy를 추가하여서 메시지 사이즈를 늘렸습죠..

---------------------------------------
세계는 넓고, 할일은 많다.

---------------------------------------
세계는 넓고, 할일은 많다.

jinyeong의 이미지

responsibilty 가 목적이시라면,
TCP_NODELAY option로 바로 nagle's algorithm을 끄시는게 좋을 것 같습니다.

vxworks에서 TCP_NODELAY를 지원하지 않고 항상 nagle's algorithm을 켠 상태로

통신을 해야한다면, vxworks에서 send하는 데이터는 MTU 사이즈가 되도록 payload를 붙혀서

보내시는 것이 좋을 것 같습니다.

tcp를 꼭 써야 하는 상황이 아니라면 udp로 비슷한 구현을 가볍게 하시는 것도 괜찮을 것 같네요.

--
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

댓글 달기

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