34
자바 네트워킹 자바 네트워킹 기초에서 응용까지 기초에서 응용까지 이희승 / Trustin Lee 오픈 소스 자바 서버 개발 전문가 [email protected] 2/28/09

자바 네트워킹 기초에서 응용까지

Embed Size (px)

DESCRIPTION

'Java Networking – from Basics to Advanced' - presented at The 10th Korea Java Developer Conference (28 February 2009)

Citation preview

Page 1: 자바 네트워킹 기초에서 응용까지

자바 네트워킹자바 네트워킹기초에서 응용까지기초에서 응용까지

이희승 / Trustin Lee오픈 소스 자바 서버 개발 전문가[email protected]/28/09

Page 2: 자바 네트워킹 기초에서 응용까지

랩 목표랩 목표

자바 네트워크 어플리케이션 개발에 필요한 배경 지식 습득 후 JBoss Netty를 이용한 고속 네트워크 어플리케이션 개발 방법을 익힌다 .

Page 3: 자바 네트워킹 기초에서 응용까지

강사 소개강사 소개

• 자바 클라이언트 서버 개발 6 년

• Principal software engineer @ JBoss– Netty, Remoting, APIviz

• Member & Committer @ ASF– MINA, Directory

• Proprietary Projects– 마이크로커널 기반 SMS 게이트웨이

– OSGi 기반 RPC 어플리케이션 서버

– 경량 ESB

Page 4: 자바 네트워킹 기초에서 응용까지

목차목차

• Internet Protocol Suite

• Old Blocking I/O

• New Non-blocking I/O

• The Netty Project

Page 5: 자바 네트워킹 기초에서 응용까지

Internet Protocol SuiteInternet Protocol Suite

Page 6: 자바 네트워킹 기초에서 응용까지

Internet Protocol SuiteInternet Protocol Suite

• aka TCP/IP 모델

• 4 계층– Link

– Internet

– Transport

– Application

Page 7: 자바 네트워킹 기초에서 응용까지

Link LayerLink Layer

Host 1Host 1 Host 2Host 2NICNIC NICNIC

Linkage

EthernetFiber

Satellite

FrameFrameHeaderHeader

FrameFrameFooterFooterFrame DataFrame Data

Network

Page 8: 자바 네트워킹 기초에서 응용까지

Internet LayerInternet Layer

Network 1 Network 1 Network 2Network 2RouterRouter RouterRouterIPv4 · IPv6

FrameFrameHeaderHeader

IPIPHeaderHeader

FrameFrameFooterFooterIP DataIP Data

Internet

Page 9: 자바 네트워킹 기초에서 응용까지

Transport LayerTransport Layer

FrameFrameHeaderHeader

IPIPHeaderHeader

FrameFrameFooterFooterIP DataIP Data

Transport Transport HeaderHeader Transport DataTransport Data

Page 10: 자바 네트워킹 기초에서 응용까지

Transport Layer – UDPTransport Layer – UDP

• 대표적 Connection-less Datagram Protocol

• Unreliable, Unordered, Light-weight

• 메시지 단위 버퍼– 송신 : “ABC”, “DEF”, “GHI”, “JKL”

– 수신 : “DEF”, “GHI”, “ABC”, “JKL”

• 패킷이 클 경우 IP 규칙에 따름 – IPv4 vs. IPv6?

Peer 2Peer 2Peer 1Peer 1

33

44

1122

3344

11 22

Page 11: 자바 네트워킹 기초에서 응용까지

Transport Layer – TCPTransport Layer – TCP

Peer 2Peer 2Peer 1Peer 1ReceiveReceiveBufferBuffer

ReceiveReceiveBufferBuffer

SendSendBufferBuffer

SendSendBufferBuffer33 33 4411 22

3344 1122

• 대표적 Connection-oriented Stream Protocol

• Reliable, Ordered, Heavy-weight

• 데이터가 누적되는 버퍼– 송신 : “ABC”, “DEF”, “GHI”

– 수신 : “A”, “BCD”, “EF”, “GHI”

• TIME_WAIT 상태

Page 12: 자바 네트워킹 기초에서 응용까지

Application Layer – HTTPApplication Layer – HTTP

• RFC2616 – Hypertext Transfer Protocol

C: GET /index.txt HTTP/1.1C: Host: www.jboss.org

S: HTTP/1.1 200 OKS: Date: Mon, 23 May 2005 22:38:34 GMTS: Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)S: Last-Modified: Wed, 08 Jan 2003 23:11:55 GMTS: Content-Length: 13S: Connection: keep-aliveS: Content-Type: text/plain; charset=UTF-8S:S: Hello, World!

C: GET /index.txt HTTP/1.1C: Host: www.jboss.org

S: HTTP/1.1 200 OKS: Date: Mon, 23 May 2005 22:38:34 GMTS: Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)S: Last-Modified: Wed, 08 Jan 2003 23:11:55 GMTS: Content-Length: 13S: Connection: keep-aliveS: Content-Type: text/plain; charset=UTF-8S:S: Hello, World!

