ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • cs 수업 과제 정리
    project 2022. 6. 17. 11:29

    다시 보니까 뭔가 더 보인다. 다시 정리하도록 하자.

     

    <네트워크>

    1. HTTP 패킷 sniffer

     

    Python pcapy 라이브러리로 HTTP 패킷을 sniff 한다. HTTP 패킷은 ethernet / IP / TCP 헤더 순으로 이어져 있는데, 하나의 HTTP 패킷은 여러 TCP 로 세그먼트 되어 전송된다. Ethernet 헤더에는 MAC 주소 등이 있고, IP 헤더에는 IP 주소 등이 있다. TCP 헤더에는 포트 넘버가 있고, IP 주소와 포트 넘버로 어디서 온 패킷인지 멀티플렉싱 할 수 있다. TCP 헤더에는 seq 넘버가 있고, 이를 통해 몇 번째 패킷인지 알 수 있어 순서를 맞추어 저장할 수 있다. 

     

    이를테면, 패킷 sniff 를 통해 동영상을 다운로드 받고자 한다. 하나의 동영상은 하나의 HTTP 메시지를 통해 전달되며, HTTP 헤더에 크기가 적혀 있다. 이는 transport layer 에서 잘게 나누며 TCP 헤더를 생성하여 몇 번째 패킷인지 적어놓는다. 이를 받아 이으면 동영상이 저장된다.

     


    2. 소켓 프로그래밍

    서버 소켓이 클라이언트 소켓의 메시지를 받아 다른 클라이언트에게 전달하는 기능이다.

     

    하나의 프로세스 (서버) 가 여러 클라이언트의 메시지를 받는데, 서버를 로우 레벨로 구현하는 과제이다.

     

    지금 생각해 보니 이 서버가 발전하고 발전해서 아파치, nginx 이런 프로그램이 되었나 보다.

     

    과제에서 select 함수를 썼는데, 이는 I/O 멀티플렉싱 방법이다. 앞의 두 서버와 다르게 프로세스/스레드를 FORK 하지 않고도 멀티플렉싱이 가능하다. (멀티플렉싱 = 하나의 파이프라인을 공유하여 여러 origin 의 메시지를 전달하는 방법이다.) 

     

    I/O 멀티플렉싱이 뭘까?

     

    https://www.youtube.com/watch?v=85T_ZaT8EUI 

    동시성 프로그래밍의 방법에는 크게 3가지가 있다. 1. 프로세스 2. 스레드 3. IO mulx

    Accept()

    pthread_create(handle_request, fd)

     

    def handle_request():

    receive the request

    open the requested file

    read the file

    write http response header

    write the file

     

    멀티스레딩 기반의 동시성 서버이다. 요청이 들어올 때 마다 스레드를 생성해서 처리하는 방식이다. 생성된 스레드는 스케쥴링 되며 작업은 interleaved 된다. Swap in swap out 을 할 때 state 를 저장하고 불러온다. 

     

    Threads and process are typically used for preemptive multitasking. -> Being switched any time any moments, context switching overheads. 또한, blocking 이어서 하나의 스텝에서 block 될 경우 전체 스케쥴에 영향을 준다.

     

    Rather than reling on OS scheduling.

     

    위의 과정을 스텝으로 나누고, 하나의 스텝을 수행할 때 마다 block 될 경우 sleep queue 에 넣고 block 이 풀리는 시그널을 기다린다. 

     

     

    (Polling vs sleep queue 차이랑 비슷한데?)

    (이 과제 C 로 했으면 좋았을텐데... 파이썬으로 하니까 다 추상화되서 위의 내용을 하나도 모르겠다.)

     

    시스템 프로그래밍 수업에서 배우는 내용이다. 

     

    Thread/process based vs IO mulx

    Thread based 는 작업 순서를 프로그래머가 적어주면, OS 가 알아서 스케쥴링 하는 것. 예를 들어, function A = do A, B, C, D 일 경우 스레드를 돌리면 os 가 하나씩 해준다. IO mulx 는 A, B, C, D 가 있는데, 그 순서는 프로그래머가 정해주겠다.

     

    select 는 historical, core element of IO mulx. 

     

    file descriptor? unique identifier for a file, or other i/o resource, such as pipe, socket.

     

    int select (int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict timeout);

     

    nfds: Max number of file descreptor sets to take care. 

    readfds/writefds: any of fd are ready for read/write, wake me up.

     

    https://www.youtube.com/watch?v=oD94jnuOHLM 

     

     

     

    3. 프록시

     

    프록시 서버는 클라이언트의 요청을 받아 응답을 주거나 서버에 전달해주는 역할을 한다. 웹 캐시를 통한 성능 향상의 목적으로 사용되었으나, 지금은 CDN 으로 이 역할을 대신한다.

     

    프록시는 forward, reverse 프록시 등이 있는데, forward 는 들어온 트래픽을 전달해주는 역할을 한다. 

     

     

     

     

     

     

    ... 다시 보니까 1번은 데이터베이스 커넥션, 2번은 톰캣, NGINX, netty, 3번은 elb, nginx 리버스 프록시 이런걸로 보인다. 알고 들었으면 더 열심히 들었을텐데.

    'project' 카테고리의 다른 글

    Maven 에 대해  (0) 2022.09.21
    Git 과 Git-gui 정리 글  (0) 2022.09.18
    MGP 과제를 하며 느낀 점 - 테스트의 중요성  (0) 2022.06.11
    광고 프로젝트 - 개발 일기  (0) 2022.06.01
    SnsChats - 개발 일기  (0) 2022.05.25
Designed by Tistory.