천사소녀 네티 2

일지 2016. 2. 11. 22:31

3장. 

부트 스트랩: 네티로 작성한 네트워크 애플리케이션의 동작 방식과 환경을 설정하는 도우미 클래스

- 이벤트 루프

- 채널의 전송모드

- 채널 파이프라인


지원하는 설정

- 전송계층(소켓 모드 및 I/O 종류)

- 이벤트 루프(단일 스레드, 다중 스레드)

- 채널 파이프라인 설정

- 소켓 주소와 포트

- 소켓 옵션


부트스트랩의 종류

- ServerBootstrap: for server- 소켓 연결을 대기

- BootStrap: client- 소켓 연결을 요청


서로 API구조는 같지만 소켓 연결에 대한 입장의 차이가 있음.


* 부트스트랩은 빌더 패턴을 사용하면 효율적으로 사용할 수 있음. 

- 설정의 내용이 추가될 때마다 생성자를 추가할 필요가 없기 때문. 


* 부트스트랩에서 사용할 부모 이벤트 루프 그룹과 자식 이벤트 루프 그룹의 수를 인자로 결정할 수 있다. 

- 그룹에서 동작할 스레드 수를 결정하지 않을 경우 하드웨어가 가지고 있는 CPU*2 배의 스레드를 사용한다. 


* 부트스트랩에서 사용할 이벤트루프 그룹의 종류는 생성할 때    NIO/ OIO/ EPOLL  eventgroup 클래스로 생성을 하느냐에 달려있다. 

- NIO:  넌블락

- OIO: 블락

- EPOLL : 이폴 지원 


---

ServerBootstrap의 API


* ServerBootstrap.class - group(eventLoopGroup group);


- 이벤트 루프 그룹을 BootStrap의 변수에 설정하고 Bootstrap 객체 자신을 리턴한다.

- override 한 group(group)의 기능 내에서 사용하는 group(group, group) 기능은 부모와 자식 이벤트 루프를 구분해서 사용할 수 있게 한다. 


* Channel()

- 소켓의 입출력 모드를 설정

- 여~러가지 종류가 있다. 


* ChannelFactory

- 소켓의 입출력 모드를 설정

- ChannelFactory 인터페이스를 구현가능


* Handler

- 이벤트를 처리하는 녀석. 

- 빌더 패턴으로 핸들러 객체를 설정해서 넣으면 이벤트가 발생했을 때 실행될 핸들러를 설정할 수 있다. 

- ChannelHandler 인터페이스 구현체를 인자로 받는다


* ChildHandler

- 클라이언트 소켓 채널로 송수신 되는 데이터를 가공하는 데이터 핸들러 설정할 수 있다.

- 빌더 패턴으로 Handler와 같이 ChannelHandler 인터페이스 구현체를 인자로 받는다

- 예를 들어 Handler 대신 ChildHandler를 사용해서 로그핸들러를 인자로 설정하면 클라이언트에서 발생한 이벤트까지 로그로 찍을 수 있다.(로그 핸들러가 아니면서 양쪽의 이벤트를 모두 필요로 하는 경우는 어떤 것이 있을지 잘 모르겠다.)


* option

- 서버 소켓 채널의 소켓 옵션을 설정하는 API

- 소켓 옵션: 소켓의 동작 방식을 지정하는 거엇.

- 주요 소켓 옵션이 있다~


** ChannelOption.TCP_NODELAY

- 네이글 알고리즘의 비활성화 여부 설정

- 네이글 알고리즘: 가능하면 데이터를 나누어 보내지 말고 한꺼번에 보내라는 원칙을 가진 알고리즘.

- 네트워크 상태가 좋지 않고 대역폭이 좁을 때 헤더로 인한 불필요한 오버헤드를 줄이고 데이터를 모아서 보내라.

- 작은 크기의 데이터는 송신버퍼에서 적당히 모아서 보낸다.

- 이전에 보내내 패킷의 ACK를 받아야 다음 패킷을 전송한다. 

- 이 옵션은 ACK를 받을 떄까지 다음 패킷을 전송하지 않기 때문에 빠른 속도가 필요할 때는 문제가 된다. 


** ChannelOption.SO_REUSEADDR

- TCP 통신을 종료할 때 클라이언트에서 마지막으로 FIN을 보내고 나서 발생하는 타임아웃으로 인해 어플리케이션 서버가 재시작 하려고 하면 bind 실패로 망함.

- 이 옵션을 켜주면 TIME_WAIT에 걸려있더라도 bind 가능함


** ChannelOption.SO_BACKLOG

- 동시에 수용 가능한 클라이언트 연결 요청 개수를 서버 소켓에 설정 가능한 옵션

- 그런데 이 개수가 서버 소켓이 소화가능한 동시 연결수와 동일하지 않다. 

- SYN-ACK상태의 연결요청을 보관하는 큐의 크기를 설정하는 것이 바로 SO_BACKLOG

- 너무 크게 잡으면 연결이 폭주할 때 연결 대기 시간이 길어지는 단점이 있음. 




* childOption

- 클라이언트 소켓 채널에 소켓 옵션을 설정.


**SO_LINGER  

- 소켓 종료 시, close함수가 실행되었는데 아직 커널 버퍼에 전송되지 않은 데이터가 남아있을 경우 이를 처리하는 방법을 지정하는 옵션. 

- 이 옵션의 사용 여부/ 타임아웃 값 설정 가능

- FALSE가 디폴~ㅌ

- 이 옵션을 사용하고 타임아웃값을 0으로 주면 마지막 남은 데이터를 모두 전송하고 연결을 끊어버림. TIMEWAIT 발생하지 않는 장점이 있음. 



---

Bootstrap API


- ServerBootstrap 과 Bootstrap API는 대체로 비슷하다. 

- 그러나 부모-자식 관계에 대한 API 는 없다.(option- childOption)


* group 

- 이벤트 루프 객체를 설정.

- 하나의 이벤트 루프 객체만 설정 가능하다. (부모-자식 설정 불가하기 때문)

- AbstractBootstrap의 그룹 메소드를 고대로 사용.


* channel

- 클라이언트 소켓 채널의 입출력 모드를 설정.

- 요러저러한 클래스 목록이 있다. p94


* channelFactory

- ServerBootstrap의 그것과 같은 역할.


* handler

- 클라이언트 소켓 채널에서 발생하는 이벤트를 수신하여 처리. 

- ChannelInitializer를 구현해서 사용


* option

- 클라이언트의 소켓 설정을 옵션 설정.
























'일지' 카테고리의 다른 글

intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리  (0) 2016.02.23
git remote branch delete  (0) 2016.02.19
천사소녀 네티 6장  (0) 2016.02.17
천사소녀 네티  (0) 2016.02.10
nerd commenter  (0) 2016.01.28
Posted by 썬,더 호글
,