본문 바로가기

블록체인_9기/💚 Node.js

25강(과제X)_230428_Node.js(OSI 전송계층, TCP, UDP, TCP Server, client, Mysql)

728x90

 

 

 

 

 


TCP 및 UDP 프로토콜의 이해

 

프로토콜?

  • 통신 프로토콜이란, 컴퓨터 통신을 위해 통신을 하는 노드간의 합의된 통신 약속을 의미한다.
  • 네트워크에서 데이터를 전송하고 요청, 응답하기 위한 규칙을 말한다.
  • 컴퓨터 통신을 위해 통신 프로토콜은 명확하게 규정되어 있어야 한다.
  • 통신하는 양쪽 노드가 메세지를 보낼 때, 통신 데이터의 구조나 문법, 메시지를 주고받는 순서 등을 명확하게 명시해야 한다.
  • 대표적인 예로, 
    • 네트워크 인터페이스 수준의 이더넷 프로토콜
    • 인터넷 통신을 위한 TCP/IP
    • 웹 서비스의 기반이 되는 HTTP(Hyper Text Transfer protocol)

 

OSI 전송계층

  • 인터넷과 같은 복잡한 기능을 지원하여면, 전기 신호 수준을 넘어서 추상적인 수준에서 네트워크 시스템의 기능과 통신 규칙 등에 대한 명확한 정의가 필요하여 표준을 정한 것.
    • 프로토콜에 의해서 각 단계마다 해야할 일을 정해놓은 것.
    • 초기 여러 정보 통신 업체 장비들은 자신의 업체 장비들끼리만 연결되어 호환성이 없었기 때문에 모든 시스템들의 상호 연결에 있어 문제가 없도록 표준을 정함
  • OSI 참조 모델은 가장 초기의 네트워크 표준이라는데 의의가 있다.
    • 현재는 TCP/IP가 실제 인터넷 표준으로 사용되고 있으며, OSI 참조 모델의 일부분을 차용하여 사용하고 있다.

 

  • 응용계층 -> 물리계층: 1010 같은 비트패턴으로 바뀌게 된다.
  • 물리계층 -> 응용계층:  데이터의 범위가 커지고 여러가지 기능이 붙는다.

 

물리 계층 (physical layer)

  • 7계층 중 최하위 계층이다.
  • 물리적인 연결을 토애 비트단위로 데이터가 전송되는 계층이다.
    • 주로 전기적, 기계적, 기능적인 특성을 이용해 데이터를 전달한다.
    • 데이터 전달을 할 뿐이라 알고리즘이나 오류제어 기능이 없다.
  • 장비로 케이블, 리피터, 이더넷의 연결잭 등이 사용되며 물리계층 수준에서 정의된다.

 

데이터링크 계층 (datalink layer)

  • 직접 연결된 두 컴퓨터나 장비간에 프레임 단위로 데이터를 전송하는 계층
    • 프레임(frame): 블록 단위의 정보. 비트 몇개로 프레임을 생성한다.
    • 8비트였던 물리계층의 값이 데이터링크 계층에서 시작, 끝, 수신자 기호 등이 추가되며 조금 더 큰 값을 가지게 되는 것을 프레임이라 한다.

  • 전송을 위해 프레임의 시작과 끝, 수신자의 주소 등이 추가되고, 오류의 발견/수정하는 기능, 흐름제어의 기능도 담당
  • 장비로는 브릿지, 스위치, 이더넷, 와이파이 등이 있다.

 

네트워크 계층 (network layer)

  • 패킷 단위의 전송이 이루어지며, 계층적인 주소 지정 방식을 사용한다.
  • 패킷을 어떤 경로를 통해 송신 컴퓨터에서 수신 컴퓨터까지 전달할지 결정하는 라우팅이 일어난다.
    • 목적지까지 가장 안전하고 빠르게 데이터를 보내는 기능을 가지고 있다. (최적의 경로를 설정할 수 있다)
  • 패킷들이 몰릴 경우 혼잡 제어를 수행한다.
    • 라우터가 수행한다.
  • 네트워크 계층에서 인터넷의 IP(internet protocol)가 정의된다.
    • 컴퓨터에게 데이터를 전송할지 주소를 가지고 있기 때문에 통신이 가능하다.
  • 장비로는 라우터, L3 스위치가 있다.

 

