본문 바로가기
Research/Network

TCP와 UDP

by RIEM 2023. 3. 22.
728x90

ISO model and TCP/IP model

Screenshot 2023-03-20 at 10 32 05 PM

TCP 와 UDP

컴퓨터끼리 통신하는 방식은 여러가지 있는데, 그중 TCP와 UDP에 대해 알아보겠습니다. TCP UDP는 OSI 7 모델에서 4번째 Transport Layer에 속하는 계층의 통신 방식입니다.

TCP는 Transmission Control Protocol의 약자로 연결 지향(Connection-oriented)적 특징을 가지고 있는 것이 특징입니다. 이러한 특징 덕분에 주고 받는 데이터 패킷의 손실 없이 주고 받을 수(무결성 integrity) 있습니다. 게다가 주고 받는 순서까지 보장해줍니다. 데이터의 온전함이 중요한 어플리케이션, 이메일, 브라우저, 파일 전송 등에서 주로 사용하는 통신 방식입니다.

TCP와 함께 자주 언급되는 UDP 방식은 User Datagram Protocol의 약자로 Connectionless한 것이 특징입니다. 쌍방향 소통에 집중한 TCP와 달리 UDP는 한쪽의 일방적인 소통이여서 Fire and forget protocol이라고도 불립니다. 장점은 TCP보다 빠릅니다. 대역폭(bandwidth)가 좁고 패킷이 더 적은데, 이는 잘 전달되었을까라는 확인하는 작업이 없어 overhead가 덜 생기기 때문입니다. 게다가 stateless하다는 장점도 있습니다. 반면 받는 쪽의 응답이 없어 전송이 제대로 되었는지 확인할 방법이 없어 전송 보장이 어렵습니다. 당연히 패킷의 순서도 낮습니다. 주로 빠른 응답 속도가 중요한 비디오 스트리밍, 온라인 게임 등에서 사용하는 기술입니다.

TCP

  • TCP는 Transmission Control Protocol의 약자
  • 연결 지향성(Connection oriented protocol) 프로토콜이다.
  • 장점
    • 데이터 패킷의 무결성(integrity)이 보장된다
    • 데이터의 순서가 보장된다
  • 사용
    • 웹 브라우저, 이메일, 파일 전송, 데이터 무결성이나 신뢰성이 중요한 어플리케이션

UDP

  • UDP는 User Datagram Protocol의 약자다.
  • Connectionless Oriented Protocol이기에 세션이 없다. Fire and forget protocol이라고도 부름
  • 데이터가 상대방에게 잘 전달되었는지 상관하지 않는다. 데이터가 잘 도착되었는지 확인하기 위한 작업이 없기 때문에 overhead가 덜 발생되어서 속도가 상대적으로 빠르다.
  • 장점
    • 패킷이 더 작다
    • 대역폭(bandwidth)이 더 좁다
    • tcp보다 빠르다
    • stateless하다
  • 단점
    • 응답이 없다
    • 전송을 보장할 수 없다
    • 연결지향적이지 않다
    • 정체를 통제할 수 없다
    • 패킷의 순서가 없다
    • 보안성이 낮다
  • 사용
    • 비디오 스트리밍, 온라인 게임 등 응답 속도와 시간이 중요한 실시간 어플리케이션

TCP 구현

// TCP
const net = require('net');

const server = net.createServer((socket) => {
  socket.write('Hello');
  socket.on('data', (data) => {
    console.log(data.toString()); // break point
  });
});

server.listen(8080);

앱을 디버거로 실행시킨 후, 터미널에서 telnet으로 호출을 시켜본다.

telnet 127.0.0.1 8080

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello

localhost와 연결되었다는 문구가 뜬다. TCP 연결이 잘 되었다.

Connected to localhost.
Escape character is '^]'.
Hello. I love you

Hello 다음에 'I love you'라는 문구를 치고 엔터를 치면 데이터가 전송된다.

Screenshot 2023-03-20 at 9 44 39 PM
어플리케이션 터미널에서 잘 수신된다.

Connected to localhost.
Escape character is '^]'.
Hello. I love you
Yo~~

Yo~~ 라는 문구도 보내준다

Screenshot 2023-03-20 at 9 45 41 PM
Break pointer를 걸었기에 Buffer 데이터를 확인할 수도 있다.

Screenshot 2023-03-20 at 9 47 00 PM

이번에는 어플리케이션을 종료해보자.

종로하면 클라이언트의 터미널에서는..

Connected to localhost.
Escape character is '^]'.
Hello. I love you
Yo~~
Connection closed by foreign host.

foreign host에 의해 종료되었다는 문구가 뜬다.

UDP 구현

// UDP
const dgram = require('dgram');
const socket = dgram.createSocket('udp4');

socket.on('message', (msg, rinfo) => {
  console.log(`Server got: ${msg} from ${rinfo.address}: ${rinfo.port}`); // break point
});

socket.bind(8081);
echo 'hi' | nc -w1 127.0.0.1 8081

netcat으로 1초 타임아웃으로 설정하여 요청을 보내면 확인할 수 있다.

Referene

728x90

댓글