popit 멘토링 데이 Review

개발자들의 글을 발행하는 서비스 popit에서 진행한 멘토링 데이를 다녀왔다. 2개의 타임 세션으로 나누어 진행된 이번 멘토링의 경우, 세션 별로 본인이 선택한 멘토 3분 중 1분을 랜덤으로 배정 받아 멘토링을 받는 방식으로 진행되었다. 나는 두 세션 모두 데이터 관련 멘토를 신청해서인지 모두 데이터 관련 멘토로 배정을 받아 멘토링 시간을 보내게 되었다.

윤xx 멘토님(Melon)

  • Melon 빅데이터 팀 근무
    • 프레임워크 개발 -> 빅데이터 엔지니어(Hadoop, HBase)
    • 음악 추천 팀 using Ni-Fi
  • 좋은 아키텍쳐를 사용할 수 있는 조건?
    • 위에서 시켜주어야 한다!
    • 정말로 시켜주었 때 수행할 수 있는 능력을 가지고 있어야 하기 때문에 결국 관련 공부를 계속 이어가야 함
  • feedly 사용해서 공부 계속 이어나가는 것 추천(Get feeds from various sites)
    • 이전에 내가 무엇을 공부해야하는지를 알아야 함
    • 내가 가진 기술과 업계 동향을 수신받으며, 역량을 키워야 함
  • 데이터 팀의 구성은 과학자 3명:분석가 10명 정도
  • 600개의 자소서는 HR에서 걸러짐 -> 60개 자소서 넘어오면 결국 보는 것은 8개..
    • 이후, 1차 테스트 -> 2차 면접
    • 면접은 당장의 실력보다, 기술을 따라가고자 하는 의지를 보는 경우가 많음
      • 회사에서 시간을 주어줄 때 학습할 수 있으면 됨
    • +) 프로토콜, 알고리즘 등 개발자로서 평생 가져가야 하는 지식들도 잘 갖추고 있어야 함
  • why NiFi?
    • 기술 선택할 때는 그 시점에 가장 유행하는 기술을 사용하는 것이 좋음
    • 실시간 데이터 수집에 NiFi 사용
      • ETL을 모두 처리하는 NiFi
      • Flume - Kafka - NiFi
    • 각 에이전트에 Flume 사용
      • 통계자들에게 넘기기 위해 원시코드 사용하기 보다는 SQL을 이용하는 편
    • CDC: 데이터를 캡쳐 및 저장하는 기능(CRUD 모두 캡쳐)
      • Query Table Capture
  • Oozie로 data batch 역할 수행
  • 오픈소스는 사용 상 문제가 생기면 소스 코드를 열어보는 수 밖에 없음
    • 소스 코드를 이해할 수 있는 사람이 조직에 있어야 하는 이유
    • 소스 코드를 이해할 수 없으면 해당 기술을 도입하면 안되는 것으로 간주해도 무방
  • Open source는 version up을 잘 하지 않음
    • Version up 하는데 1달 여의 시간이 드는데, 그에 비해 큰 효용 X
  • 장애 발생 시 대체 컨텐츠 발생시키면 큰 문제가 없음
  • Melon의 경우 Web log가 일 평균 4-50G 발생하는 수준
  • 업무를 통한 실력의 향상을 추구하는 것이 주니어 때는 바람직함
  • 빅데이터 라는 Terminology 사용하는 것도 중요
    • 고객에게 팔리는 용어를 사용하는 것
  • 본인의 경우 아티스트와 사용자의 '친밀도' 시스템 도입하면서 멜론에 Hadoop 도입하게 됨
    • 데이터에 분석에 대한 고객의 needs가 충분히 있었던 시점
  • 데이터 엔지니어에게 Hadoop은 기본 중의 기본
    • manual에 적힌 지식을 자신의 지식으로 소화하는 것이 중요(why this Option? / Working algorithm 등)
  • 취업 이후에나 비즈니스 이해도를 갖추어야 함
    • 이전까지는 Basic concepts에 대한 이해가 더 중요
  • 데이터 엔지니어는 tensorflow에서 나온 output을 pipeline화하는 할 줄 알아야 함

홍xx 멘토님(SK)

  • 바이오-인포매틱스: data로 질병 연구
    • 인간 게놈 프로젝트: 무질병자와 질병자의 신체적 특성 비교(SMP)
    • 한 사람 sequencing하면 대략 4TB의 데이터가 나옴
    • 바이올로지는 system 만드는 것을 연구로 삼음
  • J2EE에서 Spring으로 넘어가던 과도기 시절 웹 개발 시작
  • Grid Computing / Parallel Computing 시대
  • Network Management System으로 SK 시작
    • 고객의 경험 품질을 지수화 시키는 프로젝트
    • 큰 데이터를 다뤄본 경험이 중요!
      • 1시간에 2천 억건의 데이터 발생 -> 하루 100TB
    • +) 데이터웨어하우스: 나뿐만 아니라 다른 사람들도 데이터를 활용할 수 있는 환경을 구축하는 프로젝트
  • 처음 빅데이터 플랫폼 시작은 바이올로지 논문 사이트에서의 검색
    • Like search에서의 성능 향상을 위해 관심 가지게 됨
    • 더그 커팅의 Lucene
    • Lucene의 한글화 지원하도록 재컴파일 하는 wiki 작성
    • 이후, Apache Nutch
  • Hadoop은 삼성에서 적용하기 시작
  • 오픈 소스의 활성화에 큰 기여를 한 Hadoop
    • Storage 시장이 많이 바뀜
    • Oracle과 같은 솔루션 기업이 아닌 오픈 소스의 활용이라는 결정으로 바뀌게 됨
  • 순수 엔지니어로 성공하기 어려운 한국 사회
    • SI기업들의 Man/Month -> 돈 깎기 싸움 -> 환경 악화
    • 성공하기 위해서는 정말 실력이 좋거나 vs 10년 정도 같은 업무를 반복했거나
  • 플랫폼에 쌓이는 데이터를 가지고 무언가를 만들고 싶어하는 현 시장
    • 많은 회사에서 데이터 관련 부서를 관리하려는 경향 생김
  • 앞으로도 데이터 시장은 오래 갈 트렌드인 것 같음
  • SK의 Data Transformation 팀
    • 부문 직속 팀일 정도로 높은 rank에 자리하는 data 팀
    • 분산형 조직(Best) Data 관련 기획 팀 / Big data platform 팀 / data service 팀...
    • cf) 기능형 조직은 필요로 할 때에만 채용하는 수준
  • 도메인 전문가 + 데이터 엔지니어 + 데이터 분석가로 구성되어야 그나마 성공확률이 높아짐
    • 도메인 전문가가 없으면, 나머지 둘은 무엇을 할 줄 모름
    • 자기 영역에 먼저 전문가가 되고, 이후 다른 한 도메인을 잘 하는 정도로 공부해야 함
    • 대개 분석으로 도메인 확장하나, 혹은 다른 한 쪽의 도메인 확장할 수도 있음
      • 그 같은 전문가가 별로 없기 때문에 자기만의 장점을 갖출 수 있음
  • 서비스를 IT를 잘 모르고 사용하는 사람들도 사용할 수 있도록 제공하면 인정 받고 역량이 성장됨
  • 데이터에 대한 오너십을 가진 부서를 가진 곳을 가는 것이 개발자로서의 성장에 도움이 됨
    • 데이터에 접근하는 것이 사실 더 어렵기 때문
  • 학생 수준에서는 하나의 기술을 deep하게 파는 것이 아니라 다양한 기술을 공부해보는 것이 중요
    • 그의 장단점을 볼 줄 아는 안목을 길러야 함


두다지 서버 개발자 양성 프로그램 Week 8

8번 째 멘토링

네트워크의 Transport Layer와 Network Layer에 대한 공부를 마치고, 그에 대한 정리를 멘토링을 통해 하였다. 또한 지난 주에 과제로 제출되었던 UDP로 TCP 구현하기 과제의 일부를 해서 갔다. 네트워크를 공부하며 느끼는 점은 물리적 계층에 가까워지는 Layer일수록 그 깊이가 더 깊어 이해하기가 힘들다는 것이다. 아직 Link Layer는 추가적으로 학습하지 못했지만 지금까지 이해한 것보다 어려울 것 같다는 느낌을 강하게 받았다.. 작년부터 전산학을 공부함에 있어 네트워크가 계속 발목을 잡는 듯한 느낌을 받는다. 앞으로 서버 개발자를 목표하기 위해서는, 멘토링 이후에도 네트워크는 추가적으로 공부를 더 해서 제대로 이해하고 넘어가야 할 것이다.