전송 계층 (transport layer)

  • 세그먼트 또는 데이터그램 단위의 메시지가 송신 컴퓨터에서 수신 컴퓨터까지 신뢰성을 보장하며 전달하는 계층
    • 신뢰성을 보장한다는 것은, 수신 받은 데이터에서 패킷이 부족하면 네트워크 계층에 요청하여 완성된 자료를 만들어 준다는 것이다.
  • 메시지를 패킷 단위로 잘라서 네트워크 계층에게 전송한다.
    • 네트워크 계층 - 프레임 단위로 잘라서 전송 => 데이터링크 계층에서 비트패턴으로 변경하여 물리계층에 전송
  • 중간에 사라지거나 순서가 바뀐 패킷을 오류없이 다시 구성해서 전송해주는 역할을 한다.
  • 인터넷의 TCP(transport control protocol)가 이 수준에서 정의된다.
    • 데이터 전송을 위해서 Port 번호를 사용한다.
    • TCP뿐만 아니라, UDP, HTTP 등이 정의된다.
    • 전송계층에서 TCP와 네트워크 계층에서의 IP가 합쳐져서 'TCP/IP'라고 하며, 현재 인터넷 통신에서 가장 중요한 통신 약속이다.

 

세션 계층 (session layer)

  • 통신 컴퓨터간 연결의 접속/차단과 데이터 통신 방식을 결정한다.
  • 연결 세션에서 데이터 교환과 에러 발생 시의 복구를 관리한다.

 

표현 계층 (presentation layer)

  • 데이터를 어떨게 표현할지 정하는 역할을 하는 계층이다.
  • 표현계층은 3가지의 기능을 가지고 있다.
    • 송신자에서 온 데이터를 해석하기 위한 응용계층 데이터 부호화, 변화
    • 수신자에서 데이터의 압축을 풀수 있는 방식으로 된 데이터 압축
    • 데이터의 암호화와 복호화
      (MIME 인코딩이나 암호화 등의 동작이 표현계층에서 이루어짐. EBCDIC로 인코딩된 파일을 ASCII 로 인코딩된 파일로 바꿔주는 것이 한가지 예임)
  • 인터넷에서는 표현 계층이 따로 없이 개별 응용 프로그램 수준에서 바이트 순서 문제를 처리해야한다.

 

응용 계층 (application layer)

  • 응용 프로토콜의 기능을 지원하는 것이 응용계층이다.
    • 웹에서 사용하는 HTTP
    • 파일 전송을 위한 FTP
    • 이메일 전송을 위한 SMTP 등
  • 사용자와 가장 밀접한 계층으로 인터페이스의 역할을 한다.

 

 

 


TCP와 UDP

  • 우리가 네트워크 통신을 하면서 많이 사용되는 프로토콜에는 TCP와 UDP가 있다.
  • 두 프로토콜은 OSI 모델의 전송 계층에 해당한다.
  • UDP와 TCP는 각각 별도의 포트 주소 공간을 관리하므로 같은 포트 번호를 사용해도 무방하다. 즉, 두 프로토콜에서 동일한 포트 번호를 할당해도 서로 다른 포트로 간주한다.

TCP

  • 데이터 전송 이전 두 장치 간의 신뢰적이고 안정적인 연결을 지향하는 프로토콜이다.
  • 인터넷 상에서 데이터를 메시지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜이다.
    • IP는 배달, TCP는 패킷의 추적 및 관리를 한다.
  • 연결형 서비스로, 신뢰적인 전송을 보장하기에 handshaking하고 데이터의 흐름제어와 혼잡제어를 수행한다.
    • 다만, 이러한 기능으로 인해 UDP보다 속도가 느리다.
  • 특징
    • TCP 3-way handshaking 과정을 통해 연결을 설정하고, TCP 4-way handshaking을 통해 해제한다.
    • 흐름제어와 혼잡제어를 수행한다.
    • 높은 신뢰성을 보장한다.
    • UDP보다 속도가 느리다.

 

✏️TCP/IP

 

UDP

  • 데이터 전송 전에 가상 회선을 설정하지 않는 프로토콜이다.
    • 예를 들어, 영상 스트리밍이나 게임 같은 짧은 대기시간과 빠른 속도가 필요한 곳에 사용한다.
  • 데이터를 데이터그램 단위로 처리하는 프로토콜이다.
    • 데이터그램이란, 독립적인 관계를 지니는 패킷이라는 뜻이다.
  • 비연결형 프로토콜이다.
    • 할당되는 논리적인 경로가 없고, 각각의 패킷이 다른 경로로 전송된다. 이 각 패킷은 독립적인 관계를 가진다.
    • 연결을 설정하고 해제하는 과정이 존재하지 않는다.
    • 서로 다른 경로로 처리됨에도 패킷에 순서를 부여하거나, 재조립, 흐름제어, 혼잡제어를 수행하지 않아 속도가 빠르며 네트워크 부하가 적다는 장점이 있지만, 신뢰성이 낮다.
  • 특징
    • 비연결형 서비스로 데이터그램 방식을 제공한다
    • 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다.
    • UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
    • 신뢰성이 낮다
    • TCP보다 속도가 빠르다
