문제

온라인에서 다양한 사이트와 튜토리얼을 읽었지만 여전히 혼란스럽습니다.메시지가 IP MTU보다 큰 경우 send() 보낸 바이트를 반환합니다.메시지의 나머지 부분은 어떻게 되나요?내가 전화할까? send() 다시 한 번 메시지의 나머지 부분을 보내시겠습니까?아니면 IP 계층이 자동으로 처리해야 하는 것입니까?

도움이 되었습니까?

해결책

TCP를 사용하는 경우 제시된 인터페이스는 바이트 스트림입니다. 바이트 스트림이 연결의 한쪽 끝에서 다른 쪽 끝에서 어떻게되는지 걱정할 필요가 없습니다. IP 계층의 MTU를 무시할 수 있습니다. 실제로 IP 계층을 완전히 무시할 수 있습니다.

전화 할 때 send() 컴퓨터의 TCP 스택은 Send 통화로 푸시하는 바이트 스트림에 필요한 모든 세부 사항을 처리합니다. recv() 연결의 다른 쪽 끝에서 호출.

기억해야 할 한 가지는 TCP를 사용하면 스트림을 다루고 있다는 것입니다. send() 데이터가 여러 번 도착할 수 있습니다 recv() 전화 및 다중 send() 통화는 데이터가 단일로 도착할 수 있습니다 recv() 전화. 당신은 이것을 통제 할 수 없습니다. 당신은 바이트 스트림과 각 호출을 다루고 있습니다. recv() 1에서 현재 미결제 수로 몇 바이트를 반환 할 수 있습니다 (적절한 버퍼가 recv() 전화).

논평자들이 요청한 이후;)

대부분의 TCP 스택에서 send() TCP 스택의 버퍼가 가득 차서 TCP 창도 가득 차서 흐름 제어가 작동 중이기 때문에 모든 것을 보내지 못할 가능성이 가장 높습니다. 이는 원격 종료가 일부 데이터를 추가 할 때까지 더 이상 데이터를 보낼 수 없습니다. 그리고 당신을 대신하여 더 이상 버퍼링 할 준비가되어 있지 않습니다. 나는 거부 할 TCP 스택을 발견하지 못했습니다. send() MTU 고려 사항만으로도 일부 내장 내장 시스템이 슬림 한 내장 시스템이 그렇게 행동 할 수 있다고 생각합니다 ...

어쨌든 send() 제공 한 바이트 수보다 적은 수익을 반환하면 어느 시점에서 나머지 데이터를 재현해야합니다. 자주 send() 모든 데이터를 보낼 수있을 때까지 차단하고 기다릴 것입니다. 소켓을 비 블록 모드로 설정하면 모든 것을 보내지 않으면 보내지 않으면 보내지 않아도됩니다. 단단한 루프 ...

사용중인 운영 체제에 대해보다 구체적으로 사용하는 것이 유용 할 것입니다.

다른 팁

패킷이 너무 커서 네트워크를 전송할 수 없는 경우 발신자에게 패킷 크기를 줄이고 다시 시도하라는 신호를 보내는 ICMP 조각화 힌트가 전송됩니다.

TCP를 사용하는 경우 이러한 모든 세부 사항은 네트워크 계층에서 처리할 것으로 예상됩니다.경로를 따라 가장 낮은 MTU를 파악하기 위해 최신 IP 스택이 실제로 뒤에서 수행하는 작업은 다소 흑마술이 된 것 같습니다.

WRT UDP는 여전히 스택이 조각화될 것으로 예상할 수 있지만 실제로 UDP의 사용 사례를 고려하면 이상적이지 않습니다.애플리케이션에 따라 경로 MTU를 명시적으로 이해하면 더 나은 성능을 얻을 수 있습니다.

...send() 질문에서 일부 스택은 다르게 동작하지만 WRT 처리는 코드가 동일해야 합니다.전송할 데이터가 100바이트라고 가정해 보겠습니다.send()는 전송된 10바이트를 반환합니다.전체 메시지를 보내기 위해 모두 와이어 밖으로 푸시될 때까지 나머지 90바이트로 send를 계속 호출해야 합니다.

Windows 플랫폼에서 차단 소켓을 사용하면 send()는 일반적으로 모든 것이 전송된 후에 반환됩니다.다른 플랫폼에서는..Linux 등에서는 데이터를 푸시하기 위해 더 자주 계속 전송해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top