학습한 것에 대한 리뷰

  • UDP는 socket을 통해 1:1 연결을 하기 때문에 header에 2가지 정보를 포함해야 함
    • destination IP, destination Port number
  • TCP는 welcome socket 하에 1:n의 연결을 하기 때문에 header에 4가지 정보를 포함해야 함
    • destination IP, destination Port number, source IP, source Port number
  • Network Layer에서 IP protocol은 비신뢰적 전송
  • 네트워크 지원 하의 혼잡 제어는 single bit 전송을 통해 이루어짐
  • 2-way handshaking의 경우, Client의 중복된 conn_req를 Server가 Client의 종료 이후 받게 되면, Server가 socket을 열게 되는 half open connection의 문제가 발생할 수 있음
  • c언어 헤더 include 순서
    • 내 헤더를 가장 마지막에 작성해줌
  • debugging을 위해 logger 사용하자
  • 항상 unittest 하기
    • 내 프로그램이 잘 작동한다는 것은 unittest로 검증한 후에 시나리오 대로 동작시켜보아야 함
  • C에서 fread는 읽어온 것만큼만 전달하도록 readcount 변수를 추가적으로 사용해주어야 함

Computer Network

  • Transport Layer는 process 간 연결을 도와주는 계층
  • Application 단에서 Transport 계층에게 명령하여 상대 host에게 데이터를 전송
  • 왜 3-way handshake / flow control / congestion control을 하게 될까?
    • 서로 다른 계층에서의 성능 보장을 신뢰하지 못하기 때문
    • 네트워크 통신에서의 변수가 통제된 상황에서는 무조건 성능의 보장 가능
      • 그러나, 현실 네트워크는 그렇지 못하기 때문에 통제 되지 않은 상황을 고려한 프로토콜이 필요한 것
  • 전송 과정에서 거치는 hop의 성능을 알지 못하는 윗단
    • Transport Layer에서는 그저 최선의 상황을 가정해서 전송하는 것
  • Congestion control에서는 doubling의 threshold를 어떻게 잡을 까에 대한 문제 있을 수 있음
    • 결국, threshold를 잘 모르기 때문에 doubling을 구현하는 것
    • 일종의 땜빵코드(best effort..)
    • 절반으로 줄이는 TCP Tahoe도 같은 개념
    • Packet loss는 일종의 congestion 발생했다는 signal 처럼 이용되는 것
  • 네트워크 내의 여러 상황 때문에 General Purpose 상황에서 네트워크 이용률을 50%까지 올리는 것도 매우 어려운 일
  • 2-way handshake에는 다양한 문제가 있음
    • half open connection / doubly connected...
    • Server가 연결에 대해 보낸 ACK와 ACK 이후 즉시 보낸 data의 순서가 보장되지 않음
    • 따라서 서로가 정상적으로 연결(혹은 연결 해제)되었다는 것을 인지하고 communicate하는 것이 좋음!
      • cf. close는 4-way handshake
      • close 상황이 완전히 이루어지기 전에 유실되었던 segment의 전송 등을 고려하여 연결의 종료가 이루어짐

다음 주 까지의 assignment

  • 네트워크 과제 마무리
    • Packet에 TCP header 부여
    • listen() for. 3-way handshake 구현
    • flow control 구현 (순서 보장)
    • Fake Router 구현
      • Get datas from Client & send datas to Servers


Spring boot camp #2

JSP & Servlet

  • Spring MVC
    • 내부적으로는 Servlet, JSP를 사용
    • 따라서 Spring을 사용하기 위해서는 Servlet, JSP에 대한 이해를 해야 함
  • 응집도의 개념이란 관련된 기능을 하나의 class가 모아 지니고 있는 것
  • Spring Framework를 이용하는 spring boot
    • 따라서 Spring에 대한 이해를 하는 것이 좋음
    • Spring boot를 사용하면 설정해주지 않아도 되는 부분드리 많지만, 현업에서 이미 Spring으로 작성된 프로젝트를 관리해야 할 일들도 많이 있기 때문
  • Java 웹프로그래밍의 시작, Servlet & JSP

    • Servlet 3.0 이전에는 web.xml 설정을 해주어야 함
      • 하나의 path 설정하는 것이 하나의 servlet
      • 결국, 응집도가 떨어지는 결과 -> 문제
    • 3.0 이후부터는 annotation을 이용해서 path 설정
    • JSP는 HTML code와 Java code를 섞어서 작성하는 것
      • 서버에서 JSP가 java code로 바뀜
        • <h1>hello</h1>이라는 HTML line이 out.write("<h1>hello</h1>")로 변환되는 것
        • 즉, out이라는 Java 변수가 위에 선언되어야 하는 것 -> JSP 내장 객체
      • 근래에는 Java code 잘 사용 안하려고 함
        • 유지보수 어려워지기 때문
      • JSTL과 EL로 결과값만 출력하자! 는 것이 대세
  • Servlet의 구성

    class 'servlet_name' extends HttpServlet{
      doGet()
      doPost()
      Service
      ...
    }
    



After JEE Pattern

  • Java로 기업급에서 프로그래밍을 할 때는 이러한 패턴을 사용하자!
  • Front controller도 그 JEE Pattern 하나

    • browser가 하는 모든 요청을 이 놈이 받도록 함
    • Servlet으로 작성할 수도, JSP로 작성할 수도, ServletFilter로 작성할 수도 있음
  • Spring MVC는 Servlet으로 Front Controller 만듬

    • Spring MVC의 DispatcherServlet이 Front Controller의 역할 수행
    • 즉, Spring MVC의 life cycle이 궁금하다면 DispatcherServlet을 공부해야 함!
      • WAS가 DispatcherServlet을 메모리에 올려주는 역할 수행
        • 1) web.xml에 등록(143.p)
          • 배포를 1초라도 빨리하려면 web.xml에 DispatcherServlet 등록해주는 것이 좋음
          • 명시적인게 빠르기 때문
        • 2) 서블릿 3.0 이상에서는 ServletContainerInitializer 인터페이스 사용 -> WAS용 Java config
        • 3) but, Spring 쪽에서는 모든 객체를 Spring 쪽에서 관리해주고 싶어함
          • WebApplicationInitializer 인터페이스 구현해서 사용 -> Spring용 Java config
          • Servlet 인터페이스를 보고 Spring interface를 확인하기 때문에 배포 속도가 가장 느림
    • DispatcherServlet은 내부적으로 WebApplicationContext(Bean Container)를 지님
  • Front Controller는 관련된 url 요청들을 분배하는 역할을 수행하게 됨

    • 관련된 url을 처리하는 객체를 Spring MVC에서는 'xxx'Controller라고 부름
      • cf.명령을 처리한다는 개념에서 Command Pattern이라고 부르기도 함
    • 프로그래머가 만들고 Spring이 관리해주는 객체
    • @Controller 혹은 @RestController 라는 annotaion이 붙어있어야 함
    • Web에 종속적인 기술
      • UI에 따라 사용되지 않을 수도 있는 것
    • Spring containter가 Component scan을 통해 annotation 붙어있는 객체들 찾음
      • 다 Bean으로 등록해줌
      • Bean이란 Spring이 관리해주는 객체
    • 공통적으로 처리되는 부분들은 객체 하나를 사용해서 중복되게 사용되도록 사용할 수 있음
      • 'xxx'Service라 불리우는 객체 !
      • 즉, 하나의 Controller가 여러 개의 Service를 사용하도록 하는 것 ! (중복된 기능을 제공하기 위해서)
      • @Service annotation 사용
      • Service 안에서 또 중복된 기능을 사용
        • 대개, CRUD 기능이 중복된 코드일 가능성이 높음
        • 이러한 기능을 Repository 혹은 DAO라고 부름
        • @Repository annotation 사용
  • 이처럼 FrontController-'xxx'Controller-'xxx'Service의 계층으로 나뉘어져 구성되기 때문에 'Layered Architecter' 라고 부름

  • Service와 Repository는 별도의 ApplicationContext 필요 (Business Logic 관리하기 위해)

    • Service와 Repository에 해당하는 객체만 관리해줌
    • WebApplicationContext은 Service와 Repository 객체를 사용하기 위해 ApplicationContext를 부모로 가짐(141.p)
    • 자식 container는 부모 container로 부터 객체 먼저 찾음
      • 부모가 가지고 있는 Service를 자식의 Controller에 넣어주게 됨
    • 중요한 것은 Context 간에 부모-자식 관계가 있을 수 있다는 것
  • 경우에 따라서 DispatcherServlet을 여러 개 선언할 수도 있음

    • /board를 1번 Dispatcher가,
    • /users를 2번 Dispatcher가 관리하도록 함
    • 따라서 WebApplicationContext도 2개 생성됨
      • Container를 따로 사용하기 때문에 1번 Dispatcher에서의 객체를 2번 Dispatcher에서 사용 불가
        • 마치 한 서버에 있지만, 두 서버에 있는 듯한 느낌
        • 나중에 Micro service 단위로 분할하기 편하게 하기 위해 사용하는 경우가 있긴 하나 잘 사용되지는 않는 기법



