DevBoi

[Network] TCP & UDP 통신 방법 다시 공부 본문

Infra/[Linux & Network]

[Network] TCP & UDP 통신 방법 다시 공부

HiSmith 2022. 12. 2. 17:08
반응형

오늘은 TCP의 통신 방법에 대해서 공부를 해보려고 한다.

 

전송계층에서 사용하는 프로토콜, 목적지 장비까지 전송한 패킷을 상위 특정 응용 프로토콜에게 전달 하는 것에 목적이 있다.

 

*TCP : 연결형 서비스를 지원하는 전송 계층 프로토콜, 인터넷 환경에서 기본으로 사용한다.

호스트간 신뢰성 있는 데이터전달과 흐름을 제어한다.

 

일반적으로 IP가 데이터의 배달을 처리하고, TCP는 패킷을 추적 및 관리하게 된다.

 

TCP 특징

-연결형 서비스로 가상 회선 방식을 제공한다.

-데이터의 경계를 구분하지 않는다.

-데이터의 전송순서를 보장한다.

-UPD보다 전송속도가 느리다.

-신뢰성있는 데이터를 전송한다.

 

* UPD 특징

-비연결형 서비스를 지원하는 전송계층 프로토콜로써, 인터넷상에서 서로 정보를 주고받을때 정보를 보낸다는 신호나 받는다는 신호절차를 거치지 않고, 보내는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜이다.

데이터를 데이터그램 단위로 처리하는 프로토콜이다.

* 데이터그램이란? 독립적인 관계를 지니는 패킷이라는 뜻이다.

 

우선 기본적인 정보를 알았다.

그러면 , 하위 정보에 대해서 추가로 공부해보자

 

1. TCP/IP Handshake

TCP는 장치들 사이에 논리적인 접속 을 성립하기 위해 , three-way handshake를 사용한다.

TCP 3Way Handshake는 TCP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저

세션을 수립한다.

 

1. CLIENT -> SERVER : TCP SYN

2. SERVER -> CLIENT : TCP SYN ACK

3. CLIENT -> SERVER : TCP ACK

 

양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에

한쪽이 다른쪽이 준비되었다는 것을 알수 있도록 한다.

 

 

A클라이언트는 B서버에 접속 요청 SYN 패킷을 보낸다.

이때 A클라이언트는 SYN을 보내고, SYN/ACK 응답을 기다리는 , SYN_SENT 상태가 되는 것이다.

 

B서버는 SYN요청을 받고, A클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다.이때 B서버는 SYN_RECEIVED상태가 된다.

 

마지막으로 A클라이언트는 B서버에게 ACK를 보내고, 이후로 부터는 연결이 이루어지고 데이터가 오가게 된다.

B서버 상태가 ESTABLISHED이다.

 

이렇게 신뢰성 있는 연결을 맺어주는게 TCP의 3hand shake이다.

 

하지만, 초기화가 아닌, 세션 종료하기 위해 진행되는 4way handshaking이 있다.

 

이게 무슨 말이냐,통신이 다되면, 해당 통신을 종료하는 방법이다.

연결을 하는것과 연결을 해제하는것 이 두가지 방법 다 서버와 송신쪽에서의 통신 후에 된다는 점이다.

1) 클라이언트가 연결을 종료하겠다는 FIN플래그를 전송한다.

2) 서버는 일단 확인 메시지를 보내고, 통신이 끝날떄까지 기다린다.

3) 서버가 통신이 끝났으면 연결이 종료되었다고, 클라이언트에게 FIN플래그를 전송한다.

4) 클라이언트는 확인했다는 메시지를 보낸다.

 

만약에 어떤 데이터 패킷이늦어지고, FIN패킷이 먼저 도착하게된다면?

 

FIN받고 서버는 일정 시간 TIME-WAIT을 통해 잉여패킷을 기다리게된다.

