OS가 다루는 프로세스를 서버라고 칭할 수 있다.
서버와 클라이언트간의 연결을 하는 매개체 역할로 소켓이 있는데, 이를 통해 IPC를 수행할 수 있다
데이터를 주고 받기 위해서는 어디로에 해당하는 주소가 매우 중요하다
누구에게를 식별하기 위해 사용되는 것이 IP주소와 포트번호이다
원래는 IP주소만으로 사용했지만, 컴퓨터 보급량의 증가로 IP 개수의 한계로 이를 해결하기 위해 포트번호를 도입하게 됐다
현실에 비유를 해보자면,
기존에 한국은 단독주택(IP)으로 잘 생활하고 있었다
하지만 한국의 땅 크기는 고정돼있고, 인구의 증가로 단독주택에서 아파트를 짓고 아파트 내에서 호수(포트번호)를 나누게 되었다
위에서 어디로와 누구에게를 해결했다면, 다음으로는 어떤걸,어떻게를 정해야한다
Application -> Sockets -> 네트워크 스택 -> NIC(랜카드) -> 외부
write()
데이터 전송
Application <- Sockets <- 네트워크 스택 <- NIC(랜카드) <- 외부
Interrupt
데이터 수신
송수신 절차 중간에 껴있는 소켓은 무엇이냐
그림만 봐도 알 수 있듯이, 다양한 시스템 콜이 일어나는 곳으로 os의 제어를 받는다
Input
domain - 도메인 선택
* IPv4, Ipv6
type - 소켓의 종류 선택
* stream, datagram
protocol - 프로토콜 선택
* tcp, udp
Output
파일 디스크립터
파일 디스크립터
※ 파일 디스크립터를 소켓을 특정해주는 '키'라고 한다면, 그에 대한 '벨류'는 리소스(소켓, 파일)등 에 대한 메타데이터라고 비유할 수 있다
Input
sockfd - 바인딩 할 소켓의 파일 디스크립터
sockaddr - 바인딩 할 IP, port를 담은 구조체
socklen_t - 구조체의 메모리 크기
Input
sockfd - 소켓의 파일 디스크립터
backlog - TCP 백로그 큐의 크기
Input
sockfd - 클라이언트의 요청을 받을 소켓의 파일 디스크립터
sockaddr - 백로그 큐에서 빼온 클라이언트의 주소 정보
socklen_t - 구조체의 메모리 크기Output
소켓
queue의 자료구조 형태를 가진 백로그 큐에서 저장된 다수의 클라이언트 요청을 순차적으로 처리하면 어쩔 수 없이 병목현상이 발생하게됨
이를 해결하기 위해 accept() 시스템 콜을 사용한다
기존에 socket()으로 서버 소켓(클라이언트의 요청을 받을 메인 소켓)을 생성했다면, accept()를 사용해 클라이언트 소켓(서버 소켓의 백 로그 큐에 있는 요청을 처리하는 보조 소켓)을 생성한다.
보조 소켓을 병렬 처리에 사용하기 위해서 fork()라는 시스템 콜을 사용하여 프로세스를 추가로 생성한다
fork를 통해 추가로 생성한 프로세스와, accept를 통해 생성한 소켓을 매칭시켜줘서 병렬처리할 수 있도록한다.
fork와 accept를 통해 병렬 처리를 함으로써 병목 현상을 해결함
하지만 병렬 처리를 함으로써 발생하는 오류인 동시성은 아직 문제이다
1. socket()
2. bind()
3. listen()
4. accept()