Controller

  • Controller의 예
@Controller
@RequsetMapping("/board")
class test{
    @RequsetMapping("/list")
    static void testmethod(){
        ...
    }
}
  • Spring 4.3 버전 이후부터 RequestMapping 외 GetMapping, PostMapping, PutMapping 등도 등장
  • class의 mapping 정보와 method의 mapping 정보가 결합된 것이 실제 url 주소
  • Controller를 url을 처리해준다하여 Handler라고도 부름
  • HandlerMapping이라는 객체가 존재하여, url 관리
    • 어떤 Controller의 method와 관련이 있다는 정보들을 저장
    • 즉, 내부적으로 DispatcherServlet의 관리해주는 것
    • 유효한 요청을 받았을 시, HandlerAdapter로 보내 실행
      • Controller method는 보통 View 이름 return
        • ModelAndView 혹은 String 객체로 return
  • HTTP header에는 accept 정보 존재
    • browser가 원하는 data format(ex. html, json, xml...)
  • ViewResolver는 어떤 view를 보여줄지에 대한 전략을 세워줌
    • 경로 작성해주고, data format 찍어주어 view 생성하여 return
      • ex) WEB-IMF/views... + /list + .jsp
    • ViewResolver도 여러 개 존재해서, 요청한 data format에 따라 다르게 처리 가능
    • Java config에서 default 값들 설정해주면 됨
  • DispatcherServlet과 Controller 사이에 Interceptor 여러 개 존재할 수 있음
    • 모든 요청에 대해 공통으로 처리해줄 수 있음
    • Dispatcher 앞에 존재할 수 있는 ServletFilter와 유사한 역할 수행



실습

  • Lombok 적용: Preference -> Compiler -> annotation processor -> enable annotation processing
  • @Configuration 붙어있는 class들은 Java config
  • @ConditionalOn이 붙어있는 annotation은 중요한 annotation
    • ex) ConditionalOnMissingBean
      • 사용자가 AutoConfig 사용하지 않고 Bean 직접 생성했을 때 자동 설정을 사용하지 않겠다는 설정
  • spring.factories에서 기본 설정 확인 가능
    • dispathcer servlet 생성해줌
    • MultipartResolver는 file upload용
  • Spring 구버전의 @RequestMapping(method = RequestMethod.GET)가 GetMapping이 됨
  • Spring에서 JSP로 결과 출력하려면 JSTL 의존성 추가해주어야 함
    • tomcat에 기본적으로 포함된 것이 아니기 때문
    • pom.xml과 application.properties에 다음 설정 추가
// pom.xml
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

// application.properties
spring.mvc.view.prefix= /WEB-INF/jsp/
spring.mvc.view.suffix= .jsp
  • http://www.inven.co.kr/board/{game name}/{board id}
    • 위 예에서 'game name'과 'board id'는 Path variable
  • http://www.inven.co.kr/board/{game name}/{board id}/?sort=PID&p=1

    • 위 예에서 ? 이하의 값은 Request Parameter
    • 이름=값&이름=값 의 형태로 전달
  • 내가 입력한 값들을 저장해야 하는 서버

  • 이전 입력 값들에 대한 parameter를 계속 가지고 다녀야 함
  • form 도 requestParam으로 읽어올 수 있음

  • redirect?

    • 요청을 하는 WebClient와 요청을 받는 WAS의 존재를 가정
      • form을 POST 방식으로 입력
      • HTTP message에는 POST /boards 방식 명시되고, header 정보 이후 body 부분에 user가 입력한 값이 실림
        • 1) @RequestParam으로 입력 값 읽어드릴 수 있고,
        • 2) form의 입력 값이 너무 많을 시, @ModelAttribute 사용
          • @ModelAttribute Board board와 같이 정의
          • set으로 값 채워넣음
          • +) 값을 validate하는 기능 필요
            • 값이 잘못되어있으면 다시 입력하라는 메시지와 함께 이전 정보들 재전송
            • hibernate에 검증 기능 구현
  • Forward vs. Redirect
    • viewname을 return하는 방식은 다 forward
      • forward와 밀접한 관련이 있는 것이 RequestScope
        • 요청 정보는 해당 정보와 관련있는 JSP까지 전달됨
        • SetAttribute로 Request에 값을 담고, GetAttribute로 값을 꺼냄
      • JSP는 RequestScope에서 정보를 꺼내서 결과 출력
    • redirect는 view를 생성하지 않고, browser에게 redirect하라는 명령 (status code: 302)
      • browser는 redirect하라는 주소로 다시 요청보냄
      • 최종적으로 redirect 주소 정보를 받아와 읽게 됨
    • redirect를 할 때도 정보 전달 가능 -> RequestParam을 통해
      • 그러나, header 길이의 한계로 큰 data는 redirect로 전송이 불가능함
      • Spring MVC의 FlashMap 객체 이용해 정보 저장 가능
      • 이후, distpatcherServlet이 FlashMap의 정보를 꺼내서 browser에 제공
      • 해당 FlashMap 정보는 1회용 !
  • @RequestBody와 @ModelAttribute 혼동하지 말자!

    • @RequestBody는 body에 JSON과 같은 데이터 넘어올 때 사용
      • 내가 보낸 정보를 저장해라!
    • body가 form data 형식으로 넘어오면 @ModelAttribute 사용
  • 반환할 객체에 값을 자동으로 채워넣어주는 ArgumentResolver

    • 먼저, 내가 지원하는 type인지를 검사
      • true이면, 해당 객체를 생성
    • Controller method에 객체를 반환해줌
  • Interceptor를 구현하여 값을 검사하거나, 삭제하거나, 검증하는 등의 기능을 구현할 수도 있음
    • 보안 관련된 기능을 구현할 때 용이
  • 작성한 ArgumentResolver와 Interceptor는 Java config에 등록을 해주어야 사용 가능
    • Spring MVC가 읽어들이는 설정에 ArgumentResolver와 Interceptor를 등록해주어야 함
    • ex) WebMvcConfigurer를 구현한 Config class에 두 객체를 모두 등록하여 사용



etc

  • 잘 만들어진 객체는 보는 것만으로도 공부가 됨
    • 내가 객체를 작성해야 할 때 참고하기도 좋음
  • 기술면접에서 화이트보드 면접이 잦아짐
    • 그림 그리면서 설명하는 것이 수월할 것
  • 모든 Web의 기본은 게시판!
  • 프로젝트 주제를 신중하게 정하자
    • 본인이 계속 운영하고 싶은 페이지를 만들어라!
    • open source로 만들어 계속 version up
    • 이후, 이직 과정에서 포트폴리오로 사용할 수 있음
    • Why? 내가 사용하지 않는 코드는 version up이 되지 않음
    • 또한 개발이 50%라면, 운영 역시 50% 만큼의 능력을 요함
  • Paper Prototyping을 하자!
    • 웹 페이지 어떻게 구성될 것인지 detail하게 그려가며 구상
  • 디자인에 신경을 쓰지 않더라도, 최소 bootstrap 정도는 이용하는 것이 좋음
  • 앞으로는 Java 8을 공부해야 함
    • Stream, lambda 등의 신규 문법 숙지!
  • 절대로 운영중인 서버에는 sysout 사용하지 마라
    • 성능이 엄청 떨어짐
    • 대신, logger 객체를 이용해야 함
  • 어느 한 interface가 있고, 다른 class에서 해당 interface를 구현해야 함
    • 이 인터페이스의 모든 기능을 구현하지 않고, 필요한 기능만 구현하고 싶다면?
    • ex) 사용자가 MyInterface만들었고, 해당 인터페이스가 메소드를 5개 가지고 있음
      class MyBean implements MyInterface{
      5개의 메소드 구현해야 함
      }
      
  • 이전에는 이러한 불편함 해결하기 위해 Myinterface를 구현한 MyAdapter라는 default 클래스 제공
    • 해당 interface의 method들을 구현하고 있지만, 내용은 없음
class MyAdapter implements Myinterface{
    ...
    ... 
}

class MyBean extends MyAdapter{
    필요한 것만 Override해서 사용!
}
  • jdk 8부터는 default method 기능 추가됨
    • 이제 interface도 method 구현이 가능해짐!
    • Why? Framework 측에서 제공하는 interface에 method 추가하고 싶은데,
    • 이미 framework를 사용하고 있는 수 많은 프로젝트들 때문에 함부로 추가하지 못함
    • 함부로 method의 갯수를 늘리면 모든 프로젝트가 에러나게 생김
    • default로 구현된 method를 추가하여 배포하면 문제없이 사용할 수 있게 될 것이라는 개념에서 비롯됨


Network Layer (2)

