Unix 도메인 소켓 바인딩, 주소 재사용

Unix 도메인 소켓 바인딩, 주소 재사용

TCP 연결을 위한 소켓이 있고 나중에 bind()프로그램 을 실행할 때 문제가 발생할 수 있습니다. 그럼에도 불구하고 커널은 여전히 ​​열린 소켓과 관련된 리소스를 소유할 수 있기 때문입니다.AF_INETclose()close()

그러나 Unix 도메인 소켓과 관련된 이 문제에 대해서는 잘 모르겠습니다.

지금까지 내가 본

  1. 그것을 사용하려면 고유한 경로가 필요합니다 bind(). 호출 시 경로가 존재하지 않아야 하며 bind()파일은 로 표시됩니다 bind(). (단, 파일 시스템에 표시될 수도 있고 표시되지 않을 수도 있습니다. 경로가 특수 문자로 시작되면 파일이 파일 시스템에 표시되지 않습니다 \0. )

  2. 파일이 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. 무언가가 소켓을 열어두거나(소켓이 닫히지 않음)
  2. 연관된 경로가 있습니다

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의 수명은 다음과 같습니다.

  1. 무언가가 소켓을 열어두거나(소켓이 닫히지 않음)
  2. 연관된 경로가 있습니다

아니요2인용. 해당 "연결 경로"는 제거(unlink()됨)될 수 있으며 소켓은 다른 하드 링크를 통해 계속 액세스할 수 있습니다.

내 다른 거 좀 봐답변시연하고 설명하십시오.

소켓 inode( 소켓 fd가 가리키는 노드, "진입점" 역할을 통해 액세스할 수도 있음)를/proc/PID/fd/FD실제/tmp/.X11-unix/X0

경로가 특수 문자 \0으로 시작하면 파일이 파일 시스템에 나타나지 않습니다. )

.sun_path로 시작하면 더 \0이상 경로가 아니라 경로와는 달리 추가 \0바이트를 포함할 수 있고 완전히 다른 의미를 갖는 "추상" Unix 도메인 주소입니다(경로와 달리 누구나 소켓에 연결할 수 있음). 레거시 Unix 도메인 소켓과 달리 , 여기서 연결은 선행 경로에 따라 결정되는 파일 액세스 권한의 적용을 받습니다.

이 "추상 소켓" 기능은 Linux에만 존재합니다.

관련 정보