<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" />
네트워크 통신을 위한 통로
</aside>
프로세스는 직접 하드웨어에 접근하지 않고, “파일 인터페이스”를 통해 커널과 통신합니다.
| 대상 | 실제 정체 | OS에서 |
|---|---|---|
| 디스크 파일 | 저장된 데이터 | 파일 |
| 키보드 | 입력 장치 | 파일 |
| 터미널 | 출력 장치 | 파일 |
| 네트워크 연결 | 통신 채널 | 파일 |
| 소켓 | 네트워크 통신 객체 | 파일처럼 취급 |
flowchart LR
1(프로세스) --> 2(File Descriptor Table) --> 3(커널의 파일 객체)
File Descriptor는 정수값이며, 파일을 가리키는 번호표와 같습니다(예를 들어 0번은 stdin, 1번은 stdout, 2번은 stderr, 3번은 소켓, 4번은 일반 파일). 리눅스 내부 코드 상에는 struct file 이라는 자료구조가 있으며 소켓도 해당 구조를 통해 관리되는 겁니다(소켓이 커널 내부에서 파일 객체 구조체로 관리된다는 것).
<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" />
프로세스가 네트워크를 통해 다른 프로세스와 통신하기 위해 사용하는 통신 엔드포인트
</aside>
소켓 또한 커널 내부의 자료구조입니다. struct file처럼 struct socket 이라는 구조체가 존재하고, 코드에서는 이렇게 파일 디스크립터(정수)로 사용자에게 전달됩니다 :
int socket_fd = socket(AF_INEF, SOCK_STEREAM, 0);
소켓은 목적지 IP, 목적지 Port, 프로토콜(TCP/UDP), 송수신 버퍼, 연결 상태(SYN_SENT, ESTABLISHED 등)와 같은 정보들을 담고 있는 구조체입니다(= 커널 내 자료구조). 서버 관점에서 다음과 같이 동작합니다 :
socket() --> bind() --> listen() --> accept()
소켓은 “커널이 관리하는 통신 상태 객체(구조체)이며, 프로토콜, 버퍼, 연결 상태 등을 포함하는 네트워크 추상화 객체입니다. 이 소켓 객체를 유닉스/리눅스 운영체제에서는 “Everything is a file” 철학에 따라 File Descriptor를 갖게되며 파일과 같이 File Descriptor를 갖기에 파일 디스크립터 기반의 I/O 인터페이스(read/write 같은)를 사용해 통신하는 것입니다.