Routing Algorithm

  • Global or decentralized information?
    • global
      • 모든 router는 link cost info를 지녀야 함
      • "link state" algorithms
    • decentralized
      • router는 물리적으로 연결된 이웃과 해당 이웃과의 cost를 알아야 함
      • 연산의 결과에 대해 이웃과 정보 교환을 해야 함
      • "distance vector" algorithms
  • Static or Dynamic?
    • static
      • routes가 시간에 따라 느리게 변화
    • dynamic
      • route가 보다 빨리 변경
      • 주기적인 update
      • link cost가 변함에 따라 변경

Link-State: Dijkstra's algorithm

  • 모든 node들이 net 상의 link costs를 알고 있음
    • link state broadcast를 통해서!
    • 따라서 모든 node들은 같은 정보를 지니고 있음
  • 한 node에서 다른 모든 node로 가는 가장 적은 cost의 path 연산
  • 알고리즘 복잡도: n nodes
    • 다른 모든 node들 까지의 거리를 구해야 하므로, O(n^2)
    • 우선순위 큐를 활용하여 O(nlogn) 까지 성능 향상 가능

Distance Vector algorithm

  • 각각의 node들은 각각의 이웃과의 cost를 알아야 함
  • 시간에 따라 각 node들은 distance vector 추정치를 이웃들에게 전송
  • link cost changes:
    • node가 local link cost를 감지했을 때
    • routing info를 update하고, distance vector 재연산
    • DV가 변동되면 이웃에게 알림

Hierarchical routing algorithm

  • 여태까지의 routing은 이상적인 case
  • 실제로는 그처럼 이상적이지 않음
  • 모든 목적지의 정보를 routing table에 저장할 수 없음

  • router들을 region에 응집시킴 -> Autonomous Systems
  • 같은 AS에 있는 router들은 같은 routing protocol을 따름
    • intra-AS routing protocol
  • 다른 AS에 있는 router들은 다른 routing protocol 따름
  • Gateway router가 각각의 AS의 입구에 존재
    • 해당 AS를 다른 AS와 연결하는 역할




Intra-AS Routing

RIP: Routing Information Protocol

  • use distance vector algorithm
  • 각각의 link는 1 cost를 의미하며, hops 단위로 계산
  • 30초 마다 advertisement를 통해 이웃 간 정보 교환

  • 180초 이후에 advertisement 전송 안되면, 해당 이웃/link를 dead 판정
    • 해당 이웃 지나는 route 모두 무효 판정
    • 따라서 새로운 ad를 이웃들에게 보냄

OSPF: Open Shortest Path First

  • use link state algorithm(다익스트라 알고리즘)
  • 각각의 node에는 모든 cost 비용 존재
  • OSPF advertisement는 이웃 당 하나의 entry 나름
    • advertisement는 전제 AS로 퍼짐
  • 모든 OSPF 메시지는 악의적 침입을 막기 우해 authenticated
  • RIP는 하나의 path만 허용하지만 OSPF에는 같은 cost의 길이 여러 개일 경우, 다수의 paths 허용
  • 큰 domain에서는 hierarchical OSPF 사용


Internet inter-AS routing: BGP(Border Gateway Protocol)

  • inter-domain routing protocol
  • 두 개의 BGP router들이 BGP msg 교환
    • advertising paths to different dest
    • exchanged over semi-permanent TCP connection
  • How does entry get in forwarding table?
    • Router가 다른 AS의 prefix임을 인지
      • BGP advertisement를 통해 다른 모든 router들에게 알림
    • 해당 prefix를 위한 router의 output port를 결정
      • BGP route selection을 통해 최적의 inter-AS route 설정
      • OSPF를 사용하여 inter-AS route로 향하는 최적의 intra-AS route를 설정
      • Router가 해당 경로의 prot를 idetify
    • prefix-port entry를 forwarding table에 입력

Why different Intra-, Inter-AS routing ?

  • intra-AS: 성능에 초점을 둘 수 있음
  • inter-AS: 성능보다 policy에 초점을 맞추어야 함

Broadcast routing

  • source로부터 다른 모든 node들에게 패킷 전달
  • source packet을 복제하는 것은 비효율적

In-network duplication

  • flooding
    • node가 broadcast packet을 받으면 다른 모든 이웃들에게 복사본 전송
    • cycle 생길 위험 있음
  • controlled flooding
    • node가 이전에 같은 packet을 broadcast하지 않았다면 해당 packet만 broadcast
    • 이미 broadcast 되었던 packet id를 트랙킹
  • spanning tree
    • node들이 여분의 패킷을 전송받을 필요 없음

Spanning Tree

  • node들이 spanning tree를 따라 copy를 전송
  • 외에도 Shortest path tree, Reverse path forwarding, Steiner tree 등의 구조가 있을 수 있음


'Software Convergence > Network' 카테고리의 다른 글

HTTP 상태 코드  (1) 2018.11.15
Network Layer (1)  (0) 2018.10.07
Transport Layer  (0) 2018.10.07
OSI 7 Layers Overview  (0) 2018.10.01
Application Layer  (0) 2018.09.30

Network Layer (1)

Network Layer

  • 송신자로부터 수신자로 segment를 전송
  • 송신자 측에서는 segment를 datagram으로 캡슐화
  • 수신자 측에서는 segment를 transport layer로 전송
  • router는 header field의 모든 IP datagram을 검사하여 넘김

Two key network-layer function

  • forwarding
    • router의 input에서 적절한 output의 router로 패킷을 전송
  • routing
    • 소스로부터 목적지까지 패킷이 전송되어야 할 경로 결정
    • Routing algorithm

Connection setup

  • datagrams flow 이전에 두 종단 시스템과 router는 가상의 연결을 맺어야 함
  • network: 두 호스트 간의 연결
  • transport: 두 프로세스 간의 연결

Connection, connection-less service

  • datagram 네트워크는 네트워크 계층의 connection-less service 제공
  • virtual-circuit 네트워크는 네트워크 게층의 connection service 제공
  • TCP/UDP의 connection-oriented/connectionless와 같음
    • 그러나 host 간 제공되는 서비스이며,
    • 네트워크가 제공하는 circuit 외에는 선택지가 없으며,
    • 네트워크 코어 간 수행된다는 차이 존재

Virtual circuits

  • "source-to-dest path behaves much like telephone circuit"
    • performance-wise
    • src-to-dest path와 함께 네트워크적 action이 취해짐
  • 각각의 패킷은 Virtual circuit Identifer를 지님(dest host의 주소가 아님)

  • VC consists of
    • path from src to dest
    • VC numbers
      • link에 따라 변경될 수 있음
    • entries in forwarding tables
  • VC는 현대 인터넷에 사용되지 않음

Datagram networks

  • router는 종단 간 연결에 대한 상태를 지니지 않음
  • Packet는 단순히 dest host address를 참조해 전송됨

Longest prefix matching

  • forwarding table을 참조할 때, 가장 긴 접두부를 공유하는 범위의 Link inferface를 참조하게 되는 것

Router architecture overview

  • Input ports
    • datagram의 dest를 보고, forwarding table을 참조하여 output port를 검색
    • forwarding 속도보다 datagram이 빨리 들어올 수 있기 때문에 Queue를 사용하여 Queueing
  • Output ports
    • 배출 속도보다 빠른 도착 속도를 고려해 buffer를 두어 buffering
    • datagram Scheduling

Switching fabrics

  • 3 types of switching fabrics

Switching via memory

  • 1세대 Router
  • CPU에 의해 직접적으로 switching
  • memory의 bandwidth에 switching 속도 제한됨

Switching via a bus

  • 공용 bus를 통해 input port memory에서 output port memory로 datagram switching
  • bus의 bandwidth에 의해 switching 속도 제한

Switching via interconnection network

  • bus bandwidth의 한계 극복
  • 멀티프로세서에 여러 개의 프로세서 연결하기 위해 고안됨
  • 이제는 보다 더 발전되어 datagram을 일정 길이로 쪼갠 후, 해당 cell들을 fabric을 통해 switching

The Internet network layer

  • IP datagram format

IP fragmentation, reassembly

  • network link에는 MTU(max transfer size) 존재
  • 때문에 큰 크기의 IP datagram은 분할되어 전송
  • 최종 목적지에서 재조립됨


IP addressing

  • IP 주소: host와 router interface를 위한 32bit의 식별자
  • interface: host/router와 physical link 간 연결 장치
  • subnet: router의 간섭 없이 물리적으로 접근 가능한 장치들의 집합(위 그림에는 3개의 subnet 존재)
    • subnetmask가 해당 subnet을 구성할 수 있는 host들의 수 정의

CIDR(Classless Inter-Domain Routing)

  • 최신의 IP 주소 할당 방법
  • 네트워크 클래스를 대체하고, 기존 방식에 비해 유연성을 더해줌
  • 급격히 부족해지는 IPv4 주소를 보다 효율적으로 사용하게 해줌

