2011-10-09 4 views
1

나는 표준 C 라이브러리 함수를 알고있다. fwrite와 fread는 쓰기와 읽기 시스템 호출의 래퍼를 버퍼링하는 버퍼이며, 성능상의 이유로 버퍼가 사용된다. 내가 이해하지 못하는 것은 소켓 프로그래밍 함수에서 버퍼의 역할을 읽고 쓰는 것입니다. 파일 버퍼와의 차이점 및 유사점을 강조 표시하여 해당 파일의 용도를 이해하는 데 도움을 줄 수 있습니까?소켓과 버퍼

난 당신이 한 번에 귀하의 정보를 한 바이트를 전송하는 경우

답변

3

커널이 패킷을 수신하면 해당 데이터를 어딘가에 넣어야합니다. 버퍼에 저장합니다. 앱이 다음 읽기를 수행하면 해당 버퍼에서 데이터를 가져올 수 있습니다. UDP 연결이 있고 앱이 해당 버퍼를 읽지 못하면 버퍼가 가득 차고 커널은 수신 된 패킷을 버리기 시작합니다. TCP 연결이 있으면 버퍼에 여유 공간이있는 한 패킷을 확인하지만 이후에는 더 읽을 수 없다는 신호를 보냅니다.

네트워크 인터페이스가 부족한 리소스이기 때문에 쓰기 버퍼가 필요합니다. 일반적으로 커널은 패킷을 즉시 보낼 수 없습니다. 큰 write()를 수행하면 수백 개의 패킷으로 잘게 될 수 있습니다. 따라서 커널은 해당 데이터를 버퍼에 저장합니다. 작은 글을 많이 쓰면 버퍼도 잘 작동합니다 (Nagle's algorithm 참조).

+0

명확하고 정확한 답변을 해주셔서 감사합니다. – GionJh

2

상상 ... 소켓 프로그래밍 초보자입니다. 100 바이트 패킷을 생성하여 1 바이트를 보내고, TCP 연결 인 경우 구현에 따라 더 보낼 때까지 syn/ack를 얻을 때까지 기다릴 것입니까? 나에게 비효율적이라고 들린다.

대신 디스크에 쓰기 전에 데이터를 저장하는 것과 마찬가지로 버퍼를 사용하여 많은 양의 데이터를 저장하고 단일 패킷으로 보낼 수 있습니다.

+1

이 전략은 http://en.wikipedia.org/wiki/Nagle%27s_algorithm이라고하며이 기능을 중지 할 수 있습니다. –

+0

@yi_H 이름이 알았다 :-) 고마워! 그리고 예, 네트워킹 라이브러리의 구현 자보다 패킷을 보내는 방법을 더 잘 알고 있다고 생각되면 비활성화 할 수 있습니다. – corsiKa

+0

아니요, 패킷을 즉시 보내려면 비활성화 할 수 있습니다. 지연은 대역폭 낭비보다 더 중요 할 수 있습니다. –