프로토콜 종류 TCP UDP
연결 방식 연결형 서비스 비연결형 서비스
패킷 교환 방식 가상 회선 방식 데이터그램 방식
전송 순서 전송 순서 보장 전송 순서가 바뀔 수 있음
수신 여부 확인 수신 여부를 확인함 수신 여부를 확인하지 않음
통신 방식 1 : 1 통식 1 : 1 또는 1 : N 또는 N : N 통신
신뢰성 높다 낮다
속도 느리다 빠르다

 

여기서부터는 내 이해와는 무관하게 수업시간에 작성한 내용을 토대로 정리! 이해하고 다시보자~!


TCP Server 생성

1.  내장모듈 'net' 사용

  • net 이라는 모듈을 사용하면 TCP 소켓을 만들어서 사용할 수 있다.
  • net은 TCP 연결을 맺어주는 프로토콜이다.
  • TCP 소켓을 생성하고 서버와 클라이언트간의 응답 요청을 맺을 수 있다.
// 내장모듈 net을 가져온다.
const net = require("net");

 

2. PORT 선언

const PORT = 8080;

 

3. createServer 메소드로 서버객체 생성

  • 서버객체를 생성한다.
  • createServer 메소드로 콜백함수를 전달한다. 클라이언트가 접속 시 콜백함수를 실행한다.
  • 클라이언트가 데이터를 보내면 해당 데이터를 확인할 수 있다.
    • 해당 내용은 잘 이해가 가지 않으므로, 다시 알아볼 것!
    • 클라이언트가 보낸 데이터는 네트워크를 통해 전송되는 데이터이다.
    • 바이너리 형식으로 전송되므로, buffer 형태로 보여지게 된다.
    • 서버는 해석해서 문자열로 변환해주면 된다.
const server = net.createServer((client)=>{
    //클라이언트가 접속 시 실행

    client.on('data',(data)=>{
        //클라이언트가 보낸 데이터

        //네트워크를 통해 전송되는 데이터
        //바이너리 형식으로 전송된다.. 즉
        //클라이언트가 보낸 데이터는 Buffer 형태로 전송이 되며
        //서버는 해석해서 문자열로 변환 해주면 된다.
        //출력된 데이터는 buffer형식으로 인코딩해서 우리가 보낸 데이터처럼 보이는 것이다.
        //예를들어, <Buffer 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 6c 6f 63 61 6c 68 6f 73 74 3a 34 30 30 30 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 ... 625 more bytes>
      
        console.log(data);
        // <Buffer 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 6c 6f 63 61 6c 68 6f 73 74 3a 38 30 38 30 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 ... 651 more bytes>
      
        // console.log(data.toString());
        // GET / HTTP/1.1
        // Host: localhost:8080
        // Connection: keep-alive
        // Cache-Control: max-age=0
        // sec-ch-ua: "Chromium";v="112", "Microsoft Edge";v="112", "Not:A-Brand";v="99"
        // sec-ch-ua-mobile: ?0
        // sec-ch-ua-platform: "Windows"
        // Upgrade-Insecure-Requests: 1
        // User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58
        // Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
        // Sec-Fetch-Site: none
        // Sec-Fetch-Mode: navigate
        // Sec-Fetch-User: ?1
        // Sec-Fetch-Dest: document
        // Accept-Encoding: gzip, deflate, br
        // Accept-Language: ko,en;q=0.9,en-US;q=0.8


        // console.log(JSON.stringify(data));
        // {"type":"Buffer","data":[71,69,84,32,47,32,72,84,84,80,47,49,46,49,13,10,72,111,115,116,58,32,108,111,99,97,108,104,111,115,116,58,56,48,56,48,13 ... }
    })
})      //TCP의 내용을 만들어 준 것이다.

4. 서버를 대기 상태로 만들어준다.

//서버를 대기 상태로 만들어준다.
server.listen(PORT, ()=>{
    console.log("서버 잘 열렸음");
})

 

 

 