DHCP(Dynamic Host Configuration Protocol)

  • 서버로부터 동적으로 IP 주소를 얻음
  • 임대하여 사용 중인 주소 갱신 가능
  • 서버와 연결되었을 때만 사용하므로, 해당 주소 재사용 가능

NAT: Network Address Translation

  • local network를 하나의 IP로 구성 가능
  • local 내의 장치들은 보안성도 얻을 수 있음
    • 외부 세계에 의해 addressable, visible 하지 않기 때문
  • NAT router가 알아야 할 것
    • outgoing datagram: 어느 장치에서 출발했는지
    • incoming datagram: 어느 장치로 보내야 할 지
    • NAT translation table
  • NAT는 router의 기능을 초과하여 end-to-end system에 간섭하게 되는 단점 존재
    • IPv6를 통해 더 많은 주소 사용 가능해질 것

NAT traversal problem

  • client는 10.0.0.1의 특정 server와 연결하고 싶음
  • 그러나 공개된 외부 IP 주소는 단 하나이기 때문에 direct 연결이 불가
  • solution 1
    • 외부 IP의 특정 port로 접근 요청 시, 바로 10.0.0.1로 forwarding 하게 설정
    • e.g., (123.76.29.7, port 2500) always forwarded to 10.0.0.1 port 25000

  • solution 2
    • 10.0.0.1의 host에게 공개 IP 주소를 알림
    • 직접 Port 번호와 Mapping(지정 시간을 두고)
  • solution 3
    • relay 서버를 활용
    • relay 서버가 client와 NATed client의 패킷 교환을 중개

ICMP: Internet Control Message Protocol

  • host와 router들이 network level의 정보를 교환하기 위해 사용
    • error reporting
    • echo request/reply
  • ICMP message는 IP datagram에 들어감

Transition from IPv4 to IPv6

  • 모든 router들이 동시에 업그레이드될 수는 없음
  • 어떻게 network는 IPv4와 IPv6 router를 혼합해서 사용할 수 있을 것인가?

  • Tunneling
    • IPv6 datagram이 IPv4의 payload로 실려다님


'Software Convergence > Network' 카테고리의 다른 글

HTTP 상태 코드  (1) 2018.11.15
Network Layer (2)  (0) 2018.10.08
Transport Layer  (0) 2018.10.07
OSI 7 Layers Overview  (0) 2018.10.01
Application Layer  (0) 2018.09.30

Transport Layer

Transport services and protocols

  • 다른 호스트에서 동작 중인 어플리케이션 프로세스 간 logical communication을 제공
  • Transport protocol은 종단 시스템에서 작동
    • send side: app message를 segment로 쪼개어 network layer로 전달
    • rcv side: segment를 재조립하여 message로 만들어 app layer로 전달
  • 1가지 이상의 transport 프로토콜 사용 가능
    • TCP and UDP

Transport vs. network layer

  • network layer: logical communication between hosts
  • transport layer: logical communication between processes

Internet transport-layer protocols

  • 순서가 있는 신뢰성 전달: TCP
    • congestion control
    • flow control
    • connection setup
  • 순서가 없는 비신뢰성 전달: UDP

Multiplexing/demultiplexing

  • multiplexing at sender:
    • 여러 socket으로 부터 온 data를 transport header에 추가(이후 demultiplexing에 이용됨)
  • demultiplexing at receiver:
    • header 정보를 이용하여 요청에 맞는 socket에 전달 받은 segment 전송

How demultiplexing works

  • host가 IP datagram을 전송 받음
  • 각각의 datagram은 source IP와 destination IP를 지님
  • 각각의 transport segment는 source port와 destination port를 지님
  • host는 IP 주소와 Port 번호를 이용하여 적합한 socket에 해당 segment 전송!

UDP(User Datagram Protocol)

  • 'best effort' service UDP
    • 데이터 유실 있을 수 있음
    • 데이터 순서가 섞일 수 있음
  • connectionless: UDP Sender와 Receiver 간 handshaking 하지 않음
  • 신뢰성 있는 전송을 위해서는 Application 계층에서 신뢰성을 추가해주어야 함
  • 장점
    • connection이 필요 없음(Overhead x)
    • 간단하게 구성 가능
    • header size가 작음

UDP checksum

  • Sender
    • 1의 보수로 구성된 checksum을 header의 checksum field에 더함
  • Receiver
    • 전송 받은 segment의 checksum을 연산
    • 연산된 checksum이 field 값과 같은지 비교하여 오류 여부 판단

Reliable Data Transfer(RDT)

rdt 1.0: reliable transfer over a reliable channel

  • 신뢰성 있는 채널 하에서의 데이터 전송을 가정
    • no bit errors
    • no loss of packets
  • 송신자는 채널을 통해 데이터 전송
  • 수신자는 채널을 통해 데이터 수신

rdt 2.0: channel with bit errors

  • 비트 에러가 존재할 수 있음을 가정
  • 에러를 어떻게 복구할 것인가? 'Stop and Wait'
    • ACK: 송신자 -> 수신자. 패킷 잘 받았음!
    • NAK: 송신자 -> 수신자. 패킷 못 받았음!
  • 그러나 만약, ACK/NAK에 오류가 생긴다면?
    • 송신자는 수신자의 상황을 알 수가 없음!
    • 중복의 문제로 인해 재전송을 하기도 애매함

rdt 2.1

  • 송신자는 ACK/NAK에 오류가 생기면 현재 패킷을 재전송
    • 각각의 패킷에 'Sequence Number 부여'
    • 수신자는 'Sequence number' 확인하여 중복된 데이터 폐기
  • 0과 1의 두 가지 sequnce num이면 충분
  • 수신자는 기대한 Sequnce number와 전송 받은 번호를 비교하여 중복 데이터 폐기 가능
  • 수신자는 자신이 보낸 ACK/NAK가 송신자에게 제대로 전송되었는지 알 수 없음

rdt 2.2 NAK-free protocol

  • ACK에 Sequence number를 추가함으로써 잘못된 데이터를 받은 것을 다시 송신할 수 있게 하는 프로토콜

rdt 3.0 channels with errors and loss

  • channel에서 패킷도 유실될 수 있음을 가정
  • 송신자가 ACK를 기다리는 '적당한' 시간 간격을 둠
    • 이 시간 안에 ACK가 도착하지 않으면 패킷 재전송
    • 만약 패킷이 유실된 것이 아니라 단순 지연으로 인해 늦어진 것이었다면
      • sequnce number가 중복 데이터 처리

Pipelined protocols

Go-Back-N

  • 송신자는 N개 만큼의 unacked packet을 파이프라인 통해 전송
  • 수신자는 점증적 ACK만을 보냄
  • 송신자는 가장 오래된 unacked packet에 timer 부착
    • timer 만료되면, unacked된 모든 패킷을 재전송

Selective Repeat

  • 송신자는 N개 만큼의 unacked packet을 파이프라인 통해 전송
  • 수신자는 각각의 패킷에 대한 individual ack를 송신자에게 전송
  • 송신자는 각각의 unacked packet에 대한 timer 유지
    • timer 만료되면, 해당 unacked packet만 재전송

TCP

  • 신뢰성 있는, 순서를 보장하는 전송
  • Pipelined
    • congestion, flow control이 window 크기 결정
  • connection-oriented by handshaking
  • TCP의 Sequence number와 ACK

  • TCP의 timeout 설정 기준
    • RTT 보다 길게!
    • 너무 짧으면, 불필요한 재전송하게 됨
    • 너무 길면, segment loss에 느린 대처하게 됨

TCP retransmission scenarios



TCP fast retransmit

  • timeout 시간이 상대적으로 긴 경우가 있을 수 있음
    • packet loss 이후에 재전송에 긴 지연이 생김
  • 중복된 ACK를 통해 packet loss를 감지 가능
  • 만약 송신자가 같은 데이터에 대한 ACK를 3번 받게 되면,
    • 가장 작은 번호의 unacked packet부터 재전송

TCP flow control

  • 수신자가 송신자를 제어하여, 수신자의 buffer가 overflow되지 않도록 하는 것
  • 수신자는 TCP 헤더의 rwnd라는 값에 여유 버퍼 공간을 알려, 송신자가 너무 많은 데이터를 보내지 못하도록 함

Handshake

  • 2-way handshake의 실패 사례

  • 3-way handshake

TCP: closing a connection




혼잡 제어의 원리

  • "too many sources sending too much data too fast for network to handle"
  • lost packets과 long delay를 초래
  • 1번 시나리오

  • 2번 시나리오
  • 2번 시나리오의 이상적 해결안
    • Perfect knowledge: 송신자는 router의 buffer에 공간이 있을 때만 패킷 전송
    • Known loss: packet loss를 인지했을 때만 데이터 재전송
  • 현실적 해결안
    • duplicates: 송신자는 패킷의 loss와 drop을 고려하여, 2개의 복사본을 보냄
  • 3번 시나리오

