::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-05 22:09:37, Hit : 5207, Vote : 1270
 소켓의 전송크기는 얼마 ?

정윤옥님의 글
---------------------------
Socket통신시 받아들이수 있는 최대 데이타의 길이는 한정되어 있는지 가르쳐 주세요
한정되어 있다면 받아들일수 있는 최대 데이타의 길이는 얼마나 됩니까?
---------------------------

안녕하세요  김영대입니다

소켓의 데이터 전송크기는 원칙적으로 말한다면 제한이 없습니다 (?)
우리가 보통 애기하는 TCP/IP 프로토콜중 IP 가 실제 데이터를 실어 날으는
프로토콜인데 이 프로토콜은 IP 데이터그램(IP 계층의 전송단위)의 크기보다 튼
자료를 송,수신 한다면 내부에서 일정한 크기고 잘라서 보내고 받을때는 다시
몇개의 데이터그램으로 잘라진 데이터를 조합하여 사용하게 됩니다

우리가 보통 사용하는 소켓 함수중 send(), recv() 함수를 예를 든다면
send(10000 바이트) 를 했을때 IP 데이터그램이 한번에 1000바이트씩 보낼 수
있다면 1000 바이트씩 10번에 나뉘서(내부적으로) 보내게 되고 받는쪽에서는
10번이상(송신상에 에러가 없었다면 10번) 받아서(내부적으로) 조합하여 최종
사용자에겐 10000바이트를 주게 됩니다

또한 Send(10000 바이트) 하게되면 10000 바이트를 상대방(peer)에게 곧바로 보내는것이
아니라 다만 소켓이 송신할 데이터를 내부적으로 사용하는 PC의 송신버퍼에 복사하는
동작만 합니다... 그러면 송신 버퍼에 있는 10000바이트를 IP데이터그램으로 쪼개서 순차적으로
보내게 됩니다
그러므로 상대방도 Recv(10000바이트)하여 10000바이트를 바로 수신하는것이 아니라
사용하는 PC의 수신버퍼(수신된 데이터가 있다면)에 저장되어 있는 데이터를 사용자
프로그램 영역으로 읽어 들이는 동작을 합니다

정리한다면 사용자가 10000바이트를 상대방에게 send(10000바이트) 하면 그 즉시
PC의 송신버퍼에 저장하고 내부적으로 이 저장된 데이터를 IP데이터그램으로 쪼개서
송신을 시작합니다
데이터를 받는 상대방은 마찬가지로 쪼개진 IP데이터그램을 받아서 수신버퍼에 계속
쌓아두었다가 recv()함수를 호출하면 쌓아둔 데이터중 recv()시 지정한 읽을 바이트수만큼
꺼내서 주는 것입니다

그래서 프로그램상에서 사용하는 송,수신 크기는 별 의미가 없다는 것이죠
송,수신 성능은 내부에서만 동작하는 IP 데이터그램의 크기에 달려있다는 것입니다
결론적으로 MTU(Maximum Transfer Unit) 의 크기에 달려있습니다
MTU는 IP프로토콜이 한번에 전송할 수 있는 최대의 IP데이터그램 크기를 의미합니다
이론상 IP데이터그램의 최대 크기는 65536바이트 입니다
그러나 실제로는 IP 프로토콜의 데이터 전달 경로가 되는 선로의 종류에 따라 최대로 전송할 수
있는 데이터그램의 크기가 결정됩니다

가장 많이 사용되는 LAN 프로토콜인 이더넷의 경우 하드웨어적으로 데이터의 크기가 1500바이트
까지 허용되며, 직렬 포트 상에서 PPP 프로토콜을 사용하는 경우에도 1500바이트 입니다
또한 이전에 많이 사용했던 SLIP은 대부분 576바이트 입니다

그래서 이 MTU값을 에러가 거의 없는 선로에서는 크게 하는 것이 프로토콜 헤더로 인한
오버헤드를 줄이는 방법입니다
하지만 에러가 많은 선로의 경우에는 한 번 에러가 발생할 때 큰 데이터를 잃게 되어 손해보는
것도 크기 때문에 선로의 전송 품질에 따라 적당한 MTU 값을 택하는 것이 필요합니다
(일반적으로 이 MTU값은 TCP/IP 프로그램의 사용자가 결정하는 사항이 아니고, 선로나
시스템 환경에 의해 자동적으로 결정됩니다)
인터네트상에 보면 PC의 최적의 MTU값을 찾아주는 유틸리티가 있습니다






