[GO] Server

타키탸키·2022년 11월 3일
0

GO-WEB

목록 보기
2/11

Web Programming Synonymous Terms

  • Mux, ServeMux
    • (Web) Server의 또 다른 표현
    • Multiplexer
      • [전자 공학] 전기의 경로를 결정하는 데 도움을 주는 장치
      • [컴퓨터 공학] 요청에 따라 서버가 해야 하는 작업(코드 실행)을 결정하는 것
    • Server는 mux이자 muliplexer로서 다중 작용
      • 특정 조건에 따라 작업 결정

HTTP(Request & Response)

  • Client-Server Architecture
    • Client가 요청을 보내면 Server가 응답하는 원리
    • ex:) 고객(Client)에게 종업원(Server)이 감자튀김(Web Page)을 가져다주는 것
    • Client가 Server에 특정 URL로 특정 page에 대한 요청을 보냄
    • Server가 해당 URL을 기반으로 특정 코드 실행
      • 라우트와 요청 사항, 메서드를 기반으로 결정
  • http method
    • Get
      • Web Page 가져오기
    • Post
      • Client가 form을 받고 회신하여 Web Server에 data를 게시하는 것
      • Server는 경로와 Post 요청을 파악하고 DB에 해당 data 보관
  • Network, Internet
    • OSI(개방형 시스템 간 상호 접속 모델)에 따라 작동
    • 각 계층에서 발생하는 상황은 서로 다르다
      • 물리 계층: 실제 장치를 연결하는 계층
      • 전송 계층: 전송 제어 프로토콜 TCP(데이터 통신 담당)
      • 응용 계층: HTTP(인터넷 상의 데이터 통신 담당)
  • HTTP
    • TCP 활용
    • IETF(인터넷 국제 표준화 기구)에 의해 작성된 프로토콜
      • 인터넷이 어떻게 구축되어야 하는지에 대한 권고 사항 제작
    • message 구조
      • IETF의 RFC 7230에 제시
      • Client가 Server로 보내는 요청
      • Server가 Client로 보내는 응답
      • 두 메세지는 시작 라인(상태 혹은 요청)과 길이를 결정하는 알고리즘이 다르다
  • 요청 message
    • request line(시작 라인)
      • Method Request-URI HTTP-Version CRLF
      • ex:) GET /path/to/file/index.html HTTP/1.0
    • headers
    • optional message body
  • 응답 message
    • status line(시작 라인)
      • HTTP-Version Status-Code Reason-Phrase
      • ex:) HTTP/1.0 200 OK, HTTP/1.0 404 not found, ...
    • headers
    • optional message body
  • curl
    • command line용 data transfer tool
    • 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 이한 라이브러리와 명령 줄 도구를 제공하는 컴퓨터 소프트웨어 프로젝트
    • ex:) curl -v www.google.com