혼잡 제어의 2가지 접근법

  • 호스트 간의 혼잡 제어
    • 네트워크로부터 피드백 존재하지 않음
    • 종단 시스템에서 loss와 delay의 발생을 보고 혼잡 발생 추론
    • TCP와 같은 접근 취함
  • 네트워크 지원 하의 혼잡 제어
    • 라우터가 종단 시스템에게 피드백 제공
    • 송신자의 송신 속도 제어

TCP congestion control

  • 송신자는 전송 속도를 서서히 증가시킴
    • loss 발생할 때 까지 증가시키며, 적정 bandwidth를 검증
  • additive increase: loss 감지될 때 까지 매 RTT마다 전송 속도 증가
  • multiplicative decrease: loss 발생 이후에 전송 속도 반으로 절감
    • TCP Reno: loss 발생 이후, 전송 속도를 반으로 줄임
    • TCP Tahoe: loss 발생 이후, 전송 속도를 1로 줄임


'Software Convergence > Network' 카테고리의 다른 글

HTTP 상태 코드  (1) 2018.11.15
Network Layer (2)  (0) 2018.10.08
Network Layer (1)  (0) 2018.10.07
OSI 7 Layers Overview  (0) 2018.10.01
Application Layer  (0) 2018.09.30

두다지 서버 개발자 양성 프로그램 Week 7

7번 째 멘토링

컴퓨터 네트워크의 단골 손님인 OSI 7계층에 대한 전반적 이해와 Application Layer를 학습한 후, 학습한 내용에 대하여 리뷰하는 시간을 가졌다. 멘토링 시간을 위해 컴퓨터 네트워크라는 과목을 다시 학습해보니 작년에 수업을 통해 배울 때 보다 양이 더 방대하게 느껴졌고, 세세한 이해를 필요로 하는 부분이 많아 한 계층만을 학습하는데에도 오랜 시간이 소모되었던 것 같다. 멘토님께서는 네트워크 전문가로의 길을 갈 것이 아니라면, 각 계층의 특징과 계층 간 이동의 flow를 이해하는 정도로 충분하다고 하셔서 심도 깊은 이해보다는 각 계층에 대한 특징에 초점을 맞추고 학습했던 것 같다. 그리고 멘토링 시간을 통해 멘토님께서 그림을 통해 네트워크의 전체적 전송 flow를 잘 설명해주셔서 이해에 더 도움이 되었다.

학습한 것에 대한 리뷰

  • 네트워크는 정보 전달에 가장 큰 목적이 있음
  • 실생활의 '등기우편'도 컴퓨터 네트워크와 같은 개념
    • 상대방이 잘 수령했는지 여부까지 알 수 있는 송신법
    • 분류 과정에서 각 branch는 자신이 관심 있는 부분만 본다!
  • 각 계층 역시 패킷의 내용 중에서 관심있어 하는 '특정' 부분의 정보만을 선택해서 보는 것
  • Socket은 일종의 Module이자 API
    • 프로세스 내에 존재하는 것이며, User가 Queue에 쌓인 데이터 상황을 보며 사용

Computer Network

  • CSMA/CD는 같은 LAN에 물리는 host간 경쟁적으로 LAN선 사용하기 위한 방식
  • 같은 LAN선에 물린 host들 간에는 서로 패킷이 공개되는 문제가 있을 수 있음
    • 네트워크 카드까지 해당 패킷 들어오나, 운영체제단에서 header(dest IP) 확인하고 Drop 혹은 Take
    • 커널 튜닝을 통해 같은 LAN선의 데이터 모두 Sniffing 가능할 수도 있음
  • 같은 LAN선에 물린 host들 간 데이터 전송은 LAN 하나에서 모두 처리되기 때문에 빠를 수 밖에 없음
    • 따라서 서버 간 데이터 전송이 잦은 host들은 같은 LAN선에 물리게 네트워크 설계
  • Switch는 대개 그저 자신에게 가장 가까운 Router에게 패킷 전송
    • Router가 RIP 등의 프로토콜 통해 Routing 수행
  • ISP 간 통합이 되지 않기 때문에 Routing의 효용이 떨어짐(ISP is for business)
  • 자기 자신에게 온 패킷을 받지 않는 경우도 있을 수 있음
    • 받고 싶을 경우, Listen을 수행해야 함
    • Port의 개념이 등장한 이유
      • 해당 Port number로 전달된 패킷만 허용하겠다는 의미
      • 항상 destination 주소와 Port number가 함께 움직임!
      • 기본적으로 HTTP의 경우 80번 Port를 default Port number로 사용
  • UDP의 특징: 아예 못 받거나, 보낸만큼 다 받거나
    • 패킷의 수신 순서를 전혀 알 수 없음
    • Streaming Service, Interactive game에서 캐릭터의 위치 정보 등에는 사용하기 좋음
      • 즉, 마지막 패킷 정보가 중요한 서비스에 적합
  • 그러나, 대부분의 경우가 그렇지 않음 -> 'TCP를 사용해야하는 Case들'
  • TCP는 받는 쪽에서 일정 Port number로 Listen을 하고 있음
    • 보내는 쪽은 TCP Connection 확인(3-Way handshake)
    • 연결되면 이후부터 패킷 전송
  • Connection은 양측에서 socket을 생성하는 상황
    • 각 Socket은 내 IP 정보, 상대 IP 정보를 담고 있음
    • Client는 Server로 부터 어떠한 Port number로 전송할 것이라는 정보를 받음
        1. C -> S : 나 TCP Connection 할래
        1. S -> C : 그래. 나는 너에게 정보를 보낼 일이 있으면, '9999' Port number로 정보를 전송할게
        1. C -> S : 알겠어. 지정해준 Port number도 확인했어
  • 그러나 TCP Connection 이후에도 Dead Connection의 문제가 있을 수 있음
    • heart beat packet을 보내는 이유
    • heart beat의 확인을 통해 연결이 still alive 상황인지 확인할 수 있음
  • 전송하고자 하는 패킷이 너무 크면 번호를 붙여 Packet을 나누어 전송
    • socket.write(2048)하면 실제로는 규약에 따라 일정 크기(ex. by 128 bytes)로 나누어 번호를 붙여 전송
    • socket.read(2048)하면 buffer에 채워진 정보를 읽어올 수 있음
      • socket.read(1024)하면 buffer의 앞 부분을 읽어오게 됨
      • socket.read(10000)하더라도 2048 bytes 만큼만 보여줌
  • 전송 과정에서 패킷 유실의 문제도 있을 수 있음
    • TCP의 flow control을 통해 순서가 보장된 buffer를 전송 받을 수 있게 됨
    • Go back N, Selective Repeat 등의 알고리즘을 통해 순서 회복 가능
  • 받는 쪽에서의 해석이 중요하기 때문에 인코딩, 디코딩 개념이 등장
    • 우리는 어떻게 보내겠다라는 약속을 해야 함
      1. Parser를 이용
      • 서로 보낼 정보가 무엇인지 아는 가정하에 특수문자 등을 이용하여 전송
      • ex) A, 90, 80, 70 / B, 90, 50, 60
      1. 각 정보를 전송 크기 만큼 채워서 전송
      • ex) A, 90, 80, 70
      1. Application header에 Packet key값과 길이 정보 전달
      • 특정 길이만큼은 해당 key값에 들어가야하는 정보라고 명시
  • JSON의 경우 줄바꿈을 기준으로 Parsing
    • JSON.parse()는 socket.readline()와 같은 개념
    • 성능이 뛰어난 방법은 아니지만 굉장히 편리하고 유연하기 때문에 널리 사용
  • HTTP도 status code, header code 그리고 body code를 줄바꿈을 기준으로 parsing

다음 주 까지의 assignment

  • UDP 소켓 프로그래밍으로 TCP 구현
    • UDP로 보내지만 TCP와 같이 동작하도록!
    • socket과 buffer 사용
    • FakeRouter도 하나 생성 -> 하나의 Process
      • 정해진 길이만큼 Router에 write
      • Router는 일정 확률(5-10%)로 Packet Drop
      • 이후 TroubleShooting(flow control, sequence..)
    • Magic Port Number(ex. 50000) 사용
  • Transport Layer, Network Layer 정리


Overview

OSI 7계층 탄생 배경

  • 여러 정보 통신 업체 장비들은 타사의 장비와 연결이 되지 않는 등 호환성 문제가 존재
  • ISO 단체에서 1984년 OSI 참조모델 발표
  • OSI란 네트워크 통신의 개방 시스템 상호 연결 모델(Open Systems Interconnection)
  • 모든 시스템들들의 상호 연결을 가능케 하는 표준으로 7개 계층으로 구분

