2017-12-27 31 views
0

TCP 소켓을 통해 데이터를 전송하기위한 일반적인 기능은 아래와 같다 :전송 데이터()

ssize_t 보내기 (INT의 sockfd와, CONST 보이드 * 버퍼를 size_t 길이가 플래그 INT);

일반적으로 데이터 크기가 MSS보다 크면 TCP가 데이터를 조각화합니다. 그러나 send() API는 '길이'의 데이터를 보내고 나가는 버퍼에 보낼 수있는 데이터의 양과 개발자의 책임으로 반환 값을 확인하고 나머지 데이터를 다시 보냅니다.

그렇다면 '길이'값이 MSS 이상인 경우 TCP가 자동으로 데이터를 조각화하지 않습니까? 그렇지 않다면, 우리는 어떻게 한 번의 send() 호출로 내부적으로 데이터를 조각 내기 위해 TCP를 만들 수 있습니까?

답변

3

일반적으로 데이터 크기가 MSS보다 크면 TCP는 데이터를 조각화합니다.

일반적으로는 아닙니다. 항상. 그렇지 않으면 MSS는 확실한 의미가 없습니다.

그러나 보내기() API는 반환 값을 확인하고 다시 보내 나가는 버퍼로 전송 될 수있는 데이터의 어떤 양의 데이터 반환의 '길이'양 및 개발자의 책임을 보내드립니다 있다고한다 나머지 데이터.

수정.

이 두 문은 충돌하지 않습니다. send()은 데이터를 소켓 송신 버퍼로 전송합니다. TCP는 MSS, 혼잡, 수신 창 등의 메모를 취하여 거기에서 네트워크로 전송합니다.

따라서 '길이'값이 MSS보다 크면 TCP가 자동으로 조각화되지 않습니다. 자료?

위 참조. TCP는 send()에 제공된 매개 변수 값이 아닌 소켓 전송 버퍼에있는 것을 처리합니다.

아니요 그렇다면 send() 호출로 데이터를 내부적으로 조각 낼 TCP를 만들 수 있습니까?

수 없습니다. TCP 세분화를 제어 할 권한이 없습니다.

+0

정말 고마워요. 지금은 매우 분명합니다. – Ghansham

0

스트림 소켓의 경우 길이가 단일 패킷으로 전송 될 수있는 경우 네트워크 레이어는 실제로이를 여러 패킷으로 자동 분할합니다. OS가 스트리밍 된 데이터를 분할하는 방법을 제어하는 ​​방법은 거의 없지만 약간의 영향을 미치는 소켓 옵션 (예 : TCP_NODELAY)이 있지만 대개 큰 패킷을 보내는 것에 대해서는 큰 차이가 없습니다.

+0

우리는 TCP 계층에서 단편화를 제어 할 수 없다는 뜻입니까? – Ghansham

+1

네트워크 레이어 =이 경우에는 전송 레이어입니다. 나는 당신이 더 일반적으로, 아마도 "네트워크 스택"을 의미한다는 것을 안다. 이 질문에 대해서는 IP가 아닌 TCP가 잘립니다. –