651   [윈도우즈 API] Windows 가 Shutdown 되는지 검사하기  김영대 2003/03/04 4293 1293
650   [일반/컴포넌트] 마우스로 ProgressBar의 Position 바꾸기  김영대 2006/02/28 5011 1292
649   [일반/컴포넌트] RichEdit 에 URL link 만들기  김영대 2004/08/04 5802 1292
648   [일반/컴포넌트] Treeview의 수평 스크롤바 감추고 스크롤 막기  김영대 2006/03/22 5657 1290
647   [윈도우즈 API] Windows Desktop에 직접 그림을 그리고(draw) 지우기(refresh)  김영대 2003/03/04 4637 1290
646   [시스템] 여러개의 DOS 명령어를 차례데로 실행하기  김영대 2004/10/21 6408 1289
645   [윈도우즈 API] 현재 키보드 입력 언어 구하기  김영대 2004/07/24 4819 1289
644   [윈도우즈 API] 다른 프로그램의 구동 디렉토리 알아내기  김영대 2003/03/07 4777 1287
643   [일반/컴포넌트] TOpenDialog 의 '선택','취소' 버튼 이름 바꾸기  김영대 2003/03/07 4173 1287
642   [시스템] 파일의 소유자와 도메인 구하기2  김영대 2004/09/25 4721 1286
641   [윈도우즈 API] 윈도우즈 탐색기에서 "Copy" 될 파일목록 구하기  김영대 2003/03/07 4873 1286
640   [시스템] 윈도우즈 화면 잠그기  김영대 2004/08/03 5068 1285
639   [윈도우즈 API] PrintScreen(PrtSc)키의 동작 막기  김영대 2003/03/07 5746 1285
638   [일반/컴포넌트] Access Violation at address ?????? 로부터 소스위치 알기  김영대 2003/03/07 6560 1284
637   [시스템] 파일이 다른 프로그램에 의해 사용중인지 검사  김영대 2003/03/07 5789 1283
636   [시스템] 프로그램에서 화면모드 변경하기  김영대 2003/03/04 4681 1283
635   [일반/컴포넌트] ListView의 타이틀 폰트 바꾸기  김영대 2005/03/31 5378 1282
634   [윈도우즈 API] 4가지 윈도우즈 관련 폴더의 path 구하기  김영대 2003/04/08 5692 1281
633   [COM/OLE] TWebBrowser에서 JavaScript 호출하기2  김영대 2004/10/10 6290 1280
632   [시스템] 드라이브 포맷(Format) API 함수  김영대 2003/03/04 4730 1280
631   [일반/컴포넌트] 두개의 RichEdit 사이에 내용 복사하기  김영대 2003/03/06 5459 1279
630   [일반/컴포넌트] 객체의 valid검사 Assigned() 대체  김영대 2005/07/29 4905 1278
629   [윈도우즈 API] Canvas의 색상수  김영대 2003/03/04 4126 1278
628   [일반/컴포넌트] MIME 타입에 해당하는 파일 확장자 구하기  김영대 2004/11/18 4802 1277
627   [일반/컴포넌트] StringGrid의 Cell에 입력 값 제한 하기  김영대 2003/03/04 5931 1277
626   [COM/OLE] 윈도우즈 "인터넷 등록 정보" 화면  김영대 2004/07/25 4112 1276
625   [일반/컴포넌트] 명령행 인자(command line argument) 사용하기  김영대 2003/03/05 4693 1276
624   [시스템] 한글 한 음절을 초성,중성,종성 음소로 분해하기('김' => 'ㄱ'+'ㅣ'+'ㅁ')  김영대 2004/10/22 7955 1275
623   [윈도우즈 API] 전체 화면(Full Screen) 만들기  김영대 2003/03/29 4990 1275
622   [일반/컴포넌트] 해상도(screen resolution)를 변경했는지 검사  김영대 2003/03/07 4501 1273
621   [COM/OLE] IE의 속성을 변경하여 뛰우기  김영대 2006/02/28 5467 1272
620   [COM/OLE] TWebBroswer 에서 오른쪽 마우스 클릭 막기  김영대 2004/11/24 5126 1271
619   [시스템] 윈도우즈에 설치된 모든 인증서(certificate) 정보 읽어오기  김영대 2004/10/29 5718 1271
618   [COM/OLE] ActiveForm의 OnDestroy 대용  김영대 2005/04/21 5445 1270
  [네트웍/인터넷] 소켓의 전송크기는 얼마 ?  김영대 2003/03/05 5207 1270
616   [윈도우즈 API] 화면캡처하기 Delphi3.0에서...  김영대 2003/03/04 4728 1270
615   [네트웍/인터넷] 네트워크 공유 설정/공유 사용 권한/해제 하기 (Windows NT/2000)  김영대 2004/11/06 5517 1268
614   [윈도우즈 API] 떠있는 모든 Microsoft Internet Explorer 죽이기  김영대 2003/03/29 4484 1267
613   [윈도우즈 API] Windows error beep 켜기/끄기  김영대 2003/03/07 4448 1266
612   [일반/컴포넌트] TPanel, TImage 에 Gradient 효과 주기  김영대 2003/03/07 4368 1266

[1][2][3][4][5][6][7][8] 9 [10]..[25] [다음 10개]
 

Copyright 1999-2020 Zeroboard / skin by zero