TCP Server / Client 생성

  • 클라이언트와 서버가 요청, 응답으로 주고받는 메시지는 헤더랑 바디로 나눠진다.
    • 헤더: 전달한 데이터의 정보
      • 형식 예
      • GET /URL HTTP 1.1
        host : 127.0.0.1:8080
        ....
        Content-type : text/html
      • 요청 메소드
        • 자주 사용하는 것은 GET, POST이다.
        • GET: 데이터의 요청을 의미 (필요한 데이터를 응답 받는 것), 데이터를 가져오는 것
        • POST: 데이터의 입력을 의미(데이터를 추가 해주기 위해서 사용), 데이터를 보내기 위해서 사용
        • PUT: 데이터의 수정을 의미
        • DELETE: 데이터를 삭제하기 위해서 사용
        • OPTIONS: 웹 서버가 지원하는 메소드의 종류를 요청할 때
      • HTTP 프로토콜 버전
        • HTTP 버전은 1.0, 1.1, 2.0이 있다.
        • 1.1은 www(world wide web)에서 사용되는 기본 프로토콜이다.
          • 1997년도에 도입되었고, 지금까지도 많이 사용중이다.
    • 바디: 전달 할 데이터의 실질적인 내용
      • buffer.from 메소드를 사용해서 문자열을 바이트 데이터로 변환해준다.
        • HTTP 응답은 바이트 데이터로 전송되기 때문이다.
        • body 문자열을 그대로 작성해버리면 인코딩에 문제가 생길 수 있디 때문이다.
    • 상태코드: 요청애 대한 응답의 결과를 나타내는 숫자코드이다.
      • 가장 많이 사용하면 상태코드는 200번대와 400번대이다. (성공과 실패)
      • 1xx(1백번대): 거의 없다...
      • 2xx(2백번대): 성공에 대한 내용 
      • 3xx(3백번대): 리다이렉트
      • 4xx(4백번대): 페이지가 없을 때 (404 - 요청한 페이지가 없을 경우)
      • 5xx(5백번대): 서버가 터진 것
const net = require("net");
const PORT = 8080;

// 바디 코드
const body = Buffer.from("<div><p>hello nodejs</p></div>")


// 헤더 코드
//response header + body = request

// '200'은 상태코드이며, 성공을 의미한다.
const response = `HTTP/1.1 200 OK
Connection : Keep-alive
Keep-Alive : timeout=4
Content-type : text/html
Content-length : ${body.length}

${body.toString()}`

/* Connection: 클라이언트와 서버의 연결상태. Keep-Alive 속성은 클라이언트가 
	다음 요청을 보낼 때까지 연결을 유지한다.*/
// Keep-Alive: 연결을 유지하는 시간을 지정. timeout=4 == 연결을 4초동안 유지하고 연결을 종료
// Content-type: 전송되는 데이터의 타입. text/html == HTML 타입의 데이터 전송
// Content-length: 전송되는 데이터의 길이. 데이터의 끝을 알려주는 역할을 한다.
  • 서버 객체 생성
    • setEncoding 메소드: 인코딩 방식을 설정할 수 있다.
    • write 메소드: 클라이언트에 응답을 보낸다.
const server = net.createServer((client)=>{
    // 클라이언트가 접속 시 실행
    // 인코딩 설정
    client.setEncoding('utf8');

    //클라이언트가 데이터를 보내서 데이터를 받으면 실행되는 콜백 함수
    client.on("data",(data)=>{
        console.log(data)   //데이터의 타입 buffer
        client.write(response);
    })

    // close: 클라이언트와 연결이 종료되면 실행되는 이벤트
    client.on('close',()=>{
        console.log('접속이 종료됨')
    })
})

server.on("connection",()=>{
    console.log("client가 접속했어")
})

server.listen(PORT,()=>{
    console.log("server 잘 열림 포트는 : " + PORT);
})
PS D:\test> node server.js
server 잘 열림 포트는 : 8080
  • client 생성
    • net.connect(): 소켓 클라이언트를 생성.
    • TCP 통신은 쌍방향 통신이 가능하다.
const net = require("net");

const config = { port : 8080 }
// 포트의 내용을 설정해 둘 객체를 담아놓고

const socket = net.connect(config)
// connect 메서드를 사용해서
// TCP 소켓을 만들고 지정할 포트로 연결을 시도한다.

socket.on('connect', ()=>{
    //연결되면 connect 이벤트를 실행
    console.log('연결이 잘 되었어요')

    socket.write("데이터 전송");
})

