자바 네트워킹 기초에서 응용까지
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 5,588 views

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

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

Statistics

Views

Total Views
5,588
Views on SlideShare
5,538
Embed Views
50

Actions

Likes
3
Downloads
72
Comments
0

5 Embeds 50

http://www.linkedin.com 21
http://wiki.infobank.net 13
http://kydmr.dothome.co.kr 10
http://www.slideshare.net 5
https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 자바 네트워킹 기초에서 응용까지 이희승 / Trustin Lee 오픈 소스 자바 서버 개발 전문가 tlee@redhat.com 2/28/09
  • 랩 목표 자바 네트워크 어플리케이션 개발에 필요한 배경 지식 습득 후 JBoss Netty를 이용한 고속 네트워크 어플리케이션 개발 방법을 익힌다 .
  • 강사 소개 • 자바 클라이언트 서버 개발 6 년 • Principal software engineer @ JBoss – Netty, Remoting, APIviz • Member & Committer @ ASF – MINA, Directory • Proprietary Projects – 마이크로커널 기반 SMS 게이트웨이 – OSGi 기반 RPC 어플리케이션 서버 – 경량 ESB
  • 목차 Internet Protocol Suite • Old Blocking I/O • New Non-blocking I/O • The Netty Project •
  • Internet Protocol Suite
  • Internet Protocol Suite • aka TCP/IP 모델 • 4 계층 Link – Internet – Transport – Application –
  • Link Layer Network Linkage Host 1 Host 2 NIC NIC Ethernet Fiber Satellite Frame Frame Frame Data Header Footer
  • Internet Layer Internet IPv4 · IPv6 Network 1 Router Network 2 Router Frame IP Frame IP Data Header Header Footer
  • Transport Layer Transport Transport Data Header Frame IP Frame IP Data Header Header Footer
  • Transport Layer – UDP 3 1 2 4 Peer 1 Peer 2 4 3 2 1 • 대표적 Connection-less Datagram Protocol • Unreliable, Unordered, Light-weight • 메시지 단위 버퍼 – 송신 : “ABC”, “DEF”, “GHI”, “JKL” – 수신 : “DEF”, “GHI”, “ABC”, “JKL” • 패킷이 클 경우 IP 규칙에 따름 – IPv4 vs. IPv6?
  • Transport Layer – TCP Receive Send 1 2 3 3 4 Buffer Buffer Peer 1 Peer 2 Send Receive 4 3 2 1 Buffer Buffer • 대표적 Connection-oriented Stream Protocol • Reliable, Ordered, Heavy-weight • 데이터가 누적되는 버퍼 – 송신 : “ABC”, “DEF”, “GHI” – 수신 : “A”, “BCD”, “EF”, “GHI” • TIME_WAIT 상태
  • Application Layer – HTTP • RFC2616 – Hypertext Transfer Protocol C: GET /index.txt HTTP/1.1 C: GET /index.txt HTTP/1.1 C: Host: www.jboss.org C: Host: www.jboss.org S: HTTP/1.1 200 OK S: HTTP/1.1 200 OK S: Date: Mon, 23 May 2005 22:38:34 GMT S: Date: Mon, 23 May 2005 22:38:34 GMT S: Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) S: Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) S: Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT S: Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT S: Content-Length: 13 S: Content-Length: 13 S: Connection: keep-alive S: Connection: keep-alive S: Content-Type: text/plain; charset=UTF-8 S: Content-Type: text/plain; charset=UTF-8 S: S: S: Hello, World! S: Hello, World!
  • Application Layer – SMTP • RFC5321 – Simple Mail Transfer Protocol S: 220 smtp.example.com ESMTP Postfix S: 220 smtp.example.com ESMTP Postfix C: HELO relay.example.org C: HELO relay.example.org S: 250 Hello relay.example.org, greetings. S: 250 Hello relay.example.org, greetings. C: MAIL FROM:<bob@example.org> C: MAIL FROM:<bob@example.org> S: 250 OK S: 250 OK C: RCPT TO:<alice@example.com> C: RCPT TO:<alice@example.com> S: 250 OK S: 250 OK C: DATA C: DATA S: 354 End data with <CR><LF>.<CR><LF> S: 354 End data with <CR><LF>.<CR><LF> C: {..MAIL BODY..} C: {..MAIL BODY..} C: . C: . S: 250 OK: queued as 12345 S: 250 OK: queued as 12345 C: QUIT C: QUIT S: 221 Bye S: 221 Bye {DISCONNECTION} {DISCONNECTION}
  • Old Blocking I/O
  • Old Blocking I/O – Illustrated Worker Thread #1 Boss Thread Socket.getInputStream() ServerSocket.accept() Socket.getOutputStream() InputStream.read() 비즈니스 로직 수행 OutputStrea.write() Socket.close() Worker Thread #3 Worker Thread #4 Worker Thread #N (10000!?)
  • Old Blocking I/O – 장단점 • 장점 – 단순하다 – 적은 수의 커넥션에서 고성능 – 이해하기 쉬운 직선적 코드 진행 • 단점 – 많은 수의 커넥션에서 자원 소모 심함 – 많은 수의 커넥션에서 디버그 어려움
  • New Non-blocking I/O
  • New Non-blocking I/O – Illustrated 균등 Boss Thread Worker Thread #1 분배 ServerSocket- Selector.select() Channel.accept() for each selected channels: SocketChannel.register() SocketChannel.read() SocketChannel.write() Worker Thread #2 Worker Thread #3 Worker Thread #4 Worker Thread #N (# of CPU cores)
  • New Non-blocking I/O – Illustrated Worker Thread Event Handler onInit: SocketChannel.read() 환영 전문 작성 SocketChannel.write() WorkerThread.writeAsync() 현재 상태 = 인증 대기 onData: switch ( 현재 상태 ): 인증 대기 : 로그인 전문 해석 인증 결과 전문 작성 WorkerThread.writeAsync() 현재 상태 = 요청 대기 요청 대기 : 요청 전문 해석 비즈니스 로직 수행 요청 수행 결과 전문 작성 WorkerThread.writeAsync() 현재 상태 = 요청 대기
  • New Non-blocking I/O – 장단점 • 장점 – 많은 수의 커넥션에서 고효율 고성능 – 많은 수의 커넥션에서 디버그 쉬움 • 단점 – 복잡한 스레드 모델 – 이해하기 어려운 다단계 State machine 기반 • Old I/O 에서 쉬웠던 것도 어렵게 구현 • SSL / TLS 암호화 • 전문 완전히 받을 때까지 기다리기 – 벤더별 SelectorProvider 구현 특성
  • The Netty Project
  • The Netty Project • 이벤트 기반 비동기 네트워크 어플리케이션 프레임워크 • Interceptor Chain 패턴 – 손쉽게 다단계 State machine 구현 – 암복호화 + 전문 해석 + 스레드 풀링 + 비즈니스 로직 – 조립 가능한 컴포넌트 다수 제공 • 과부하 및 DoS 방어 메커니즘 • Old · New I/O 모두 지원 • NIO 구현 · 벤더별 최적화
  • The Netty Project • 주요 프로토콜 코덱 제공 – HTTP – Google Protocol Buffers • 제한된 환경 지원 – Android, Applet, WebStart • 다양한 컨테이너 및 DI 프레임워크 지원 – JBoss Microcontainer, OSGi, Guice, Spring
  • Echo · Discard 예제 해부 부트스트랩 • 이벤트 핸들러 • 메모리 넘치지 않게 하기 • 핸들러 직접 구현해 보기 •
  • Telnet 예제 해부 • 구분자 기반 – 텍스트 (CR / LF) · 플래쉬 XML Socket (NUL) 등 – OneToOneEncoder – DelimiterBasedFrameDecoder
  • Factorial 예제 해부 • 길이 필드 기반 – 일반적으로 바이너리 – 길이 필드를 포함한 헤더 + 바디 – OneToOneEncoder – FrameDecoder – ReplayDecoder • 상태 관리 – 커넥션별 중간 계산값 저장
  • HTTP 서버 만들기 • HTTP 의 모든 면을 세세히 제어 가능 – 대용량 데이터 송수신 – Chunked Encoding – Comet / AJAX • 서버 – HttpRequestDecoder – HttpResponseEncoder • 클라이언트 – HttpRequestEncoder – HttpResponseDecoder
  • Google Protocol Buffers • 정의 파일에서 고성능 고효율 코드 생성 message Person { message Person { required string name = 1; required string name = 1; optional string email = 2; optional string email = 2; enum PhoneType { enum PhoneType { HOME = 0; HOME = 0; WORK = 1; WORK = 1; } } message PhoneNumber { message PhoneNumber { required string number = 1; required string number = 1; optional PhoneType type = 2 [default = HOME]; optional PhoneType type = 2 [default = HOME]; } } repeated PhoneNumber phone = 4; repeated PhoneNumber phone = 4; } }
  • Netty + Google Protocol Buffers • 고속 개발 – Encoder / Decoder 구현이 필요 없음 – 잘 작성된 정의 파일을 통해 하위 호환성 확보 • 상호 운용성 증대 – Java, C++, Python 등 대부분의 언어용 코드 자동 생성 • Netty 와 간단히 통합 – ProtobufEncoder – LengthFieldPrepender – ProtobufDecoder – LengthFieldBasedFrameDecoder
  • 업무 적용 – 비즈니스 로직 수행 • 대부분의 비즈니스 로직은 외부 자원 접근 – Database CRUD – 다른 서버로 릴레이 – Proxy • NIO Worker 스레드에서 오래 걸리는 동작 수행 불가 – 다른 커넥션에 영향 • ChannelPipeline 에 ExecutionHandler 추가 – OrderedMemoryAwareThreadPoolExecutor • 핸들러 내부에서 비동기 API 만 사용 – Asynchronous JDBC – Netty in Netty
  • 업무 적용 – DoS 및 과부하 방어 • Message flooding – (Ordered)MemoryAwareThreadPoolExecutor – Write buffer high·low water mark – Channel.isWritable() 존중 • 접속 후 요청 · 응답 없이 자원 소모하는 경우 – ReadTimeoutHandler – WriteTimeoutHandler – IdleStateHandler
  • 업무 적용 – DoS 및 과부하 방어 • 적극적 방어를 위해서는 비즈니스 로직에 맞게 최적화 • ' 의심스러운 ' 커넥션 제거 – Flooding 기준 정의 – 엄격한 전문 형식 · state machine 상태 유효성 검사 • 긴 전문은 Chunk 로 쪼개 처리
  • 질의 및 응답