TCP Server

  • TCP 프로토콜
    • 패킷(packet, payload)
      • 네트워크가 전달하는 데이터의 형식화된 블록
    • TCP 서버에서 클라이언트와 패킷(data)을 주고 받을 때 정의하는 것
      • 패킷의 최대 크기(길이)
      • 각 패킷의 크기와 구조
    • 실시간 처리가 중요한 서버(ex:) 게임)에서 많이 사용
  • HTTP와 TCP
    • TCP 상에서 실행되는 HTTP
    • HTTP 요청에 응답하는 HTTP 서버를 구축하려면 특정 방식으로 서식화된 요청을 처리하는 TCP 서버 구축 필요
      • 단순한 텍스트로 들어오는 요청을 HTTP 프로토콜에 따르도록 서식화해야 서버가 그 요청을 처리할 수 있다
    • 표준 규약은 RFC 7230
  • .Listen
    • net 패키지 함수
    • 수신할 네트워크(ex:) TCP)와 포트 번호를 인자로 받음
    • Listener와 error 반환
    • 네트워크 연결 대기
  • Listener
    • Accept, Close, Addr 메서드를 지니는 인터페이스
    • Close
      • 프로그램이 종료될 때, Listener 닫기
    • Accept
      • 요청 수락
      • 연결 혹은 오류로 응답
      • 루프를 돌며 요청 대기
      • 요청을 받으면 Connect 생성
  • Conn
    • Accept의 반환 값
    • 프로토콜 연결 객체
    • 요청을 성공적으로 받으면(클라이언트와 연결을 성공하면) 생성
    • Read와 Write 타입 보유
      • Reader 인터페이스와 Writer 인터페이스의 구현
    • Conn이 있으면 data를 읽고 쓸 수 있다
  • Telnet
    • 원격지의 호스트 컴퓨터에 접속하기 위해 사용되는 인터넷 프로토콜
    • 인터넷이나 로컬 영역 네트워크 연결에 쓰이는 네트워크 프로토콜
    • 네트워크 관리를 할 수 있는 프로토콜
    • TCP 계층과 포트에서 작동하는 프로그램
  • Windows에서 Telnet 사용하기
    • 프로그램 및 기능 - Windows 기능 켜기/끄기 - Telnet 체크
    • cmd 창에서 telent 명령어 입력
  • 클라이언트에 데이터 보내기
    • io.WriteString
      • byte의 slice를 수용하는 Writer 객체에 string을 쓰는 함수
      • 파일에 data를 쓰는 데 사용 가능
    • fmt.Fprint
      • 파일에 표준 출력하는 함수
      • 지정한 출력 stream(conn)에 출력
    • 서버 프로그램 시작 후, 다른 콘솔 창(클라이언트)에서 telnet localhost 포트번호 입력
  • bufio.NewScanner
    • os.Stdin으로부터 문자를 읽어오는 Scanner를 생성 및 반환
    • 관련 메소드 사용 가능
      • Scan, Text
    • ScanRunes
      • split 함수
      • UTF-8로 인코딩된 rune을 토큰으로 반환하는 Scanner
  • .Scan
    • os.Stdin으로부터 한 줄을 읽어온다
    • 입력의 끝에 도달하면 false 반환
    • 여러 줄을 받아오려면 for 루프 필요
      • 종료 시점을 알 수 없음
  • .Text
    • 한 줄씩 data 가져오기
  • 요청(request) 메세지 읽어오기
    • HTTP는 TCP 상에서 실행되고 TCP를 사용한다
    • 브라우저를 통해 요청을 전송
    • ex:) 브라우저에 localhost:8080/feel/so/good 입력
      • request line이 요청에 따라 바뀌는 것을 볼 수 있다
  • Conn에 Read와 Write 같이 하기
    • .Scan 루프에 .Text 코드와 .Fprintf 코드 함께 추가
    • .Fprintf를 통해 .Text로 읽은 메세지를 클라이언트에 전송
  • .SetDeadline
    • connection과 관련된 read와 write에 deadline을 설정한다
    • 루프를 돌고 있는 reader는 언제 reading을 멈춰야 할 지 알 수 없다
    • deadline을 정해놓고 그 시간만큼만 동작하도록 한다
  • rot13
    • 암호화 유형 중 하나
    • 특정 문자의 아스키코드 수를 특정 수만큼 앞뒤로 밀었을 때의 문자로 대체하는 기술
  • TCP 통신으로 In-Memory Database 만들기
    • In-Memory Database
      • data storage의 main memory에 설치되어 운영되는 방식의 database 관리 시스템
      • 디스크에 최적화된 database보다 훨신 빠른 성능
      • 내부 최적화 알고리즘이 더 단순하며 더 적은 CPU 명령 실행
      • 데이터 조회 시, 검색 시간이 줄어들며 디스크보다 더 빠르고 더 예측 가능한 성능 제공
      • 휘발성 RAM의 경우, 전원 소실 혹은 고의적인 상황으로 인해 데이터 손실 가능성이 있다
      • 비휘발성 RAM의 도입으로 전력 손실에도 완전한 속도로 데이터 유지 가능
    • Server 프로그램에 data를 저장할 structure 선언하기
      • 메모리 데이터
    • client로부터 입력되는 명령은 단어의 단위로 명령-key-value로 구분하여 저장
    • switch문을 통해 입력되는 명령에 따라 다른 코드를 진행하도록 설계
      • GET, SET, DELETE
      • 하나의 key에는 하나의 value만 할당 가능
      • 특정 key에 value를 반복해서 넣으면 마지막 value가 key에 배정

TCP Client

  • server가 전송한 data 읽기
    • .Dial
      • 네트워크 방식(프로토콜)과 주소를 인자로 넘김
      • client 프로그램으로 server에 연결하기
    • io.ReadAll
      • server로부터 데이터 읽어오기
  • server에 data 보내기
    • .Dial로 server와 연결
    • .Fprint로 conn stream를 통해 server에 data 전송하기
    • client 프로그램을 실행할 때마다 새로운 연결이 유입되고 server의 패킷 처리 함수에 전달됨
    • data가 server에 전송되면 연결(stream) 종료
      • stream이 종료되었으므로 server의 scanner도 종료
      • server 프로그램은 여전히 연결을 기다리며 계속 실행됨

TCP Server with HTTP

  • 자체 TCP server 생성하기
    • 웹에서는 80번 포트, 로컬 호스트에서는 8080번 포트
    • 클라이언트의 요청을 받은 후 handler 실행
      • HTTP message 송수신 및 출력
      • read request: 카운터(프로그램에서 신호를 보내기 위해 사용) 설정
      • write response
      • TCP 서버에 텍스트 덩어리를 보내 HTTP로 처리할 때 필요한 규약
    • request line의 첫번째 부분은 요청 line
      • http-mehod path http-version
    • 공백 전까지가 header, 공백 이후가 body
      • body는 요청의 payload
      • request는 공백 전까지만 해당
    • 클라이언트가 localhost:8080으로 가서 / 라우트 요청
    • favicon
      • 브라우저 탭의 작은 아이콘
      • 서버가 이에 응답하여 favicon을 브라우저에 전송
    • 클라이언트가 변경된 라우트(/something/else) 요청
      • 서버는 메서드와 라우트를 모두 사용해서 실행할 코드 결정
    • respond 함수는 클라이언트(브라우저)에 보낼 HTTP 메세지 생성
      • 서버 프로그램에서 작성한 Content-Length와 Content-Type이 header에 담긴다
      • 브라우저의 관리자 도구 network tab에서 확인 가능
  • Multiplexer 구현하기
    • request의 start line은 request line
      • request line의 첫번째 단어는 http method
      • request line의 두번째 단어는 url
    • 두 인자를 활용하여 분기 나누기 -> Multiplexer
    • URL에 따라 다른 respond 함수 실행
      • /about -> about page
      • /index -> index page
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글