기본 사항을 먼저 알아 보겠습니다.
모든 소켓에는 수신 및 송신 버퍼가 있습니다. 네트워크 하드웨어가 새로운 패킷 및의 도착을 알리는 경우 수신 버퍼가 가득차면 패킷이 삭제됩니다. 버퍼 크기는 SO_RCVBUF
및 SO_SNDBUF
소켓 옵션을 통해 제어됩니다 (setsockopt(3)
참조). OS는 몇 가지 기본값을 설정합니다 (그리고 /etc/sysctl.conf
파일이 있습니다).
가
~$ sysctl -a|grep space
net.inet.tcp.recvspace=16384
net.inet.tcp.sendspace=16384
net.inet.udp.recvspace=41600
net.inet.udp.sendspace=9216
는 TCP 및 UDP의 차이점은 이전의 데이터 시퀀싱 및 손실 된 패킷의 재송 플러스 유량 조절을 담당한다는 것이다 (느린 리더 다운 빠른 감속 :이 BSD 시스템에 작가), 후자는 그렇지 않습니다.
그래, UDP를 사용하여 파일을 전송하는 것이 가장 좋지는 않지만 이지만 작동하려면 옵션을 사용하십시오.하나는 TCP의 일부를 재발 명하고 TCP에 대한 재 발명의 오버 헤드를 고려해야합니다. 다시 말하지만, UDP는 일부 패킷 재정렬/손실 (예 : 오디오/비디오 스트림)을 허용 할 수있는 애플리케이션에 가장 적합하다는 것이 일반적입니다.
그렇다면 모든 소켓에는 데이터를 송수신하기위한 별도의 스레드가 필요하다는 오해 된 생각이 있습니다. 이는 사실과 거리가 있습니다. 많은 뛰어난 고성능 네트워크 응용 프로그램이 스레드없이 작성되었지만 비 차단 소켓과 일부 폴링 메커니즘을 사용합니다 (select(2)
, poll(2)
, epoll(7)
참조). 질문 자체에
: 응용 프로그램이 소켓에 충분한 공간을 유지하는 것이 너무 바빠서 경우
예, 커널이 패킷을 드롭 수는 '버퍼를받을 수 있습니다. 그러나 각 소켓에는 자체 소켓이 있기 때문에 제어 및 데이터 스트림을 분리하면 도움이됩니다. 개인적으로는 간단한 TCP 서버 설정을 위해 갈 것입니다. 포트에서 수신 대기하고 클라이언트 당 연결을 수락하고 TCP 스트림 상단에 의미있는 프로토콜을 구현하십시오. UDP 및 저수준 프로토콜 상태 머신으로 게임하는 것은 많은 재미를 낳는다는 것에 동의하지만, 이미 완료되었으며 수십 년에 걸친 연구가 TCP 성능 튜닝에 들어갔다. 결국 중요한 것은 응용 프로그램의 안정성 (첫 번째)과 성능 (초)입니다.
희망이 도움이됩니다.
가장 우수한 답변 Nikolai. 나는 지난 밤에 실제로가는 방법이 TCP와 NIO가 될 것이라고 생각하고있었습니다. 내 장치가 너무 많은 스레드를 처리 할 수 없으며 def가됩니다. 들어오는 요청이 많습니다. – Gubatron
아시겠습니까? 대답을 수락 할 수 있습니까? :) –
UDP는 데이터를 실시간으로 업데이트해야하고 재전송 비용을 겪을 수없는 경우에만 유용합니다. 이러한 연결의 예로는 스트리밍 비디오/음악, 대기 시간이 중요한 실시간 게임 또는 수신 청크에서 CRC 체크로 어쨌든 데이터 청크가 확인되는 파일 전송 (FTP)이 있습니다. –