각 계층의 캡슐화와 디캡슐화

  • 데이터를 전송할 때 각각의 층마다 인식할 수 있어야 하는 헤더를 붙이게 되는데 이러한 과정이 캡슐화
  • 데이터가 전송매체를 통해 전송된 후 1계층 부터 7계층으로 올라가며 헤더가 벗겨지는데 이러한 과정이 디캡슐화

OSI 7계층의 계층별 프로토콜과 기능

  • PDU(Process Data Unit)이란 각 계층에서의 전송 단위
  • 1계층에서는 PDU이 bit라고 생각하기 쉽지만, 단지 신호의 흐름일 뿐
  • 2계층(Frame), 3계층(Packet), 4계층(Segment), 그 이상 계층(Data)

각 계층별 대표적 프로토콜


Application Layer

  • 사용자와 가장 밀접한 계층이며, 인터페이스 역할 수행
  • 기능: 응용 프로세스 간 정보 교환
  • ex) email, internet, media player 등의 application

Presentation Layer

  • 기능: 데이터 표현에 차이가 있는 응용처리에서의 제어 구조 제공
    • 데이터 표헌 차이: ASCII, JPEG, MPEG 등의 translation
  • 전송하는 데이터의 인코딩, 디코딩, 암호화, 코드 변환 등 수행

Session Layer

  • 기능: 통신장치 간 상호작용 및 동기화 제공
  • 연결 세션에서 데이터 교환과 에러 발생시 복구 관리
    • 즉, 논리적 연결 담당
  • ex) SSH

Transport Layer

  • 기능: 종단 간에 신뢰성 있고 정확한 데이터 전송 담당
  • 4계층 전송 단위는 Segment이며, 종단 간 에러복구와 흐름 제어 담당
  • ex) TCP(Transmission Control Protocol), UDP(User Datagram Protocol)

Network Layer

  • 기능: 중계 노드 통하여 전송하는 경우, 어떻게 중계할 것인가를 규정
  • 3계층 전송 단위는 Packet이며, Packet을 목적지까지 경로 설정을 함
  • 데이터를 목적지까지 가장 안전하고 빠르게 전달하도록 하며, 이를 라우팅이라 함
  • ex) IP(Addressing, Fragmentation, Routing)
  • 3계층 장비: 라우터, L3 스위치

Data Link Layer

  • 기능: 물리적 연결을 통하여 인접한 두 장치 간 신뢰성 있는 정보 전송 담당
  • 2계층 전송 단위는 Frame이며, 주소와 제어정보 가짐
  • 정보의 오류와 흐름을 관리하여 안정된 정보 전달
  • ex) IEEE802.2(LLC), IEEE802.3(CSMA/CD), IEEE802.5(Token Ring)
  • 2계층 장비: 브릿지, 스위치

Physical Layer

  • 기능: 전기적, 기계적 특성 이용하여 통신 케이블로 전기적 신호 전송
  • 인코딩 전압 및 케이블 사양 핀의 수 등을 정의한 계층
  • 단지, 데이터 전달의 역할만 수행
  • 1계층 장비: 케이블, 리피터, 허브


'Software Convergence > Network' 카테고리의 다른 글

HTTP 상태 코드  (1) 2018.11.15
Network Layer (2)  (0) 2018.10.08
Network Layer (1)  (0) 2018.10.07
Transport Layer  (0) 2018.10.07
Application Layer  (0) 2018.09.30

Application Layer

Application architectures

  • Client-Server
  • Peer-to-Peer(P2P)

Client-Server architecture

  • Server
    • always-on host
    • 영구 IP 주소
    • 규모에 따라 데이터 센터일 수도 있음
  • Clients
    • Server와 커뮤니케이션
    • 클라이언트 간 직접 커뮤니케이션 하지 못함
    • 간헐적으로 연결
    • 동적 IP 주소를 가질 수 있음

P2P architecture

  • no always-on server
  • host들이 자발적으로 직접 커뮤니케이션 -> Self scalability
  • peer는 다른 peer에게 서비스를 요청하고, 또 다른 peer에게 서비스를 제공할 수 있음
  • peer들은 간헐적으로 연결되며, IP 주소를 바꿈
    • 관리의 어려움

Process communicating

  • process: host 내에서 실행 중인 프로그램
  • 서로 다른 프로세스가 같은 host에서 실행 중이라면, IPC(Inter Process Communication)을 이용하여 통신
  • 서로 다른 프로세스가 다른 host에서 실행 중이라면, Messages를 교환하며 통신
  • Client process: 통신을 시작하는 프로세스
  • Server process: 다른 프로세스의 연결을 기다리는 프로세스

Sockets

  • 프로세스는 메시지를 socket으로부터 받거나, socket으로 전송

Addressing processes

  • message를 전달받기 위해서 프로세스는 반드시 identifier를 지녀야 함
  • identifer는 IP 주소와 포트 번호를 포함
  • ex) HTTP Server은 80번 포트 번호 사용, mail server는 25번 포트 번호 사용

App-layer protocol defines

  • message type
    • ex) request, response
  • message syntax
    • 어떤 필드값이 있어야 하며, 필드 값들이 어떻게 채워져야 하는지
  • message semantics
    • 필드 값들의 의미
  • 언제 그리고 어떻게 프로세스들이 메시지를 전송하고, 응답하는지에 대한 rules

Application에 필요한 전송 서비스

  • Data integrity
    • 어떤 app들은 100% 신뢰 가능한 데이터 전송을 요구(ex: file transfer)
    • 반면, 어떤 app들은 약간의 손실을 허용(ex: audio)
  • timing
    • 어떤 app들은 낮은 지연율을 요함(ex: interactive games)
  • throughput
  • security
    • 암호화, 데이터 무결성...

Internet transport protocols services

  • TCP service
    • 신뢰성 있는 전송
    • flow control
    • congestion control
    • connection-oriented
    • does not provide: timing, minimum throughput guarantee, security
  • UDP service
    • 비신뢰성 전송
    • does not provide: reliability, flow control, congestion control, timing, throughput guarantee, security, connection set-up

SSL

  • 암호화된 TCP 연결을 제공
  • data integrity
  • end-point authentication
  • SSL is at app layer
    • app들은 TCP와 대화하는 SSL 라이브러리를 사용

Web and HTTP

  • Web page는 object들로 구성되어 있음
    • object는 HTML file, Image, Audio 등
  • Web page는 여러 참조된 object들을 포함하는 HTML file로 구성
  • 각각의 object는 URL을 통해 접근 가능
  • ex) www.someschool.edu/someDept/pic.gif

HTTP overview

  • HTTP: HyperText Transfer Protocol
  • Web의 application layer protocol
  • Client-Server 모델
    • Client: Web object들을 요청하고, 받고 화면에 보여주는 browser
    • Server: 요청에 대한 응답으로 object를 보내는 Web server
  • uses TCP
    • 클라이언트가 80번 포트 번호를 이용하여 서버에 TCP 연결 시작
    • 서버는 클라이언트의 TCP 연결 승인
    • HTTP messages들이 browser와 Web server 간 교환
    • TCP 연결 종료
  • HTTP is "stateless(무상태)"
    • 서버는 이전 클라이언트 요청에 대한 어떠한 정보도 저장하지 않음

HTTP connections

  • non-persistent HTTP
    • 최대 하나의 object가 TCP 연결 통해 전송 가능
    • 여러 개의 object를 download하기 위해선 여러 번의 연결이 필요
  • persistent HTTP
    • 여러 개의 object가 하나의 TCP 연결을 통해 전송 가능

Response Time

  • RTT: time for a small packet to travel from client to server and back
  • Non-persistent HTTP
    • TCP 연결 시작하기 위한 RTT +
    • HTTP request 위한 RTT +
    • file transmission time =
    • 2 RTT + file transmission time
  • Persistent HTTP
    • 서버는 연결을 open 상태로 둠
    • 모든 object를 받기 위해 하나의 RTT만 필요

HTTP request message

  • 2개의 HTTP 메시지 타입: request, response

Uploading form input


Method types

  • HTTP/1.0:
    • GET
    • POST
    • HEAD
  • HTTP/1.1:
    • GET, POST, HEAD
    • PUT: URL 필드에 지정된 경로에 파일 업로드
    • DELETE: 특정 URL 필드에 명시된 파일을 삭제

HTTP response message

  • status code
    • 200 OK: request 성공, 요청된 object가 이후에 이 msg에 포함될 것
    • 301 Moved Permanently: 요청된 object가 이동함, 이후에 새로운 주소가 이 msg에 명시될 것
    • 400 Bad Request: 서버가 요청 메시지를 처리하지 못함
    • 404 Not Found: 요청된 문서가 이 서버에 존재하지 않음
    • 505 HTTP Version Not Supported

User-Server state: cookies

  • 많은 웹 사이트들이 쿠키를 사용
  • four components
    • cookie header line of HTTP response msg
    • cookie header line in next HTTP request msg
    • cookie file kept on user's host, managed by user's browser
    • back-end database at Web site

