이전의 모든 답변이 잘못되었습니다. 실제로, 하나의 긴 send()
통화 또는 여러 개의 작은 send()
통화 를 발행하는지는 중요하지 않습니다 .
Phillip이 말했듯이 TCP 세그먼트에는 약간의 오버 헤드가 있지만 애플리케이션 프로그래머는 세그먼트 생성 방법을 제어 할 수 없습니다. 간단히 말해서 :
한 send()
번의 호출이 반드시 하나의 TCP 세그먼트로 변환되는 것은 아닙니다.
운영 체제는 완전히 무료로 모든 데이터를 버퍼와 하나 개의 세그먼트에 보내거나 긴 하나를 가지고 여러 개의 작은 세그먼트로 그것을 깰 수 있습니다.
여기에는 몇 가지 의미가 있지만 가장 중요한 것은 다음과 같습니다.
하나의 send()
호출 또는 하나의 TCP 세그먼트가 recv()
다른 쪽 끝에서 하나의 성공적인 호출로 변환 될 필요는 없습니다.
그 이유는 TCP가 스트림 프로토콜이라는 것입니다. TCP는 데이터를 긴 바이트 스트림으로 취급하며 "패킷"이라는 개념은 전혀 없습니다. 함께 send()
해당 스트림에 바이트를 추가로 recv()
당신은 다른 측면 오프 바이트를 얻을. TCP는 데이터가 가능한 한 빨리 다른쪽에 도달 할 수 있도록 데이터를 적절하게 버퍼링하고 분할합니다.
TCP를 사용하여 "패킷"을 보내고 받으려면 패킷 시작 마커, 길이 마커 등을 구현해야합니다. UDP와 같은 메시지 지향 프로토콜을 대신 사용하는 것은 어떻습니까? UDP는 하나의 send()
호출이 하나의 전송 된 데이터 그램과 하나의 호출로 변환되도록 보장 recv()
합니다!
TCP 만 있으면 모든 것이 스트림처럼 보입니다.