SlideShare a Scribd company logo
1 of 34
Download to read offline
자바 네트워킹
        기초에서 응용까지

이희승 / 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 로 쪼개 처리
질의 및 응답
자바 네트워킹 기초에서 응용까지

More Related Content

What's hot

Wiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.xWiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.xMakio Tsukamoto
 
陈吉平:高可用分布式数据库系统架构实践
陈吉平:高可用分布式数据库系统架构实践陈吉平:高可用分布式数据库系统架构实践
陈吉平:高可用分布式数据库系统架构实践XMourinho
 
Readme ko
Readme koReadme ko
Readme koThata22
 
Widget Market Overview Mar 2008
Widget Market Overview Mar 2008Widget Market Overview Mar 2008
Widget Market Overview Mar 2008Min Seok Kang
 
20081009 작업공수표
20081009 작업공수표20081009 작업공수표
20081009 작업공수표guest72f9872
 
2 구글의 공룡화
2 구글의 공룡화2 구글의 공룡화
2 구글의 공룡화guestba5d5e
 
Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)龍一 田中
 
Jitaku Server 3points
Jitaku Server 3pointsJitaku Server 3points
Jitaku Server 3pointsakitsukada
 
第2回PHP懇親会発表資料
第2回PHP懇親会発表資料第2回PHP懇親会発表資料
第2回PHP懇親会発表資料Masahiko Sakamoto
 
Ad Proposal(Korean)
Ad Proposal(Korean)Ad Proposal(Korean)
Ad Proposal(Korean)kunheeme
 
Status Ruby on Rails in China
Status Ruby on Rails in ChinaStatus Ruby on Rails in China
Status Ruby on Rails in ChinaJesse Cai
 
http://vnx.su/ renault laguna 2 руководство по эксплуатации
http://vnx.su/ renault laguna 2 руководство по эксплуатацииhttp://vnx.su/ renault laguna 2 руководство по эксплуатации
http://vnx.su/ renault laguna 2 руководство по эксплуатацииrenruk
 
Яндекс.Директ: как мы деплоим наши Perl-web-приложения
Яндекс.Директ: как мы деплоим наши Perl-web-приложенияЯндекс.Директ: как мы деплоим наши Perl-web-приложения
Яндекс.Директ: как мы деплоим наши Perl-web-приложенияElena Bolshakova
 
van de chung excel
van de chung excelvan de chung excel
van de chung excelMio Class
 
G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래
G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래 G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래
G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래 wanghaliui
 
