Contents
네트워크 빠르게 훑어 보기(2)
   2022년06월16일     6분정도면 다 읽어요     - Comments

카카오 클라우드 스쿨 - 네트워크 빠르게 훑어 보기(2)

네트워크 빠르게 훑어 보기

Django에 들어가기 앞서 필요한 네트워크 지식을 빠르게 훑어 보았습니다 (계속)
자료 출처: www.ddarahakit.kro.kr 님(ddarahakit.tistory.com)



ch8. UDP

  • 우리는 TCP만 볼 예정, 생략



ch9. TCP

  • (복습)포트: 클라이언트 프로그램이 서버 프로그램을 알아 볼 수 있도록 하는 것이 포트번호
    • img_8.png

3 way handshake

  • img_10.png
    1. 요청은 항상 클라이언트가 먼저 보냄(SYN)
    2. 서버는 응답을 해 줌(SYN) + 반대로 서버도 요청을 보냄 (ACK)
    3. 클라이언트까지 최종 확인(ACK)
      • 위와 같이 연결 수립을 한 다음 다음 통신함



상태전이도

  • img_11.png
    1. 서버 측은 Always listening 상태
    2. 그 상태에서 클라이언트가 요청을 보냄
    3. SYN을 보내고 받은 상태에서도 서버는 listening 상태 + SYN_Received 상태
    4. 서버: 서버 측도 SYN을 요청함
    5. 확인 ACK를 보내 최종 연결함, 서버는 listening 상태 + Established 상태


  • img_13.png
    • 점선: 서버
    • 실선: 클라이언트


ch9-1. 실습1

VM 웨어에 설치한 윈도우를 서버로 만들어서 서버-클라이언트 통신을 시도해 보자

apache webserver를 만들 예정이다

설치

  1. 아파치 웹서버를 가상 머신의 C 드라이브 폴더에 넣어 준다
    • img_14.png
  2. 얘를 실행시킨다 (bin 폴더)
    • img_15.png
    • 참고로 이 폴더에 d로 끝나는 프로그램은 서버 프로그램이다 *
  3. 가상 컴퓨터에 다음을 실행하면 80번 포트가 열린 것을 확인할 수 있음
    • img_16
    • apache 서버가 80번 포트를 쓰도록 httpd.conf 파일에 설정했기 때문에 0.0.0.0:80 포트가 바인드 된 것을 확인할 수 있음
    • img_19
    • img_18
    • 이는 Ip를 통해 서버에 접근한 경우, 80번 포트를 쓰는 모든 IP는 Apache weberver로 연결된다.
    • (127.0.0.1:80 이 경우 Local 에서만 접근할 수 있는 80번 포트이며, 다른 IP에서 접근할 없다)
  4. cmd 창에서 PID를 확인하면 netstat에서 80번 포트를 사용하고 있는 프로그램이 Apache웹서버 라는 것을 확인 가능
    • img_21
    • 아무튼 해당 포트가 열려있는지(Listening) 확인할 수 있어야 함
  5. 웹사이트에 자신의 IP+80를 입력한 경우 아파치 웹서버에 연결 됨
    • img_23
    • 웹에서 보통 80은 생략됨
  6. 재빠르게 웹사이트를 새로고침하고 netstat을 입력하면 다음과 같이 Time_wait 임
    • img_24
    • 아직 established 성립되지 않은 상태를 보여줌(핸드셰이크 중?)
    • (검색: 종료 준비가 끝났으나 원격의 수신 보장을 위해 기다리는 상태)


ch09-2. 실습2

Apache를 설치해 옆 학우 서버에 접속해 보자

  1. 일단 아파치를 설치해 보고 실행해 보자
    • img_25
  2. netstat -ano
    • img_26
  3. 옆 학우의 사이트 접속 성공
    • img_27
  4. 옆 학우가 내 사이트 접속 시 다음을 실행하면 누가 내 80번 포트에 접속했는지 알 수 있다
    • img_28

꿀 팁

(패킷까지 봐야 접속자가 뭘 했는지 알 수 있다)

Wireshark - 패킷까지 캡쳐해 볼 수 있는 툴

공용 와이파이에서 이런 것까지 볼 수 있음!!!

비싼 장비가 동원되면 사실 모든 패킷을 잘 볼 수 있음



ch10. 포트포워딩

  • 포트포워딩: 찾아올 수 있게 해 주는 것 (미리 적어 두는 것)
  • 내 라우터한테 트래픽이 오면, 라우터로부터 무조건 지정된 서버(PC)로 연결되도록 함


ch10-1. 실습

  1. VM ware의 virtual network editor 실행
  2. NAT (가상 라우터) setting에 다음과 같이 포트포워딩을 만들어 보자
    • img_29
    • NAT에 65535 포트로 들어오는 IP 주소들을 내아이피(192.168.17.17):80 으로 무조건 연결해줌
  3. 다른 학우가 포트포워딩을 지정한 포트로 접속 시 정상적으로 Apache webServer(80) 포트포워딩 되는 것을 확인
    • img_30
    • img_31
    • 포트포워딩으로 접속이 가능함 (단, 본체 방화벽 해제한 컴퓨터만 그 학우의 가상 머신으로 접근 가능)
  4. 추가꿀팁
    • 방화벽에 :80번포트 인바운드 규칙 추가하기
    1. img_32
    2. img_36
    3. 사용함 클릭 * 다른 사람이 나의 NAS 같은것에 접속시키도록 하기
    4. 라우터의 포트포워딩을 만들어 둔다
    5. 내 컴퓨터 방화벽에 인바운드 규칙을 설정한다



