[WEEK07] 네트워크 - Proxy

novxerim·2021년 12월 25일
1

SW-Jungle

목록 보기
34/59

[Proxy]

- Proxy

: 클라이언트와 서버간의 중계 서버로, 통신을 대리 수행하는 서버
- proxy I: sequential / 서버 하나에 클라 하나
- proxy II: concurrent / 서버 하나에 클라 여러개(컴퓨터시스템 12장)
- proxy III: cache / 프록시에 캐시를 저장

- 목적

ㅇ 프록시는 방화벽 에서 사용된다.
ㅇ 익명화 역할을 하는 프록시는 브라우저를 웹 서버에 익명으로 만들 수 있다.
ㅇ 원격 서버와 다시 통신하지 않고 캐시에서 읽어 미래 요청에 응답한다.

- 종류

  1. Forward Proxy
  2. Reverse Proxy
  3. Load Balancer

- 일반적인 프록시는 Forward Proxy


Proxy 종류별 특징

1. Forward Proxy의 특징

: 클라이언트와 인터넷 사이에 위치 (클라 - 포워드프록시 - 인터넷 - 서버)
1) 캐싱 : 클라이언트가 요청한 내용을 캐싱

  • 전송 시간 절약
  • 불필요한 외부 전송 X
  • 외부 요청 감소 -> 네트워크 병목 현상 방지
    2) 익명성 : 클라이언트가 보낸 요청을 감춤 (우리가 요청했지만 Forward Proxy가 요청한 것 처럼 함.)
  • Server가 응답 받은 요청을 누가 보냈는지 알지 못하게 함
  • Server가 받은 요청 IP = Proxy IP

2. Reverse Proxy의 특징

: 인터넷과 서버 사이에 위치 (클라 - 인터넷 - 리버스프록시 - 서버)
1) 캐싱 : 클라이언트가 요청한 내용을 캐싱 (Forward Proxy와 동일)
2) 보안 : 서버 정보를 클라이언트로부터 숨김
- Client는 Reverse Proxy를 실제 서버라고 생각하여 요청
- 실제 서버의 IP가 노출되지 않음
3) Load Balancing (선택적)

3. Load Balancing

: 여러 대의 서버가 분산(나누어) 처리할 수 있도록 요청을 나누어주는 서비스

  • OSI 7 Layer 기준으로 어떤 것을 나누는지에 따라 다름. L2, L3, L4, L7. 백엔드 주로 L4, L7
    • Mac(L2)과 IP주소(L3)를 바탕으로 나눠서 Load Balancing
    • L4 : Transport Layer(IP&Port) Level에서 Load Balancing(TCP/UDP)
      ex) http://velog.io/@yerimii11 로 접근 시 서버 A, 서버 B로 로드밸런싱(나눠줌)
    • L7 : Application Layer(User Request) Level에서 Load Balancing(HTTPS/HTTP/FTP)

프록시 채점


sudo apt-get install net-tools 터미널에 설치 후
프록시 폴더 들어가서 make clean - make - ./driver.sh
하면 점수가 나온다


[concurrent]

프로세스 : 실행중인 프로그램

thread : 프로세스 안에서 돌아가는 논리흐름

즉, 여러 클라이언트의 요청을 한 서버로 처리하는데, 이 처리방식이 프로세스를 여러개로 하는 방식이 아니라 쓰레드를 이용,
한 프로세스가 feed쓰레드를 여러개 함으로써,그런 요청들을 처리하는 방식으로 했다. -> 책 : 쓰레드에 기초한 동시성 서버. 라고 함


코드 해석 중 의문점

1) '세마포어'라는 것을 왜 사용했을까?

운영 체계 또는 프로그램 작성 내에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호이다.
그런데 병행 내지 병렬로 동작되는 둘 이상의 프로세서 사이에서 공유 자원을 동시에 사용할 수 없기 때문에, 한 프로세서가 사용하고 있는 동안에 세마포어를 세워서 다른 프로세서를 대기시키고 사용이 끝나면 해제시키는 방법으로 사용
비슷한 맥락에서 뮤텍스는 공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것!!!

2) 뮤텍스 인자 왜 1로 지정?

뮤텍스는 0과 1로 구분하여 접근을 상호 배제하는 기술이다.
뮤텍스는 Locking 메커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다.

3) Signal(SIGPIPE, SIG_IGN) 함수의 의미는?

SIGPIPE 시그널은 소켓에서 다른 한쪽이 접속을 끊은 소켓에 대하여 쓰기 / 읽기 작업을 수행하려 할 때 발생한다. 이 시그널의 기본 액션은 프로세스 종료이므로 서버 프로세스는 이 시그널이 발생하면 종료된다. 서버 프로세스가 종료되지 않도록 하려면 Signal(SIGPIPE, SIG_IGN) 을 사용하여 무시한다.


최종 코드에서 받은 피드백

1. index 반으로 나눌 필요 없음

void cache_LRU(int index) {
  int i;

  for (i = 0; i < CACHE_OBJS_COUNT; i++) {
    if (i == index) { continue; }
    writePre(i);

    if (cache.cacheobjs[i].isEmpty == 0) {
      cache.cacheobjs[i].LRU--;
    }

    writeAfter(i);
  }
}

2. if문 중간에 멈출 필요 없음

readerPre 하지 않고 break 할 시 readerPre가 계속 잠겨있어 프로그램이 계속 멈춰있을 수 있는 위험이 있어보입니다.
그래서 저는 break전에 readerAfter(i)를 해주었습니다.

int cache_find(char *url) {
  int i;

  for (i = 0; i < CACHE_OBJS_COUNT; i++) {
    readerPre(i);
    if (cache.cacheobjs[i].isEmpty == 0 && strcmp(url, cache.cacheobjs[i].cache_url) == 0) {
      readerAfter(i);
      return i;
    }
    readerAfter(i);
  }

  return -1;
}

3. Cache_num 사용되는 곳 없음 (삭제해도됨)

4. +

5. +


코드 관련 글은 여기로..

profile
블로그 이전했습니다. https://yerimi11.tistory.com/

0개의 댓글