본문 바로가기

네트워크, 서버12

(IOModel)Epoll 멀티플렉싱 io 모델의 select는 아무래도 한계가 뚜렸했다. 매 순간 해당 소켓이 이벤트를 받았는지 직접 확인해 줘야 했고 커널로 감시하고자 하는 FD의 모음을 넘겨야 했다. 만약 해당 FD_SET을 처음 한번 등록하고 우리는 FD의 추가,삭제만 해주고 커널에 넘겨주지 않아도 알아서 관리해서 이벤트가 통지된 FD들만 따로 알려주면 어떨까? 이것이 바로 리눅스에서 제공하는 epoll이다. 1. epoll 과정 먼저 epoll_create(epoll 인스턴스의 사이즈)를 통해 커널이 따로 관리하는 파일디스크립터의 저장소(epoll인스턴스)를 만든다. 해당 함수의 반환은 epoll인스턴스의 fd 넘버이다. 그 후 관찰대상이 되는 fd를 등록하는 과정으로 epoll_ctl(epoll인스턴스, 추가할지 삭제할.. 2020. 10. 5.
(IOModel)멀티플렉싱 - select 멀티플렉싱이란? 여러명이서 통신할때 하나의 채널만 가지고 통신하는 방식을 말한다. 멀티쓰레드, 멀티 프로세스가 여러 채널을 만들어 통신한다면 멀티플렉싱은 하나의 프로세스, 스레드를 가지고 여러 명의 통신을 연결시킨다. 여러명이 접속할 수 있는 서버를 만들기 위해 여러 IO모델들이 사용된다. 오늘은 대표적인 멀티플렉싱 방식의 IO 모델인 select에 대해 살펴보고자 한다. 1. select 동작 과정 서버는 여러 클라이언트의 접속을 받는다. 그 후 각 클라이언트의 이벤트(데이터 수신여부, 데이터 송신가능 여부, 오류 수신 여부 등)의 이벤트가 들어옴에 따라 해당 클라이언트에게 적절한 응답을 해줘야 한다. select의 경우 먼저 FD_SET이라는 구조체를 통해 클라이언트들을 등록시킨다. 해당 구조체는 L.. 2020. 10. 5.
(소켓,프로토콜)TCP 소켓의 종료 1. 깔끔한 종료 TCP에서 연결된 소켓을 종료할때는 4-way handshake라는 과정을 거친다. 총 4단계로 tcp의 특성에 맞게 안전하게 종료 가능한 방법이다. - 과정 먼저 종료를 원하는 쪽에서 closesocket과 같은 소켓 종료함수를 호출한다. 그럼 해당 소켓에 대한 권한이 tcp커널로 넘어가게 되고 만약 소켓이 블로킹 소켓이면 위의 종료과정이 완전히 끝날때까지 블로킹되고, 논블로킹 소켓이면 EWOULDBLOCK을 리턴한다. 그리고 해당 호스트는 FIN_WAIT상태에 들어가고 상대호스트의 FIN을 기다린다(FIN_WAIT). FIN 메시지를 받은 상대 호스트는 받은 메시지에 대한 ACK 신호를 보내고 역시나 closesocket과 같은 소켓종료함수를 보내기 전까지 ClOSE_WAIT상태가 .. 2020. 10. 5.
(소켓,프로토콜) UDP소켓 데이터의 경계 UDP는 TCP와 다르게 데이터의 경계가 있다. 그래서 하나의 패킷이 하나의 데이터가 되는데, 이때문에 UDP소켓이 전송하는 패킷을 데이터그램이라고 부른다. TCP는 데이터의 경계가 없다. send, recv 함수를 통해 해당 소켓의 입출력 버퍼를 읽고 쓰고 하지만 실제 OS가 보낼때 해당 데이터가 나뉘어서 갈수도 있다. 그래서 받는 입장에선 내가 받을 데이터의 용량 만큼 계속 recv해줘야 한다. 하지만 UDP는 입출력 버퍼에 먼저 저장되는게 아닌 곧 바로 OS단에서 데이터를 전송한다. 물론 그렇다고 함수가 리턴했을때 바로 데이터를 보냈다고 확신되는건 아니다. 다만 보낸 횟수에 따라 데이터가 나뉘어서 상대 호스트에 전달되기 때문에 3번 send하였으면 상대방도 3번 recv해줘야 한다. .. 2020. 9. 22.