ch11. 7계층 프로토콜 HTTP

img_37

  • Frontend는 내 컴퓨터에서 실행이 됨
  • Backend는 서버 컴퓨터에서 실행이 됨
  • 프론트엔드 데이터는 HTTP 양식에 담겨 전송이 됨

    따라서 중요한 일은 Frontend에서 처리되면 절대 안 됨!!

    (내 컴퓨터의 메모리에서 음식 가격을 마음대로 바꿔서 100원에 주문이 가능하게 되어 버림) - 배달통처럼..

    따라서 중요한 데이터가 프론트엔드에 있을 경우 백엔드에서 검증을 해줘야함


HTTP 프로토콜

클라이언트가 요청할 때, 응답할 때가 다르게 생김


HTTP 프로토콜 - 요청 프로토콜

img_38 » img_39

  • 그 중 Request Line(가장 중요)
    • img_40
      • HTTP 메소드(요청 타입)
      • ![img_41](https://user-img_52


요청 프로토콜에서, 가장 중요한 Get, Post 방식
  1. Get 방식
    • img_42
    • img_43
    • Body가 없음
  2. POST 방식
    • img_44
    • 빨간 네모: 클라이언트가 특정 페이지를 요청하면서 서버로 보내는 데이터
    • 데이터를 전달 할 때, 중요한 정보를 업로드 할 때(로그인 정보 등), URL이 아닌 Body에 담겨서 보내짐


URL
  • img_49
    • 맨 앞: 사용하고 싶은 프로토콜
    • 두번째: IP주소, 포트 (DNS 변환)
      • DNS 변환 과정은 하단 ch.13 참고
      • 네이버의 경우 도메인 주소로 표기되어 있고, 다음이 생략되어 있는 상태.
        • img_48
    • 세 번째: 경로(폴더 및 파일)
    • 네 번째: get 방식에서, 보내지는 데이터
      • (실습)apache 폴더의 htdocs에 디렉토리를 추가할 경우 다음과 같이 접근할 수 있다
        • img_50


HTTP 프로토콜 - 응답 프로토콜

img_51

  • 그 중 Status Line(가장 중요)
    • img_53
    • 그 중, 상태 코드
      • img_54
        • 400번대: 클라이언트가 잘못한 경우 뜸
          • img_55
            • 404번: 없는 경로로 접근 Not Found
            • 403번: 접근 권하이 없는 것에 접근
        • 500번대: 서버가 잘못한 경우 뜸
          • img_56
            • 503: 사용자가 너무 몰린 경우 볼 수 있음
            • 500: 서버에 어떤 오류가 생긴 경우 볼 수 이씀


HTTP 헤더

img_57 -> img_58

  • 일반 헤더
    • 일반적인 정보를 담고 있음
    • img_59
  • 요청 헤더
    • 클라이언트 정보를 담고 있음
    • img_60
      • 쿠키: 서버가 클라이언트 컴푸타에 정보를 저장하는 역할(장바구니 등)
      • 호스틔 img_61
      • 유저 에이전트: 운영체제(안드로이드 등), 브라우저 등 사용자 정보 확인 가능
  • 응답 헤더
    • 서버 정보를 담고 있음
    • 굳이 서버 정보는 안 쓰는 추세(서버가 아파치인지 등의 정보..)



ch13. 도메인 네임 서버

사용자가 인식할 수 있는 주소를 IP주소로 변환해 주는 역할

도메인 주소가 DNS 서버를 통해 IP주소로 바꾼다 정도만 기억하면 됨

  • 대충 이런 과정
    • img_47 img_52



여기까지 HTTP 프로토콜에 대한 핵심 정리

  • 요청 - 요청라인
    1. HTTP메소드
      1. GET
        • 중요하지 않은 데이터를 서버로 보내서 페이지를 요청할 때 사용
        • URL 길이는 제한적이라 적은 데이터를 보낼 수 있음
      2. POST
        • 중요한 데이터를 서버로 보내서 페이지를 요청할 때 사용
        • body에 보낼 수 있어서 많은 데이터를 보낼 수 있음’
    2. URI와 URL
      • ID: ID와 매핑된 자원을 요청, django에서는 urls.py 파일에 매핑
      • Locator: 서버의 특정 위치에 있는 자원을 요청
  • 응답 - 응답라인
    • 상태코드
      • 200: 정상, 웬만하면 볼 일이 없음
      • 403: 서버에서 클라이언트를 거부함(권한 오류 등)
      • 404: 없는 페이지를 요청
      • 500: 개발자가 코드를 잘못 짠 상황 (서버 에러)
      • 503: 세션이 가득 참(사용자가 너무 몰림)