여성최­음­제팝니다 (라인ks346 ◈ 카톡& | 카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입
여성최­음­제팝니다  (라인ks346  ◈ 카톡&  |  카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입여성최­음­제팝니다  (라인ks346  ◈ 카톡&  |  카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입
여성최­음­제팝니다 (라인ks346 ◈ 카톡& | 카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입haili25
 

What's hot (20)

Wiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.xWiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.x
 
陈吉平:高可用分布式数据库系统架构实践
陈吉平:高可用分布式数据库系统架构实践陈吉平:高可用分布式数据库系统架构实践
陈吉平:高可用分布式数据库系统架构实践
 
Readme ko
Readme koReadme ko
Readme ko
 
Widget Market Overview Mar 2008
Widget Market Overview Mar 2008Widget Market Overview Mar 2008
Widget Market Overview Mar 2008
 
20081009 작업공수표
20081009 작업공수표20081009 작업공수표
20081009 작업공수표
 
2 구글의 공룡화
2 구글의 공룡화2 구글의 공룡화
2 구글의 공룡화
 
Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)
 
Jitaku Server 3points
Jitaku Server 3pointsJitaku Server 3points
Jitaku Server 3points
 
JavaScript再入門
JavaScript再入門JavaScript再入門
JavaScript再入門
 
第2回PHP懇親会発表資料
第2回PHP懇親会発表資料第2回PHP懇親会発表資料
第2回PHP懇親会発表資料
 
Ad Proposal(Korean)
Ad Proposal(Korean)Ad Proposal(Korean)
Ad Proposal(Korean)
 
Profile
ProfileProfile
Profile
 
Status Ruby on Rails in China
Status Ruby on Rails in ChinaStatus Ruby on Rails in China
Status Ruby on Rails in China
 
http://vnx.su/ renault laguna 2 руководство по эксплуатации
http://vnx.su/ renault laguna 2 руководство по эксплуатацииhttp://vnx.su/ renault laguna 2 руководство по эксплуатации
http://vnx.su/ renault laguna 2 руководство по эксплуатации
 
의도협발표자료
의도협발표자료의도협발표자료
의도협발표자료
 
Яндекс.Директ: как мы деплоим наши Perl-web-приложения
Яндекс.Директ: как мы деплоим наши Perl-web-приложенияЯндекс.Директ: как мы деплоим наши Perl-web-приложения
Яндекс.Директ: как мы деплоим наши Perl-web-приложения
 
okyuu.com x Rails x OpenID
okyuu.com x Rails x OpenIDokyuu.com x Rails x OpenID
okyuu.com x Rails x OpenID
 
van de chung excel
van de chung excelvan de chung excel
van de chung excel
 
G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래
G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래 G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래
G­HB 구해요 『텔­레&카톡 BF258 _ 라인 KS346』 흥­분­제판­매처 흥­분­제직거래
 
여성최­음­제팝니다 (라인ks346 ◈ 카톡& | 카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입
여성최­음­제팝니다  (라인ks346  ◈ 카톡&  |  카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입여성최­음­제팝니다  (라인ks346  ◈ 카톡&  |  카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입
여성최­음­제팝니다 (라인ks346 ◈ 카톡& | 카톡&텔레 : BF258)여성최­음­제판매하는곳 최­음­제구입
 

Viewers also liked

Java tutorial for Beginners and Entry Level
Java tutorial for Beginners and Entry LevelJava tutorial for Beginners and Entry Level
Java tutorial for Beginners and Entry LevelRamrao Desai
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Sungchul Park
 
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)DK Lee
 
Hadoop Installation Tutorial for KT ucloud biz
Hadoop Installation Tutorial for KT ucloud bizHadoop Installation Tutorial for KT ucloud biz
Hadoop Installation Tutorial for KT ucloud biz치완 박
 
자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획DK Lee
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰Sungchul Park
 

Viewers also liked (6)

Java tutorial for Beginners and Entry Level
Java tutorial for Beginners and Entry LevelJava tutorial for Beginners and Entry Level
Java tutorial for Beginners and Entry Level
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
 
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
 
Hadoop Installation Tutorial for KT ucloud biz
Hadoop Installation Tutorial for KT ucloud bizHadoop Installation Tutorial for KT ucloud biz
Hadoop Installation Tutorial for KT ucloud biz
 
자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 

More from trustinlee

WebSocket 기반 쌍방향 메시징
WebSocket 기반 쌍방향 메시징WebSocket 기반 쌍방향 메시징
WebSocket 기반 쌍방향 메시징trustinlee
 
APIviz – Java API Visualizer
APIviz – Java API VisualizerAPIviz – Java API Visualizer
APIviz – Java API Visualizertrustinlee
 
Rapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINARapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINAtrustinlee
 
JBoss Middleware 및 Remoting 프로젝트 소개
JBoss Middleware 및 Remoting 프로젝트 소개JBoss Middleware 및 Remoting 프로젝트 소개
JBoss Middleware 및 Remoting 프로젝트 소개trustinlee
 
오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리
오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리
오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리trustinlee
 
오픈 소스 소개
오픈 소스 소개오픈 소스 소개
오픈 소스 소개trustinlee
 

More from trustinlee (6)

WebSocket 기반 쌍방향 메시징
WebSocket 기반 쌍방향 메시징WebSocket 기반 쌍방향 메시징
WebSocket 기반 쌍방향 메시징
 
APIviz – Java API Visualizer
APIviz – Java API VisualizerAPIviz – Java API Visualizer
APIviz – Java API Visualizer
 
Rapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINARapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINA
 
JBoss Middleware 및 Remoting 프로젝트 소개
JBoss Middleware 및 Remoting 프로젝트 소개JBoss Middleware 및 Remoting 프로젝트 소개
JBoss Middleware 및 Remoting 프로젝트 소개
 
오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리
오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리
오픈 소스 프로젝트 참여를 통한 개발자 커리어 관리
 
오픈 소스 소개
오픈 소스 소개오픈 소스 소개
오픈 소스 소개
 

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

  • 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 •
  • 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}
  • 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 – 장단점 • 장점 – 단순하다 – 적은 수의 커넥션에서 고성능 – 이해하기 쉬운 직선적 코드 진행 • 단점 – 많은 수의 커넥션에서 자원 소모 심함 – 많은 수의 커넥션에서 디버그 어려움
  • 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 구현 특성
  • 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 로 쪼개 처리