NodeJs.TCP 흐름

2022. 12. 15. 19:29NodeJs

목차
1. TCP 통신 원리를 알아야하는 이유
2. Server와 Client
3. TCP 통신의 흐름

1. TCP 통신 원리를 알아야하는 이유

 

들어가기에 앞서, NodeJs에서는 외장 모듈인 express를 사용해 구현되어있는 모듈을 다운받아 사용할 수 있다. express로 서버를 구현하면 편리하게 기능들을 사용할 수 있다.

 

하지만, 동작원리를 알지 못하고 사용해버리면 express의 기능을 좀 더 효율적 혹은 자율적으로 사용하는데에 제한이 생긴다. 그러므로 express를 사용하기 전에 express가 해주는 역할을 직접 구현해 볼 필요가 있다.

 

 


2. Server와 Client

 

무언가를 요청하는 쪽이 Client, 요청받는 쪽은 Server라고 할 수 있다. Server_A가 Server_B에게 요청을 한다면 Server_A는 Client가 된다. 이렇듯 Server와 Client는 한 번 정해지면 고정되는 것이 아니라, 기능이나 상황에 따라 바뀐다.

 

Server와 Client가 서로 데이터를 주고 받기 위해서는 OSI 7계층을 통해 데이터를 주고 받아야한다. Server와 Client는 각각 가장 상위 계층인 7 계층에 속한다.

 

Client에서 데이터를 보내려면 7계층부터 차례대로 내려가 1계층까지 간후 물리적인 연결을 통해 Server의 1계층에 전기 신호 형태로 전달한다. 해당 데이터는 차례대로 각 계층을 통과해 최종적으로 Server라는 7계층에 도달하게된다.

 

코드의 작성으로 통신을 가능하게 하는 부분은 4계층(전송계층) 이상에서 가능한 일인데, 4계층을 TCP 통신이라고 부르기도 한다. 우리는 이 4계층에서 통신이 어떻게 되는지에 대한 흐름을 알아볼까한다.

 

 


3. TCP 통신의 흐름

 

TCP 통신부분은 크게 3가지로 볼 수 있다.

  • 3_way_hand_shaking( 논리적 연결 시작 )
  • HTTP_Protocol( 연결 상태의 통신 )
  • 4_way_hand_shaking( 논리적 연결의 끊음 )

먼저, 데이터 통신을 위해 3_way_hand_shaking가 발생한다.

아래의 그림은 왼쪽이 Client, 오른쪽이 Server가 위치해있다.

<그림 1> 3_way_hand_shaking

이 때, Client가 먼저 연결(Established)되고 Server가 연결된다. 연결된 상태로 데이터를 주고 받는데, 미리 어떠한 데이터를 주고 받을지 규약을 정해서 보낸다. 이 규약을 프로토콜이라고 한다.

 

<그림 2> HTTP 프로토콜

 프로토콜중 하나인 HTTP 프로토콜을 이용해 요청 메시지와 응답 메시지를 주고받는다. 이렇게 연결된 상태로 계속 데이터를 주고 받으면 좋겠지만, HTTP 프로토콜은 비연결성이기 때문에 데이터를 주고받은 후에 연결을 끊는다. 연결을 끊기위해서는 4_way_hand_shaking을 거쳐야한다.

 

<그림 3> 4_way_hand_shaking

Client측에서 Fin을 보내 Server에 연결을 끊자는 데이터를 전달하면, Server 역시 이를 승인하는 데이터(Ack)와 Fin번호를 보낸다. 데이터를 받은 Client는 서버를 닫는데, 바로 닫지 않고 아직 전송되지 못한 데이터가 있을 수 있으므로 승인(Ack)을 보내고 데이터가 올 수 있도록 서버를 열어둔다. Ack를 받은 Server 측에서 먼저 연결을 종료하고, 이어서 Client가 연결을 종료함으로 통신이 끝난다.

 

TCP 통신의 흐름은 이러한 과정을 통해 이루어진다.

<그림 4> Browser가 Client의 역할을 하고있다.

서버, 클라이언트와 통신은 큰 흐름을 알고 코드를 작성해 나가야 한다. express는 이 과정을 해결해주지만, 제대로 알지 못하고 사용한다면 더 이상의 응용이 불가능하다. 그러므로 큰 흐름을 잡아둔 채로 코드를 작성해보자.

'NodeJs' 카테고리의 다른 글

NodeJs.TCP Server 만들기(2)  (0) 2022.12.17
NodeJs.TCP Server 만들기(1)  (0) 2022.12.15
NodeJs.모듈  (0) 2022.12.06
NodeJs.실행 및 사용방법  (0) 2022.12.06
NodeJs.개념 이해하기  (1) 2022.12.06