Page 13: 자바 네트워킹 기초에서 응용까지

Application Layer – SMTPApplication Layer – SMTP

• RFC5321 – Simple Mail Transfer Protocol

S: 220 smtp.example.com ESMTP PostfixC: HELO relay.example.orgS: 250 Hello relay.example.org, greetings.C: MAIL FROM:<[email protected]>S: 250 OKC: RCPT TO:<[email protected]>S: 250 OKC: DATAS: 354 End data with <CR><LF>.<CR><LF>C: {..MAIL BODY..}C: .S: 250 OK: queued as 12345C: QUITS: 221 Bye{DISCONNECTION}

S: 220 smtp.example.com ESMTP PostfixC: HELO relay.example.orgS: 250 Hello relay.example.org, greetings.C: MAIL FROM:<[email protected]>S: 250 OKC: RCPT TO:<[email protected]>S: 250 OKC: DATAS: 354 End data with <CR><LF>.<CR><LF>C: {..MAIL BODY..}C: .S: 250 OK: queued as 12345C: QUITS: 221 Bye{DISCONNECTION}

Page 14: 자바 네트워킹 기초에서 응용까지

Old Blocking I/OOld Blocking I/O

Page 15: 자바 네트워킹 기초에서 응용까지

Old Blocking I/O – IllustratedOld Blocking I/O – Illustrated

Boss ThreadBoss ThreadServerSocket.accept()ServerSocket.accept()

Worker Thread #1Worker Thread #1Socket.getInputStream()Socket.getInputStream()Socket.getOutputStream()Socket.getOutputStream()InputStream.read()InputStream.read()비즈니스 로직 수행비즈니스 로직 수행OutputStrea.write()OutputStrea.write()Socket.close()Socket.close()

Worker Thread #3Worker Thread #3

Worker Thread #4Worker Thread #4

Worker Thread #Worker Thread #NN (10000!?) (10000!?)

Page 16: 자바 네트워킹 기초에서 응용까지

Old Blocking I/O –Old Blocking I/O – 장단점장단점

• 장점– 단순하다

– 적은 수의 커넥션에서 고성능

– 이해하기 쉬운 직선적 코드 진행

• 단점– 많은 수의 커넥션에서 자원 소모 심함

– 많은 수의 커넥션에서 디버그 어려움

Page 17: 자바 네트워킹 기초에서 응용까지

New Non-blocking I/ONew Non-blocking I/O

Page 18: 자바 네트워킹 기초에서 응용까지

New Non-blocking I/O – IllustratedNew Non-blocking I/O – Illustrated

Boss ThreadBoss ThreadServerSocket-ServerSocket- Channel.accept()Channel.accept()SocketChannel.register()SocketChannel.register()

Worker Thread #1Worker Thread #1Selector.select()Selector.select()for each selected channels:for each selected channels: SocketChannel.read()SocketChannel.read() SocketChannel.write()SocketChannel.write()

Worker Thread #2Worker Thread #2

Worker Thread #3Worker Thread #3

Worker Thread #4Worker Thread #4

Worker Thread #Worker Thread #NN (# of CPU cores) (# of CPU cores)

균등분배

Page 19: 자바 네트워킹 기초에서 응용까지

New Non-blocking I/O – IllustratedNew Non-blocking I/O – Illustrated

Worker ThreadWorker ThreadSocketChannel.read()SocketChannel.read()SocketChannel.write()SocketChannel.write()

Event HandlerEvent HandleronInit:onInit: 환영 전문 작성환영 전문 작성 WorkerThread.writeAsync()WorkerThread.writeAsync() 현재 상태현재 상태 == 인증 대기인증 대기onData:onData: switch (switch ( 현재 상태현재 상태 ):): 인증 대기인증 대기 :: 로그인 전문 해석로그인 전문 해석 인증 결과 전문 작성인증 결과 전문 작성 WorkerThread.writeAsync()WorkerThread.writeAsync() 현재 상태현재 상태 == 요청 대기요청 대기 요청 대기요청 대기 :: 요청 전문 해석요청 전문 해석 비즈니스 로직 수행비즈니스 로직 수행 요청 수행 결과 전문 작성요청 수행 결과 전문 작성 WorkerThread.writeAsync()WorkerThread.writeAsync() 현재 상태현재 상태 == 요청 대기요청 대기

Page 20: 자바 네트워킹 기초에서 응용까지

New Non-blocking I/O –New Non-blocking I/O – 장단점장단점

• 장점– 많은 수의 커넥션에서 고효율 고성능

– 많은 수의 커넥션에서 디버그 쉬움

• 단점– 복잡한 스레드 모델

– 이해하기 어려운 다단계 State machine 기반• Old I/O 에서 쉬웠던 것도 어렵게 구현

• SSL / TLS 암호화

• 전문 완전히 받을 때까지 기다리기

– 벤더별 SelectorProvider 구현 특성

Page 21: 자바 네트워킹 기초에서 응용까지