socket.on("data",(data)=>{
    //TCP 소켓에서 데이터를 받으면 콜백 함수 실행
    console.log("받은 데이터 : ",data)
    socket.end();
    //end 메서드
    //TCP 연결을 종료
})

 

 

 


Mysql 설치

  • workbanch에서 편하게 gui로 조작해서 추가가 가능하므로, 해당 프로그램 설치 진행.
  • mysql 설치 사이트

 

 

 


Mysql 환경변수 설정

  •  비쥬얼 스튜디오 코드 터미널에서 ' mysql -u root -p ' 을 작성한 후 mysql을 다운받을 때 설정했던 루트 비밀번호를 입력하면 mysql을 접속할 수 있다.
  • 환경변수가 등록되어 있지 않으면 사용하지 못한다.
  • 환경변수를 설정해놓으면 어디서든 mysql을 접속할 수 있다.

 

  • 환경변수 설정
  1. 작업표시줄에서 '돋보기'를 누르고 'sysdm.cpl'을 검색한다.
  2. 시스템 속성에서 '고급'탭을 누른다.
  3. '환경 변수' 버튼을 누른다.
  4. 시스템 변수 목록에서 'Path'를 찾아서 누르고 '편집'버튼을 누른다.
  5. '새로 만들기'버튼을 클릭해서 'C:\Program Files\MySQL\MySQL Server 8.0\bin'내용을 넣어 추가한다.

 

 

 


쿼리문_데이터베이스(확인, 추가, 선택) / 테이블(추가, 확인)

데이터베이스

  • show databases; : 현재 있는 데이터베이스들을 확인하는 쿼리문
mysql> show databases;
+--------------------------------+
|   Database                      |
+--------------------------------+
|   information_schema     |
|   mysql                            |
|   performance_schema   |
|   sakila                            |
|   sys                                |
|   world                             |
+--------------------------------+
6 rows in set (0.02 sec)
  • CREATE DATABASE (데이터베이스 이름) CHARACTER SET utf8; : 데이터베이스를 추가해주는 쿼리문
mysql> CREATE DATABASE test CHARACTER SET utf8;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show databases;
+--------------------------------+
|   Database                      |
+--------------------------------+
|   information_schema     |
|   mysql                            |
|   performance_schema   |
|   sakila                            |
|   sys                                |
|   test                                |
|   world                             |
+--------------------------------+
 7 rows in set (0.00 sec)
  • use (데이터 베이스의 이름); : 사용할 데이터베이스를 선택하는 쿼리문
mysql> use test;
Database changed

 

테이블

  • 테이블이란, 데이터베이스에서 행과 열로 짜여진 표에 기록된 데이터의 집합이다. 디비 테이블이라고도 한다.
  • 테이블 추가
    • CREATE TABLE (데이터베이스 이름).(테이블 이름)(
          id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
          content VARCHAR(255) NOT NULL 
      );
    • 세 번째 괄호의 쿼리문은 추후 학습예정
mysql> CREATE TABLE test.aaa(
     -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     -> content VARCHAR(255) NOT NULL
     -> );
Query OK, 0 rows affected (0.03 sec)
  • show tables; : 테이블 리스트 확인
mysql> show tables;
+-------------------+
| Tables_in_test |
+-------------------+
| aaa                  |
+-------------------+
1 row in set (0.01 sec)
  •  INSERT INTO (데이터베이스 이름).(테이블 이름) (`열 이름1`,`열 이름2`...) VALUES ('값 1', '값2'...); : 테이블에 내용 추가
mysql> INSERT INTO test.aaa (`id`,`content`) VALUES ('1', '안녕~');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test.aaa (`id`,`content`) VALUES ('2', '반가워');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO test.aaa (`id`,`content`) VALUES ('3', '그래그래');
Query OK, 1 row affected (0.01 sec)
  • SELECT * FROM (테이블 이름) : 테이블 확인 쿼리문
mysql> SELECT * FROM aaa;
+----+-----------+
| id | content   |
+----+-----------+
| 1 | 안녕~      |
| 2 | 반가워    |
| 3 | 그래그래 |
+----+-----------+
3 rows in set (0.00 sec)

 

 

 

 


명령프롬포트에서 mysql 접속

  • 명령어
    • cd .. : 상위 폴더로 이동한다.
    • cd (폴더명) : 해당 폴더로 이동한다.
  • C 드라이브까지 폴더를 나간 후, 'C:\Program Files\MySQL\MySQL Server 8.0\bin' 경로로 이동한다.
  • mysql 패스워드를 입력하면 mysql에 접속된다.

 

 

 

 

 

 

728x90