그래서 혹시라도 FIN이후에 늦게 오는 데이터 패킷에 대한 유실을 방지한다.

 

 

 

2. socket io와 handshake의 관계

우선 socket에 대해서 알아보자

 

*소켓은 프로토콜,ip,포트넘버로 정의된다.

*떨어져있는 두 호스트를 연결해주는 도구로써 인터페이스 역할을 한다.

*데이터를 주고받을수 있는 구조체로 소켓을 통해 데이터 통로가 만들어진다.

*소켓의 역할에 따라 클라이언트 소켓, 서버 소켓으로 나뉜다.

 

그러면 socket.io는 무엇인가?

- socket.io란, websocket을 기반으로 실시간 웹 애플리케이션을 위한, Javascript 라이브러리이다.

웹 클라이언트와 서버간의 실시간 양방향 통신을 가능하게 해주는 Node.js 모듈이다.

웹 소켓은 데이터가 누락되지 않게 하는 tcp 기반의 양방향 통신을 제공하는 컴퓨터 프로토콜이다.

 

그러면 socket.io가 기반으로하는 웹소켓은 어떤걸까?

Http 통신은 단방향 방식이고, 연결이 유지가 안되기 때문에 매번 업데이트 유/무를 확인하기 위해

서버에 요청을 불러와야 한다., 그리고 요청할떄마다 전체 데이터를 불러오게 되어있다.

그렇기 때문에 서버에 많은 부하가 간다.

웹 소켓은 양방향 통신을 지원하고, 서버와의 연결이 유지가 된 상태에서 데이터가 오갈수 있게 해준다.

따라서 실시간 데이터 전송이 가능해진다. 이럴 때, Websocket을 이용한다.

 

간단히 서버와 클라이언트가 연결되어있는 상태를 만들어주기 위해, 사용한다.

 

*Websocket

-HTML5 웹 표준 기술

-매우 빠르게 동작하고, 통신할때 아주 적은 데이터를 이용한다.

-이벤트를 단순히 듣고, 보내는 것만 가능하다.

 

* Socket.io

-표준 기술이 아니며, 라이브러리이다.

-소켓연결 실패시 fallback을 통해 다른 방식으로 알아서 해당 클라이언트와 연결을 시도한다.

-방 개념을 이용해 일부 클라이언트에게만 데이터를 전송하는 브로드캐스팅이 가능하다.

 

그러면 이 소켓은 어떻게 작동할까?

웹 소켓은 HTTP와 다르게 WS라는 프로토콜을 사용한다.

웹소켓 연결이 이루어지고 나면, 그 다음부터는 계속 연결된 상태로 있으므로

업데이트가 있는지 요청을 보낼 필요가 없다.

 

 

*소켓 통신은 UDP방식이다라는 말도 있는데, 정확하진 않고, 비 연결형 서비스 방식이 주다 정도로 이해하고있으면 좋을 것같다.

TCP랑 다르게 연결을 수립하거나, 서로 ok를 하지 않고, 연결 요청하고

바로 데이터 송수신하고 닫아 버린다. 

 

이렇기 떄문에 수신했는지 확인은 불가능하지만,

스트리밍 서비스나, 등등에서는 이러한 방식으로 실시간 데이터 전송을 가능하게 해준다.

HTTP 기반은 단방향이나, 웹 소켓을 이용하면 양방향으로도 가능하니, 

해당 라이브러리를 활용하면 더 의미있는걸 만들어낼수도..?

 

자 그러면 해당 기초지식은 쌓았고,

이제 리눅스 관련 TCP 네트워크 성능 관련 공부를 해보자

 

 

 

 

 

 

 

반응형

'Infra > [Linux & Network]' 카테고리의 다른 글

리버스 프록시와 프록시 차이  (0) 2024.05.15
[리눅스] 링크란?  (0) 2023.05.19
[리눅스] 명령어 기초 (cat, find)  (0) 2023.05.19