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

Like this? Share it with your network

Share

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

on

  • 5,708 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,708
Views on SlideShare
5,658
Embed Views
50

Actions

Likes
3
Downloads
76
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

  • 1. 자바 네트워킹 기초에서 응용까지 이희승 / Trustin Lee 오픈 소스 자바 서버 개발 전문가 tlee@redhat.com 2/28/09
  • 2. 랩 목표 자바 네트워크 어플리케이션 개발에 필요한 배경 지식 습득 후 JBoss Netty를 이용한 고속 네트워크 어플리케이션 개발 방법을 익힌다 .
  • 3. 강사 소개 • 자바 클라이언트 서버 개발 6 년 • Principal software engineer @ JBoss – Netty, Remoting, APIviz • Member & Committer @ ASF – MINA, Directory • Proprietary Projects – 마이크로커널 기반 SMS 게이트웨이 – OSGi 기반 RPC 어플리케이션 서버 – 경량 ESB
  • 4. 목차 Internet Protocol Suite • Old Blocking I/O • New Non-blocking I/O • The Netty Project •
  • 5. Internet Protocol Suite
  • 6. Internet Protocol Suite • aka TCP/IP 모델 • 4 계층 Link – Internet – Transport – Application –
  • 7. Link Layer Network Linkage Host 1 Host 2 NIC NIC Ethernet Fiber Satellite Frame Frame Frame Data Header Footer
  • 8. Internet Layer Internet IPv4 · IPv6 Network 1 Router Network 2 Router Frame IP Frame IP Data Header Header Footer
  • 9. Transport Layer Transport Transport Data Header Frame IP Frame IP Data Header Header Footer
  • 10. 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?
  • 11. 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 상태
  • 12. 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!
  • 13. 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}
  • 14. Old Blocking I/O
  • 15. 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!?)
  • 16. Old Blocking I/O – 장단점 • 장점 – 단순하다 – 적은 수의 커넥션에서 고성능 – 이해하기 쉬운 직선적 코드 진행 • 단점 – 많은 수의 커넥션에서 자원 소모 심함 – 많은 수의 커넥션에서 디버그 어려움
  • 17. New Non-blocking I/O
  • 18. 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)
  • 19. New Non-blocking I/O – Illustrated Worker Thread Event Handler onInit: SocketChannel.read() 환영 전문 작성 SocketChannel.write() WorkerThread.writeAsync() 현재 상태 = 인증 대기 onData: switch ( 현재 상태 ): 인증 대기 : 로그인 전문 해석 인증 결과 전문 작성 WorkerThread.writeAsync() 현재 상태 = 요청 대기 요청 대기 : 요청 전문 해석 비즈니스 로직 수행 요청 수행 결과 전문 작성 WorkerThread.writeAsync() 현재 상태 = 요청 대기
  • 20. New Non-blocking I/O – 장단점 • 장점 – 많은 수의 커넥션에서 고효율 고성능 – 많은 수의 커넥션에서 디버그 쉬움 • 단점 – 복잡한 스레드 모델 – 이해하기 어려운 다단계 State machine 기반 • Old I/O 에서 쉬웠던 것도 어렵게 구현 • SSL / TLS 암호화 • 전문 완전히 받을 때까지 기다리기 – 벤더별 SelectorProvider 구현 특성
  • 21. The Netty Project
  • 22. The Netty Project • 이벤트 기반 비동기 네트워크 어플리케이션 프레임워크 • Interceptor Chain 패턴 – 손쉽게 다단계 State machine 구현 – 암복호화 + 전문 해석 + 스레드 풀링 + 비즈니스 로직 – 조립 가능한 컴포넌트 다수 제공 • 과부하 및 DoS 방어 메커니즘 • Old · New I/O 모두 지원 • NIO 구현 · 벤더별 최적화
  • 23. The Netty Project • 주요 프로토콜 코덱 제공 – HTTP – Google Protocol Buffers • 제한된 환경 지원 – Android, Applet, WebStart • 다양한 컨테이너 및 DI 프레임워크 지원 – JBoss Microcontainer, OSGi, Guice, Spring
  • 24. Echo · Discard 예제 해부 부트스트랩 • 이벤트 핸들러 • 메모리 넘치지 않게 하기 • 핸들러 직접 구현해 보기 •
  • 25. Telnet 예제 해부 • 구분자 기반 – 텍스트 (CR / LF) · 플래쉬 XML Socket (NUL) 등 – OneToOneEncoder – DelimiterBasedFrameDecoder
  • 26. Factorial 예제 해부 • 길이 필드 기반 – 일반적으로 바이너리 – 길이 필드를 포함한 헤더 + 바디 – OneToOneEncoder – FrameDecoder – ReplayDecoder • 상태 관리 – 커넥션별 중간 계산값 저장
  • 27. HTTP 서버 만들기 • HTTP 의 모든 면을 세세히 제어 가능 – 대용량 데이터 송수신 – Chunked Encoding – Comet / AJAX • 서버 – HttpRequestDecoder – HttpResponseEncoder • 클라이언트 – HttpRequestEncoder – HttpResponseDecoder
  • 28. 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; } }
  • 29. Netty + Google Protocol Buffers • 고속 개발 – Encoder / Decoder 구현이 필요 없음 – 잘 작성된 정의 파일을 통해 하위 호환성 확보 • 상호 운용성 증대 – Java, C++, Python 등 대부분의 언어용 코드 자동 생성 • Netty 와 간단히 통합 – ProtobufEncoder – LengthFieldPrepender – ProtobufDecoder – LengthFieldBasedFrameDecoder
  • 30. 업무 적용 – 비즈니스 로직 수행 • 대부분의 비즈니스 로직은 외부 자원 접근 – Database CRUD – 다른 서버로 릴레이 – Proxy • NIO Worker 스레드에서 오래 걸리는 동작 수행 불가 – 다른 커넥션에 영향 • ChannelPipeline 에 ExecutionHandler 추가 – OrderedMemoryAwareThreadPoolExecutor • 핸들러 내부에서 비동기 API 만 사용 – Asynchronous JDBC – Netty in Netty
  • 31. 업무 적용 – DoS 및 과부하 방어 • Message flooding – (Ordered)MemoryAwareThreadPoolExecutor – Write buffer high·low water mark – Channel.isWritable() 존중 • 접속 후 요청 · 응답 없이 자원 소모하는 경우 – ReadTimeoutHandler – WriteTimeoutHandler – IdleStateHandler
  • 32. 업무 적용 – DoS 및 과부하 방어 • 적극적 방어를 위해서는 비즈니스 로직에 맞게 최적화 • ' 의심스러운 ' 커넥션 제거 – Flooding 기준 정의 – 엄격한 전문 형식 · state machine 상태 유효성 검사 • 긴 전문은 Chunk 로 쪼개 처리
  • 33. 질의 및 응답