네트워크 빠르게 훑어 보기(2)
카카오 클라우드 스쿨 - 네트워크 빠르게 훑어 보기(2)
네트워크 빠르게 훑어 보기
Django에 들어가기 앞서 필요한 네트워크 지식을 빠르게 훑어 보았습니다 (계속)
자료 출처: www.ddarahakit.kro.kr 님(ddarahakit.tistory.com)
ch8. UDP
- 우리는 TCP만 볼 예정, 생략
ch9. TCP
- (복습)포트: 클라이언트 프로그램이 서버 프로그램을 알아 볼 수 있도록 하는 것이 포트번호
3 way handshake
- 요청은 항상 클라이언트가 먼저 보냄(SYN)
- 서버는 응답을 해 줌(SYN) + 반대로 서버도 요청을 보냄 (ACK)
- 클라이언트까지 최종 확인(ACK)
- 위와 같이 연결 수립을 한 다음 다음 통신함
상태전이도
- 서버 측은 Always listening 상태
- 그 상태에서 클라이언트가 요청을 보냄
- SYN을 보내고 받은 상태에서도 서버는 listening 상태 + SYN_Received 상태
- 서버: 서버 측도 SYN을 요청함
- 확인 ACK를 보내 최종 연결함, 서버는 listening 상태 + Established 상태
- 점선: 서버
- 실선: 클라이언트
ch9-1. 실습1
VM 웨어에 설치한 윈도우를 서버로 만들어서 서버-클라이언트 통신을 시도해 보자
apache webserver를 만들 예정이다
설치
- 아파치 웹서버를 가상 머신의 C 드라이브 폴더에 넣어 준다
- 얘를 실행시킨다 (bin 폴더)
- 참고로 이 폴더에 d로 끝나는 프로그램은 서버 프로그램이다 *
- 가상 컴퓨터에 다음을 실행하면 80번 포트가 열린 것을 확인할 수 있음
- apache 서버가 80번 포트를 쓰도록 httpd.conf 파일에 설정했기 때문에 0.0.0.0:80 포트가 바인드 된 것을 확인할 수 있음
- 이는 Ip를 통해 서버에 접근한 경우, 80번 포트를 쓰는 모든 IP는 Apache weberver로 연결된다.
- (127.0.0.1:80 이 경우 Local 에서만 접근할 수 있는 80번 포트이며, 다른 IP에서 접근할 없다)
- cmd 창에서 PID를 확인하면 netstat에서 80번 포트를 사용하고 있는 프로그램이 Apache웹서버 라는 것을 확인 가능
- 아무튼 해당 포트가 열려있는지(Listening) 확인할 수 있어야 함
- 웹사이트에 자신의 IP+80를 입력한 경우 아파치 웹서버에 연결 됨
- 웹에서 보통 80은 생략됨
- 재빠르게 웹사이트를 새로고침하고 netstat을 입력하면 다음과 같이 Time_wait 임
- 아직 established 성립되지 않은 상태를 보여줌(핸드셰이크 중?)
- (검색: 종료 준비가 끝났으나 원격의 수신 보장을 위해 기다리는 상태)
ch09-2. 실습2
Apache를 설치해 옆 학우 서버에 접속해 보자
- 일단 아파치를 설치해 보고 실행해 보자
- netstat -ano
- 옆 학우의 사이트 접속 성공
- 옆 학우가 내 사이트 접속 시 다음을 실행하면 누가 내 80번 포트에 접속했는지 알 수 있다
꿀 팁
(패킷까지 봐야 접속자가 뭘 했는지 알 수 있다)
Wireshark - 패킷까지 캡쳐해 볼 수 있는 툴
공용 와이파이에서 이런 것까지 볼 수 있음!!!
비싼 장비가 동원되면 사실 모든 패킷을 잘 볼 수 있음
ch10. 포트포워딩
- 포트포워딩: 찾아올 수 있게 해 주는 것 (미리 적어 두는 것)
- 내 라우터한테 트래픽이 오면, 라우터로부터 무조건 지정된 서버(PC)로 연결되도록 함
ch10-1. 실습
- VM ware의 virtual network editor 실행
- NAT (가상 라우터) setting에 다음과 같이 포트포워딩을 만들어 보자
- NAT에 65535 포트로 들어오는 IP 주소들을 내아이피(192.168.17.17):80 으로 무조건 연결해줌
- 다른 학우가 포트포워딩을 지정한 포트로 접속 시 정상적으로 Apache webServer(80) 포트포워딩 되는 것을 확인
- 포트포워딩으로 접속이 가능함 (단, 본체 방화벽 해제한 컴퓨터만 그 학우의 가상 머신으로 접근 가능)
- 추가꿀팁
- 방화벽에 :80번포트 인바운드 규칙 추가하기
- 사용함 클릭 * 다른 사람이 나의 NAS 같은것에 접속시키도록 하기
- 라우터의 포트포워딩을 만들어 둔다
- 내 컴퓨터 방화벽에 인바운드 규칙을 설정한다
ch11. 7계층 프로토콜 HTTP
- Frontend는 내 컴퓨터에서 실행이 됨
- Backend는 서버 컴퓨터에서 실행이 됨
- 프론트엔드 데이터는 HTTP 양식에 담겨 전송이 됨
따라서 중요한 일은 Frontend에서 처리되면 절대 안 됨!!
(내 컴퓨터의 메모리에서 음식 가격을 마음대로 바꿔서 100원에 주문이 가능하게 되어 버림) - 배달통처럼..
따라서 중요한 데이터가 프론트엔드에 있을 경우 백엔드에서 검증을 해줘야함
HTTP 프로토콜
클라이언트가 요청할 때, 응답할 때가 다르게 생김
HTTP 프로토콜 - 요청 프로토콜
»
- 그 중 Request Line(가장 중요)
- HTTP 메소드(요청 타입)
- ![img_41](https://user-
요청 프로토콜에서, 가장 중요한 Get, Post 방식
- Get 방식
- Body가 없음
- POST 방식
- 빨간 네모: 클라이언트가 특정 페이지를 요청하면서 서버로 보내는 데이터
- 데이터를 전달 할 때, 중요한 정보를 업로드 할 때(로그인 정보 등), URL이 아닌 Body에 담겨서 보내짐
URL
- 맨 앞: 사용하고 싶은 프로토콜
- 두번째: IP주소, 포트 (DNS 변환)
- DNS 변환 과정은 하단 ch.13 참고
- 네이버의 경우 도메인 주소로 표기되어 있고, 다음이 생략되어 있는 상태.
- 세 번째: 경로(폴더 및 파일)
- 네 번째: get 방식에서, 보내지는 데이터
- (실습)apache 폴더의 htdocs에 디렉토리를 추가할 경우 다음과 같이 접근할 수 있다
- (실습)apache 폴더의 htdocs에 디렉토리를 추가할 경우 다음과 같이 접근할 수 있다
HTTP 프로토콜 - 응답 프로토콜
- 그 중 Status Line(가장 중요)
- 그 중, 상태 코드
- 400번대: 클라이언트가 잘못한 경우 뜸
- 404번: 없는 경로로 접근 Not Found
- 403번: 접근 권하이 없는 것에 접근
- 500번대: 서버가 잘못한 경우 뜸
- 503: 사용자가 너무 몰린 경우 볼 수 있음
- 500: 서버에 어떤 오류가 생긴 경우 볼 수 이씀
- 400번대: 클라이언트가 잘못한 경우 뜸
- 그 중, 상태 코드
HTTP 헤더
->
- 일반 헤더
- 일반적인 정보를 담고 있음
- 요청 헤더
- 클라이언트 정보를 담고 있음
- 쿠키: 서버가 클라이언트 컴푸타에 정보를 저장하는 역할(장바구니 등)
- 호스틔
- 유저 에이전트: 운영체제(안드로이드 등), 브라우저 등 사용자 정보 확인 가능
- 응답 헤더
- 서버 정보를 담고 있음
- 굳이 서버 정보는 안 쓰는 추세(서버가 아파치인지 등의 정보..)
ch13. 도메인 네임 서버
사용자가 인식할 수 있는 주소를 IP주소로 변환해 주는 역할
도메인 주소가 DNS 서버를 통해 IP주소로 바꾼다 정도만 기억하면 됨
- 대충 이런 과정
여기까지 HTTP 프로토콜에 대한 핵심 정리
- 요청 - 요청라인
- HTTP메소드
- GET
- 중요하지 않은 데이터를 서버로 보내서 페이지를 요청할 때 사용
- URL 길이는 제한적이라 적은 데이터를 보낼 수 있음
- POST
- 중요한 데이터를 서버로 보내서 페이지를 요청할 때 사용
- body에 보낼 수 있어서 많은 데이터를 보낼 수 있음’
- URI와 URL
- ID: ID와 매핑된 자원을 요청, django에서는 urls.py 파일에 매핑
- Locator: 서버의 특정 위치에 있는 자원을 요청
- 응답 - 응답라인
- 상태코드
- 200: 정상, 웬만하면 볼 일이 없음
- 403: 서버에서 클라이언트를 거부함(권한 오류 등)
- 404: 없는 페이지를 요청
- 500: 개발자가 코드를 잘못 짠 상황 (서버 에러)
- 503: 세션이 가득 참(사용자가 너무 몰림)