The Netty ProjectThe Netty Project

Page 22: 자바 네트워킹 기초에서 응용까지

The Netty ProjectThe Netty Project

• 이벤트 기반 비동기 네트워크 어플리케이션 프레임워크

• Interceptor Chain 패턴– 손쉽게 다단계 State machine 구현

– 암복호화 + 전문 해석 + 스레드 풀링 + 비즈니스 로직

– 조립 가능한 컴포넌트 다수 제공

• 과부하 및 DoS 방어 메커니즘

• Old · New I/O 모두 지원

• NIO 구현 · 벤더별 최적화

Page 23: 자바 네트워킹 기초에서 응용까지

The Netty ProjectThe Netty Project

• 주요 프로토콜 코덱 제공– HTTP

– Google Protocol Buffers

• 제한된 환경 지원– Android, Applet, WebStart

• 다양한 컨테이너 및 DI 프레임워크 지원– JBoss Microcontainer, OSGi, Guice, Spring

Page 24: 자바 네트워킹 기초에서 응용까지

Echo · Discard Echo · Discard 예제 해부예제 해부

• 부트스트랩

• 이벤트 핸들러

• 메모리 넘치지 않게 하기

• 핸들러 직접 구현해 보기

Page 25: 자바 네트워킹 기초에서 응용까지

Telnet Telnet 예제 해부예제 해부

• 구분자 기반– 텍스트 (CR / LF) · 플래쉬 XML Socket (NUL) 등

– OneToOneEncoder

– DelimiterBasedFrameDecoder

Page 26: 자바 네트워킹 기초에서 응용까지

Factorial Factorial 예제 해부예제 해부

• 길이 필드 기반– 일반적으로 바이너리

– 길이 필드를 포함한 헤더 + 바디

– OneToOneEncoder

– FrameDecoder

– ReplayDecoder

• 상태 관리– 커넥션별 중간 계산값 저장

Page 27: 자바 네트워킹 기초에서 응용까지

HTTP HTTP 서버 만들기서버 만들기

• HTTP 의 모든 면을 세세히 제어 가능– 대용량 데이터 송수신 – Chunked Encoding

– Comet / AJAX

• 서버– HttpRequestDecoder

– HttpResponseEncoder

• 클라이언트– HttpRequestEncoder

– HttpResponseDecoder

Page 28: 자바 네트워킹 기초에서 응용까지

Google Protocol BuffersGoogle Protocol Buffers

• 정의 파일에서 고성능 고효율 코드 생성

message Person { required string name = 1; optional string email = 2; enum PhoneType { HOME = 0; WORK = 1; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4;}

message Person { required string name = 1; optional string email = 2; enum PhoneType { HOME = 0; WORK = 1; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4;}

Page 29: 자바 네트워킹 기초에서 응용까지

Netty + Google Protocol BuffersNetty + Google Protocol Buffers

• 고속 개발– Encoder / Decoder 구현이 필요 없음

– 잘 작성된 정의 파일을 통해 하위 호환성 확보

• 상호 운용성 증대– Java, C++, Python 등 대부분의 언어용 코드 자동 생성

• Netty와 간단히 통합– ProtobufEncoder

– LengthFieldPrepender

– ProtobufDecoder

– LengthFieldBasedFrameDecoder

Page 30: 자바 네트워킹 기초에서 응용까지

업무 적용 – 비즈니스 로직 수행업무 적용 – 비즈니스 로직 수행

• 대부분의 비즈니스 로직은 외부 자원 접근– Database CRUD

– 다른 서버로 릴레이 – Proxy

• NIO Worker 스레드에서 오래 걸리는 동작 수행 불가– 다른 커넥션에 영향

• ChannelPipeline 에 ExecutionHandler 추가– OrderedMemoryAwareThreadPoolExecutor

• 핸들러 내부에서 비동기 API만 사용– Asynchronous JDBC

– Netty in Netty

Page 31: 자바 네트워킹 기초에서 응용까지

업무 적용 –업무 적용 – DoS DoS 및 과부하 방어및 과부하 방어

• Message flooding– (Ordered)MemoryAwareThreadPoolExecutor– Write buffer high·low water mark

– Channel.isWritable() 존중

• 접속 후 요청 ·응답 없이 자원 소모하는 경우– ReadTimeoutHandler

– WriteTimeoutHandler

– IdleStateHandler

Page 32: 자바 네트워킹 기초에서 응용까지

업무 적용 –업무 적용 – DoS DoS 및 과부하 방어및 과부하 방어

• 적극적 방어를 위해서는 비즈니스 로직에 맞게 최적화

• '의심스러운 ' 커넥션 제거– Flooding 기준 정의

– 엄격한 전문 형식 · state machine 상태 유효성 검사

• 긴 전문은 Chunk 로 쪼개 처리

Page 33: 자바 네트워킹 기초에서 응용까지

질의 및 응답질의 및 응답

Page 34: 자바 네트워킹 기초에서 응용까지