TCP / IP 소켓이 "열린 파일"로 간주되는 이유는 무엇입니까?


29

Linux의 기본 개념이 무엇인지 확신하는 데 도움이 필요합니다. 열린 파일의 한계. 특히, 열린 소켓이 시스템의 총 "열린 파일"수에 포함되는 이유에 대해 혼란스러워합니다.

왜 이유에 대해 자세히 설명해 주시겠습니까? 나는 이것이 아마도 리눅스에서 "모든 것이 파일이다"라는 원칙으로 거슬러 올라간다는 것을 이해하지만 추가적인 세부 사항은 높이 평가할 것이다.

답변:


34

"파일 열기"의 한계는 실제로 파일에만 국한된 것이 아닙니다. 단일 프로세스가 한 번에 사용할 수있는 커널 핸들 수의 제한입니다 . 역사적으로 프로그램에서 일반적으로 많은 파일을 열 수있는 유일한 것은 파일이므로 열린 파일 수의 제한으로 알려졌습니다. 프로세스가 많은 파일을 열고 실수로 닫는 것을 잊어 버려 프로세스 전체에 문제가 발생하는 것을 막는 데는 한계가 있습니다.

소켓 연결도 커널 핸들입니다. 따라서 동일한 이유로 동일한 제한이 적용됩니다. 프로세스가 네트워크 연결을 열고 닫는 것을 잊을 수 있습니다.

주석에서 언급했듯이 커널 핸들은 일반적 으로 유닉스 계열 시스템에서 파일 디스크립터 라고 합니다 .


23
"커널 핸들"은 Windows 용어입니다. 오히려 이러한 파일들이 일반적으로 Unix & Linux에서 호출되는 방식 인 "파일 디스크립터"를 참조하고자합니다.
jlliagre

11
이 답변은 너무 많이 헤지됩니다. 소켓 파일입니다. 그것들 은 파일이라는 의미의 핵심 인 read/ write인터페이스를 통해 바이트 스트림에 대한 액세스를 제공 합니다.

4
@ WumpusQ.Wumbley, 그러나 당신은 shutdown(2)파일에 대한 시스템 콜을 가지고 있지만 파일을 사용하지 않고 소켓에서 읽을 수 없습니다 . cat그 이유 netcat가 만들어졌습니다. 유닉스와 같은 커널에서 (행운 적으로) 소켓은 I / O 측면에서 파일처럼 작동하지만 유사성은 바로 끝납니다. (솔직히, 나는 계획 9 경험이있는 사람으로부터 전통적인 유니스보다 훨씬 더 많은 것들을 통일했다고 들었습니다.)
kostix

@MikeB, 이 책 은 대부분의 유닉스 관련 개념을 익히 게 합니다. 추천.
kostix

3
"모든 것이 파일"이라는 아이디어는 "파일"이 많은 하위 유형을 가진 추상 데이터 유형이라는 것을 의미합니다. 대부분의 하위 유형은 모든 파일이 지원하는 기본 항목 외에 추가 메소드를 지원합니다. 소켓에는 추가 기능이 많이 있습니다. 차단 장치 및 일반 파일이 탐색합니다. 디렉토리는 정말로 이상합니다 (쓰기가 작동하지 않으며 읽기가 작동하면 유용하지 않습니다). 추가 메소드가 있다고해서 이러한 것들이 우리가 "파일"이라고 부르는 일반적인 범주에 속하지는 않습니다.

27

이유는 TCP / IP 소켓을 사용하는 파일 기술자 왜 소켓 인터페이스가 처음 설계 (구현 된 때이다가, 1983 년에, BSD 유닉스에서 당신이 할 수있는 -)의 디자이너는 네트워크 연결이 파일과 유사한 것을 느꼈다 read, write그리고 close모두 "모든 것이 파일입니다"라는 유닉스 아이디어와 잘 맞을 것입니다.

다른 TCP / IP 네트워크 스택 구현은 OS의 파일 I / O 하위 시스템과 반드시 ​​통합 할 필요는 없었습니다 (예 : MacTCP) . 그러나 BSD 소켓 인터페이스가 널리 보급 되었기 때문에 이러한 다른 구현에서도 소켓 API를 Unix와 유사한 기능으로 복제하기로 선택 했으므로 "파일 설명자"를 얻었으며 TCP / IP 통신에만 사용되었습니다. 파일 디스크립터가 있습니다.

질문의 다른 부분은 왜 한계가 있습니까? 파일 디스크립터 조회 테이블을 구현하는 가장 빠른 방법은 배열을 사용하기 때문입니다. 역사적으로 한계는 커널에 하드 코딩되었습니다.

다음은 프로세스 당 하드 코드 된 한계 20 파일 디스크립터가있는 Unix 릴리스 7 (1979)의 코드입니다.

  • user.h :struct file *u_ofile[NOFILE]
  • param.h :#define NOFILE 20

이에 비해 Linux는 프로세스의 파일 디스크립터 테이블을위한 공간을 동적으로 할당합니다. 절대 제한의 기본값은 8192이지만 원하는대로 설정할 수 있습니다. 내 시스템은에 191072을 나열합니다 /proc/sys/fs/file-max.

리눅스에는 더 이상 절대적인 제한이 없지만 프로그램을 미치게하고 싶지 않기 때문에 관리자 (또는 배포 패키지 관리자)는 일반적으로 리소스 제한을 설정합니다. 를 /etc/security/limits.conf보거나 실행하십시오 ulimit -n.


이 주제에 대한 최상의 답변 중 하나
user859375

6

파일은 디스크 나 메모리에있는 파일 만이 아닙니다. 그것들은 두 개의 예에 불과한 데이터 스트림입니다.

원격 엔드 포인트는 세 번째 예이며 소켓을 사용하는 엔드 포인트와 상호 작용합니다.


2
U & L.SE에 오신 것을 환영합니다. 나는이 답변을 좋아한다.
eyoung100
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.