2010-06-22 2 views
2

나는 방금 SendBufferSize보다 큰 데이터를 보내는 방법에 대한 질문을했고 대답은 두 부분으로 보내질 것입니다.SendBufferSize보다 큰 데이터를 전송할 때 데이터는 어떻게 수신됩니까?

두 번째 질문은이 데이터를 어떻게 받습니까? 네트워크 스트림에서 완료 될 것인가, 아니면 그것을 분할 할 것인가?

첫 번째 질문 : Can you send a file larger that the SendBufferSize throuh a TcpClient?

답변

2

닷넷은 당신을위한 데이터의 분할을 처리합니다. 당신은 쓰지 않고 SendBufferSize보다 큰 패키지를 쓰거나받을 수 있습니다 (성능에 대해 너무 신경 쓰지 않는다면).

1

프로토콜에는 message framing이 필요합니다.

재미있는 사실 : SendBufferSize보다 작은 메시지를 보내는 경우에도이 기능이 필요합니다. :)

0

데이터가 수신시 분할 될 가능성이 있으므로 모든 데이터를 수신하면 데이터를 다시 작성해야합니다.

3

UDP, TCP는 개별 "메시지"전송을 허용하는 프로토콜이 아니며 동일한 형식으로 수신자에게 전달됩니다. 오히려 바이트 스트림을 보내고받습니다. 후드 아래에서

, 당신의 데이터는 IP 패킷으로 분할됩니다 8192 BTW 기본적으로, 하나의 IP 패킷에 맞는 것보다 훨씬 더 높은 값 (IP 패킷의 최대 크기는 관련이 SendBufferSize의 관계 MTU에 있지만 대개 1500 바이트 미만). 예 :

  1. Socket.Send (2000 바이트)
  2. IP 패킷 # 1 (1460 바이트)
  3. IP 패킷 # 2 (540 바이트)도

: 다중 Socket.Send()의 데이터 s가 병합 될 수 있습니다 (Nagle's algorithm). 예 :

  1. Socket.Send (1000 바이트)
  2. Socket.Send (1000 바이트)
  3. IP 패킷 # 1 (1460 바이트)
  4. IP 패킷 # 2 (540 바이트)

수신자가 2 가지 경우를 구별 할 수있는 방법이 없습니다. 효율적인 이유 때문에 수신 측에서 다른 크기의 버퍼로 데이터가 전달 될 수 있습니다.

결론 : TCP를 사용하면 동일한 숫자와 동일한 크기의 패킷을받을 수 없습니다. 필요한 경우 Stephen Cleary의 제안에 따라 크기 정보를 추가하거나 UDP와 같은 프로토콜을 사용하거나 안정성이 필요한 경우 SCTP을 사용해야합니다. 그러나 TCP를 통한 SCTP의 다른 개선 사항에 관심이있는 경우를 제외하고는 과도하게 보입니다.

4

TCP는 메시지 전용 프로토콜이 아닙니다. 이것은 스트림 기반 프로토콜이며 우리를 위해 데이터를 분할합니다. Lemme이 핵심 섹션으로 이동합니다. TCP 세그먼테이션 및 단편화의 경우에는 두 부분이 있습니다.

세그먼테이션은 TCP (전송 계층)에서 발생합니다. 이것은 MSS와 Window Size의 두 가지 매개 변수에 따라 다릅니다. MSS는 장치가 수신 할 수있는 세그먼트의 최대 크기를 결정합니다. MSS는 TCP 옵션을 통해 초기 연결 설정 중에 통신됩니다. 데이터 흐름의 각 방향은 다른 MSS를 사용할 수 있으며 운영 체제가이를 결정합니다. 그러나 수신자가 수신 확인을 기다리고 수신 호스트에서 창을 업데이트하기 전에 연결의 수신 측에서 한 번에 버퍼링 할 수있는 최대 데이터를 통신하기 위해 수신자가 창 크기로 TCP 크기를 보냅니다. 즉, 호스트는 수신자의 창 크기를 소모하기 전에 여러 세그먼트 (MSS 요소)를 보낼 수 있습니다.

단편화는 두 가지 방법으로 IP (네트워크 계층)에서 발생합니다. 송신자와 수신자 사이의 통신 경로에 MTU 제한이있는 장치가 없으면 단편화가 이더넷 (1500 바이트)의 MTU만을 충족시킵니다. 그러나 송신자와 수신자간에 MTU 제한이있는 중간 장치가있는 경우 IP 계층 (인터넷 프로토콜)은 데이터 그램 조각화를 수행하므로 패킷이 최대 전송 단위가 작은 링크를 통과 할 수 있도록 형성 될 수 있습니다 MTU)보다 작습니다. MTU 제한이있는 중간 장치의 경우 송신자는 경로 MTU 검색을 배포하여 수신기에 대한 네트워크 경로의 최소 MTU를 결정하고 네트워크 내에서 IP 조각화를 피하기 위해 동적으로 MSS를 조정해야합니다. 경로 MTU 검색은 나가는 패킷의 IP 헤더에 DF (Do not Fragment) 옵션을 설정하여 수행됩니다. MTU가 패킷보다 작은 발신자와 수신자 간의 통신 경로에있는 모든 장치는 해당 패킷을 삭제하고 장치의 MTU가 포함 된 ICMP "Destination Unreachable (Datagram Too Big)"메시지를 보낸 사람에게 회신합니다. 이 정보는 송신자가 가정 된 경로 MTU를 적절히 줄이는 것을 허용합니다.

따라서 MSS와 MTU 간의 관계에 이르게됩니다. RFC 791은 "모든 호스트는 576 옥텟의 데이터 그램을 수용 할 준비가되어 있어야합니다 (전체 또는 조각으로 도착하는지 여부에 관계없이)"라고 명시합니다. 따라서 IP 네트워크의 최소 MTU는 576입니다. TCP의 경우 TCP 헤더의 경우 20 바이트, IP 헤더의 경우 20 바이트를 차감하여 TCP의 표준 MSS로 536 바이트를 제공합니다.

이제 재 조립 부분으로 들어갈 수 있습니다. 단편화는 중간 장치의 MTU를 기반으로 발생할 수 있지만 재구성은 대상 장치에서만 발생합니다. TCP는 세그먼테이션을 처리하지만 대상 장치에서 TCP는 순서를 처리하지만 세그먼트의 재구성은 응용 프로그램에서주의를 기울여야합니다.

따라서 전체 메시지 기반 통신 만 필요하고 안정성이 중요하지 않은 경우 UDP를 선택해야합니다. 그러나 분할로 큰 데이터를 보낼 수있는 경우 UDP는 패킷의 순서를 보장 할 수 없으며 재전송과 같은 오류 수정 메커니즘이 없으므로 패킷 손실을 처리 할 수 ​​없습니다. .

UDP와 마찬가지로 메시지 기반 통신이 가능하지만 신뢰할 수있는 주문형 배달, 정체 제어 및 멀티 스트리밍, 멀티 태스킹, 원산지 MTU 검색, SCTP를 선택해야합니다. 그러나 네트워크에 레거시 NAT 시스템이있는 경우 UDP에서 SCTP를 캡슐화해야 할 수도 있습니다.

관련 문제