Web caches (proxy server)

  • Origin server를 거치지 않고 클라이언트의 요청을 만족하기 위해 사용
  • browser가 모든 HTTP request를 cache로 보냄
    • object가 cache에 있다면: cache returns object
    • object가 cache에 없다면: cache가 origin server에 object request 후, client에게 return

Conditional GET

  • 목표
    • 만약 cache가 최신의 cached version을 가지고 있으면 object를 전송하지 않음
    • no object transmission delay
    • lower link utilization
  • cache: HTTP request에 cached copy의 날짜를 명시
  • server: 만약 cached copy가 최신의 것이면 response는 object를 포함시키지 않음

FTP(File Transfer Protocol)

  • file을 remote host로/로부터 transfer
  • Client-Server model
    • client: side that initiates transfer
    • server: remote host
  • 하나의 file 전송 이후에 서버는 data connection 종료
  • 서버는 다른 file의 전송을 위해서 다른 TCP data connection을 open
  • FTP Server는 'state'를 유지
    • current directory, earlier authentication

E-mail

  • Three major components
    • user agents
    • mail servers
    • SMTP(Simple Mail Transfer Protocol)
  • User Agent(mail reader)
    • composing, editing, reading mail messages
    • outgoing, incoming messages stored on server
  • Mail Servers
    • mailbox는 user에게 온 messages들을 저장
    • message queue는 전송되야 할 mail messages들 담음
    • email messages의 전송을 위한 mail servers들간의 SMTP

SMTP

  • reliable transfer를 위해 TCP 사용(25번 포트 번호)
  • direct transfer: sending server to receiving server
  • Three phases of transfer
    • handshaking
    • transfer of messages
    • closure
  • persistent한 연결 사용
  • message가 7-bit ASCII로 작성되어야 함



POP3 Protocol

  • authorization phase
    • client commands:
      • user: declare username
      • pass: password
    • server responses:
      • +OK
      • -ERR
  • transaction phase
    • list: list message numbers
    • retr: retrieve message by number
    • dele: delete
    • quit
  • POP3 is stateless across sessions

DNS(Domain Name System)

  • IP 주소 대신 'name'을 사용하여 주소에 접근이 가능하게 함
  • 분산된 database가 많은 name server들의 계층을 구현
  • DNS services
    • hostname to IP addr translation
    • host aliasing
    • mail server aliasing
    • load distribution: 하나의 이름에 많은 IP 주소 설정 가능
  • Why not centralize DNS?
    • traffic volume
    • distant centralized database
    • maintenance

DNS: root name servers

  • local name server가 name을 처리하지 못할 때 접근하는 서버
  • name과 주소의 mapping을 TLD로부터 얻어와 local name server에 return
  • 전 세계적으로 13개의 root name server 존재

TLD, authoritative servers

  • Top-Level Domain servers:
    • com, org, net, eud, areo, jobs, museums 등과 모든 국가 도메인들을 관리(ex: uk, kr, ca)
  • authoritative DNS servers:
    • 기관의 name host들에게 authoritative hostname to IP mapping을 제공하는 기관 소유의 DNS Server
    • 기관 혹은 서비스 제공자에 의해 maintain

Local DNS name server

  • 각각의 ISP는 'default name server'라고 불리는 local DNS server 지님
  • host가 DNS query를 발생시키면, query는 local DNS server로 전송됨
    • 최근 name-to-address translation 쌍을 local cache에 가지고 있음
    • proxy와 같이 작동하여, query를 계층 구조로 이동시킴
  • iterated query

  • recursive query

DNS: caching, updating records

  • name server가 mapping을 하면, 해당 mapping을 caching
    • cache entry는 TTL 이후에 timeout
    • TLD 서버는 기본적으로 local name server에 cache 되어 있음
      • 그러므로 root name server는 많이 방문되지 않음
  • cached entry들은 out-of-date인 것일 수 있음 만약 name host가 IP 주소를 바꿔도, 모든 TTL이 만료될 때 까지 다른 Server들은 해당 변경을 알 수 없음

Attacking DNS

  • DDos attacks
    • root server의 traffic을 폭주 시킴
      • traffic filtering을 통해 예방 가능
    • TLD server의 traffic 폭주시키는 것이 더 위험
  • Redirect attcks
    • Man-in-middle: query 가로채기
    • DNS poisoning: DNS 서버에 위조 정보 전송


'Software Convergence > Network' 카테고리의 다른 글

HTTP 상태 코드  (1) 2018.11.15
Network Layer (2)  (0) 2018.10.08
Network Layer (1)  (0) 2018.10.07
Transport Layer  (0) 2018.10.07
OSI 7 Layers Overview  (0) 2018.10.01

두다지 서버 개발자 양성 프로그램 Week 6

6번 째 멘토링

운영체제 남은 후반부를 학습한 후, 학습한 내용에 대한 정리를 하였다. 또한 운영체제 후반부에서 가장 중요한 부분 중 하나인 Concurrency Control(병행 제어)의 경우, 단순 학습에서 그치는 것이 아니라 Spinlock, Semaphore, Producer & Consumer Problem을 직접 소스 코드를 통해 구현해보며 해당 챕터에 대한 이해를 더할 수 있었다. 이 중 Spinlock의 경우, 초반에 이해를 잘못하여 올바른 소스 코드를 작성하지 못하였지만 다른 두 문제의 경우 의도한 대로 잘 작성할 수 있었다. 멘토링 시간에는 정리한 내용에 대한 이야기와 작성한 소스코드에 대한 리뷰를 진행하였다.

학습한 것에 대한 리뷰

  • Block & Wake-up Semaphore는 특정 PID에 Signal을 보내는 방식으로 구현 가능
    • 즉, Wake-up에 대한 책임은 현재 Running 중인 프로세스에게 있음
    • 이 때의 Semaphore는 Lock보다는 Signal을 위한 용도에 가까움
  • Wake-up의 방법 2가지
    • Blocked 된 프로세스들 중 하나를 Wake-up
      • 어떤 프로세스를 깨울 것인가에 대한 문제 존재
    • Blocked 된 프로세스들 전체를 Wake-up
      • 하나의 프로세스만을 running으로 변경하고, 다른 프로세스들을 다시 Blocked 시켜야 하는 Overhead 존재
  • Producer & Consumer Problem에서 2개의 Semaphore를 사용(Event-driven)하면 필연적으로 Busy Waiting보다 느리게 됨
    • CPU를 다 사용하면서, Lock-Free Queue를 사용하면 성능 향상 가져올 수 있음 -> But, Rare case
  • Semaphore에서 자원을 가감해주는 연산(R, V) 역시 공유 자원을 건들이는 것이기 때문에, 연산 전/후에 짧은 Busy-waiting을 통해 Lock을 걸어주어야 함

Operation System

  • Peterson's Algorithm은 현대에 더 이상 사용되지 않음
    • 현재는 Test_and_set과 compare_and_swap의 atomic한 연산을 사용
      • Test_and_set을 while문으로 기다려주는 것이 가장 쉬운 작성법
    • Write 이후에 스케줄링 때문에 context switch가 발생할 위험이 없어지게 됨
  • 언제 스케줄링해야 할지 모른다?
    • Generl Purpose OS의 경우, 운영체제와 어플리케이션단을 분리
      • General Purpose OS는 Virus 때문에 무조건 선점을 해야 함
      • OS 주도 하에 스케줄링을 진행하기 때문에 해당 순서도 OS가 바꿀 수 있음
      • 본질은 Read와 Write를 함께 할 수 없을까에 관한 것
    • Embedded OS의 경우, 운영체제와 어플리케이션이 함께 작동
      • 어플리케이션이 동작이 끝나면 자신의 종료를 Signal을 통해 알리며 운영체제에게 스케줄링 타이밍을 알림(비선점형)
  • 본인의 서비스의 형태에 따라, Busy-waiting or Block/wake-up 방식을 채택할 수 있어야 함
    • 즉, 개발자는 본인의 서비스가 어떻게 작동하는지를 본인이 가장 잘 알아야 함
  • 대부분의 연산의 경우, Lock을 잡으면 반드시 unlock을 하고 싶어 함
    • Semaphore의 경우, V-P를 할 수 있음(Dining Philosophers 문제 참조)
  • Java의 synchronized, Python의 with와 같은 개념이 다 Monitor
    • 프로그래머의 실수를 줄이면서, 병행 제어의 역할 수행 가능
  • 프로세스(혹은 쓰레드)를 Module화 할 때는 서로 공유하는 부분이 최대한 적게 하는 것이 좋음

다음 주 까지의 assignment

  • 'Computer Networking: A Top-down approach' 정리
  • 이후 과제: UDP 소켓 프로그래밍으로 TCP 구현
  • 추가적으로 '후니의 쉽게 쓴 네트워크 프로그래밍' 읽어보면 좋음


+ Recent posts