TCP 연결을 위한 소켓이 있고 나중에 bind()
프로그램 을 실행할 때 문제가 발생할 수 있습니다. 그럼에도 불구하고 커널은 여전히 열린 소켓과 관련된 리소스를 소유할 수 있기 때문입니다.AF_INET
close()
close()
그러나 Unix 도메인 소켓과 관련된 이 문제에 대해서는 잘 모르겠습니다.
지금까지 내가 본
그것을 사용하려면 고유한 경로가 필요합니다
bind()
. 호출 시 경로가 존재하지 않아야 하며bind()
파일은 로 표시됩니다bind()
. (단, 파일 시스템에 표시될 수도 있고 표시되지 않을 수도 있습니다. 경로가 특수 문자로 시작되면 파일이 파일 시스템에 표시되지 않습니다\0
. )파일이
unlink()
-ed가 아닌 경우 커널은 닫힌 후에도 관련 리소스를 유지하며 소켓은 완전히 작동합니다.
질문:
어느 누구도 Unix 도메인 소켓을 사라지게 할 수 close()
없기 때문에 unlink()
두 사람 모두 이 작업을 안정적으로 수행하거나 소켓과 관련된 모든 리소스를 포기하도록 커널을 트리거할 수 있습니까?
reuseaddr
과 가 동시에 호출되면 오류가 발생할 close()
수 있습니까?unlink()
편집(댓글 및 답변 후):
따라서 바인딩된 AF_LOCAL 소켓은 다음과 같습니다.
unix_domain_socket_inode
-> binded to a socket
-> associated with a file (path)
수명 은 unix_domain_socket_inode
다음과 같은 경우까지 지속됩니다.
- 무언가가 소켓을 열어두거나(소켓이 닫히지 않음)
- 연관된 경로가 있습니다
1.만 참이라면 개방형 소켓과 inode가 있고 모든 것이 정상입니다.
2.만 true인 경우 inode에 연결된 경로가 있으므로 커널은 이를 정리할 수 없지만 들어오는 연결을 처리할 소켓 리소스가 부족하기 때문에 작동하지 않습니다. 그것은 심지어 평범한 파일도 아니며, 바쁘게 작동하는 소켓의 과거 영광의 죽은 껍질일 뿐입니다.
AF_INET 연결의 경우 주소 재사용은 더 나은 가용성을 위한 설계 선택입니다.
AF_LOCAL의 경우 나머지 파일은 이전 디자인 선택의 아티팩트이므로 커널 자체가 close()
호출 시 한 번에 생성된 파일을 자동으로 정리하는 것을 방지합니다. 연관된 숨김 메커니즘이 없으므로 커널은 close()
a를 호출한 후 이 리소스를 유지할 것으로 예상합니다.
답변1
이 경우 TIME_WAIT
커널의 TCP 연결 상태 뒤에 있는 이론적 근거를 이해하는 것이 중요합니다. 이 상태의 목적은 동일한 포트에 새 연결이 설정되기 전에 해당 연결과 관련된 모든 패킷(더 긴 경로가 걸리거나 지연될 수 있음)이 네트워크에서 배출되도록 허용하는 것입니다. 이렇게 하면 새 연결이 이전 연결과 관련된 패킷을 수신하지 않도록 할 수 있습니다. 이 reuseaddr
옵션을 사용하면 개발자는 "대기 수행 안 함" 메시지를 전달할 수 있습니다.
Unix 도메인 소켓에는 이 문제가 없습니다. reuseaddr
이 경우에는 실제로 의미가 없습니다.
답변2
파일이 unlink()되지 않으면 커널은 닫힌 후에도 관련 리소스를 유지하며 소켓은 완전히 작동합니다.
아니요, 소켓에 대한 마지막 열린 핸들이 close()일 때 커널은 소켓과 관련된 모든 리소스를 해제합니다. 다시 바인딩() 경로를 연결 해제()하면 됩니다.
close()나 unlink()만으로는 Unix 도메인 소켓을 사라지게 할 수 없으므로 둘 다 이 작업을 안정적으로 수행하거나 소켓과 관련된 모든 리소스를 포기하도록 커널을 트리거할 수 있습니까?
찾아보세요 ;-)
unix_domain_socket_inode의 수명은 다음과 같습니다.
- 무언가가 소켓을 열어두거나(소켓이 닫히지 않음)
- 연관된 경로가 있습니다
아니요2인용. 해당 "연결 경로"는 제거(unlink()됨)될 수 있으며 소켓은 다른 하드 링크를 통해 계속 액세스할 수 있습니다.
내 다른 거 좀 봐답변시연하고 설명하십시오.
소켓 inode( 소켓 fd가 가리키는 노드, "진입점" 역할을 통해 액세스할 수도 있음)를/proc/PID/fd/FD
실제/tmp/.X11-unix/X0
경로가 특수 문자 \0으로 시작하면 파일이 파일 시스템에 나타나지 않습니다. )
.sun_path
로 시작하면 더 \0
이상 경로가 아니라 경로와는 달리 추가 \0
바이트를 포함할 수 있고 완전히 다른 의미를 갖는 "추상" Unix 도메인 주소입니다(경로와 달리 누구나 소켓에 연결할 수 있음). 레거시 Unix 도메인 소켓과 달리 , 여기서 연결은 선행 경로에 따라 결정되는 파일 액세스 권한의 적용을 받습니다.
이 "추상 소켓" 기능은 Linux에만 존재합니다.