2014-06-12 7 views
-1

TCP를 통해 데이터를 수신하려면 수신 한 패킷의 크기가이 버퍼보다 ​​큰 경우 기본 크기의 버퍼를 설정해야하므로 보낸 바이트를 모두 읽을 때까지 루프해야합니다 . 예를 들어, 4096 바이트를 받았고 리더 버퍼가 1024로 설정되어 있으면 전체 패킷을 얻으려면 4 번 반복해야합니까?TCP 패킷 버퍼 읽기

각 루프, 연결 또는 운영 체제에서 다음 1024 바이트를 주문하면 메모리에 모두 4096이 저장되어 있습니다.

저급 수준의 모든 기능에 대해 좋은 기사가 있습니까?

답변

1

귀하의 질문은 응용 프로그램 계층 아래의 레이어와 관련이 많지만 가능한 한 최선을 다해 답변하려고 노력합니다.

NIC (네트워크 인터페이스 카드)는 패킷 수집과 OS가 패킷을 수집하기 위해 필요한 모든 작업을 수행합니다. 궁극적으로, 스트림 읽기를 수행하면 OS가 예약 한 메모리에서 데이터를 가져오고 들어오는 정보 복사본을 지속적으로 저장합니다.

질문에 대답하려면 예. 당신은 확실히 사본을하고 있습니다. 복사본의 사본은 NIC 내의 버퍼로 비트가 읽히고 OS는 어딘가에 넣고 스트림을 읽을 때 복사합니다.

나는 대학 수준의 네트워킹에서 일반적인 과정만큼이나 좋은 기사를 잘 모릅니다. 나는이 주제에 관한 책을 제안 하겠지만 다른 네트워킹 교과서에 대해 많은 경험을하지 않아서 서로에 대한 제안을합니다.

편집 : 스트림 읽기를 실행할 때 실행되는 정확한 코드를 알고 싶다는 느낌을 갖습니다. 언어를 지정했는지는 알 수 없지만 C# 스트림 소스에 대한 링크는 다음과 같습니다. Microsoft Stream.cs source code

2

TCP 구현에는 4KB보다 큰 수신 버퍼가 있습니다. 따라서 보낸 사람은 두 번째 1KB를 보내기 전에 첫 번째 1KB를 받기를 기다리지 않습니다. 작은 버퍼 만 수신하면 TCP 계층에 추가 호출이 발생합니다.

그러나 작은 버퍼를 사용하면 "짧은 패킷"이 전송되어 ACK 및 Nagling이 지연되어 비효율적이 될 수 있습니다. 일반적인 이더넷 및 인터넷 네트워크를 통한 TCP의 경우 2KB는 최소 일반 전송 버퍼 (일반적인 MTU보다 크기 때문에)이지만 8KB 이상을 권장합니다.