소켓은 예기치 않게 닫혔습니다
-
06-07-2019 - |
문제
서버에 대한 테스트 프로그램을 작성하고 있습니다. 테스트 앱에서는 많은 수의 클라이언트를 서버에 연결하려고하지만 잠시 후에는 다음과 같은 모든 종류의 오류를 얻습니다.
Connection reset by peer: socket write error
또는
java.net.SocketException: Connection reset
또는
java.net.ConnectException: Connection refused: connect
서버에 연결하는 모든 클라이언트에 새 소켓을 사용합니다.
누군가이 이상한 행동에 대해 나를 깨달을 수 있습니까?
해결책
불행히도 서버의 특성에 대한 세부 정보를 많이 제공하지 않았습니다. 일반적인 TCP 서버를 작성하고 있다고 생각합니다. 이 대답에서 나는 할 것이다 ~ 아니다 Java 특정 세부 사항에 대해 이야기하십시오.
짧은 조언은 다음과 같습니다. 클라이언트 연결간에 지연을 삽입하십시오. 그것 없이는 서버에 대한 DOS 공격을 적극적으로 시뮬레이션하고 있습니다.
더 긴은 아래를 참조하십시오.
일반적으로 TCP 서버는 1 만 생성합니다 청취 전화로 양말 (사랑스러운 C 인터페이스) int sockfd = socket(...)
기능 및 결과 전달 (sockfd
우리의 경우) bind()
그리고 listen()
기능. 이 준비 후 서버는 An을 호출합니다 accept()
서버가 파자마로 가파르게됩니다 (소켓이 차단으로 표시된 경우). 지구의 반대편에있는 클라이언트가 connect()
기능, 기능 accept()
(서버 측면) OS 커널의 지원으로 생성됩니다. 연결된 소켓.
가능한 실제 수 보류중인 연결 그것을 보면 알 수 있습니다 listen()
기능. listen()
a 백 로그 최대 연결 수를 정의하는 매개 변수 OS 커널 소켓에 대기해야합니다 (이것은 기본적으로 모든 연결의 합입니다. SYN_RCVD
그리고 ESTABLISHED
주). 역사적으로 권장 값입니다 백 로그 1980 년대에는 5 시대에 우리 시대에 비참한 5 가지가있었습니다. 예를 들어 freebsd 7.2에서 a 하드 제한 ~을 위한 백 로그 입력하여 추측 할 수 있습니다.
% sysctl kern.ipc.somaxconn kern.ipc.somaxconn: 128
그리고 페도라 10 :
% cat /proc/sys/net/core/somaxconn 128
추신
내 끔찍한 영어에 대해 죄송합니다.
다른 팁
웹/앱 서버는 한 번에 한정된 양의 클라이언트 만 서비스 할 수 있습니다.
이 제한에 도달하면 연결 거부/재설정이 수신됩니다.
당신의 질문에 대한 답변을 바랍니다.
건배
OS와 웹 서버가 얼마나 빠르고 얼마나 빠르고 몇 개의 연결을 시작/수락 할 수 있는지 제한이 있습니다. 서버에서 성능 테스트를 수행하려면 Apache Jmeter가 이러한 제한에 대한 솔루션이 있으므로 시도하십시오.