슈뢰딩거의 고등어

[네트워크] TCP 통신과 UDP 통신의 차이 본문

tech

[네트워크] TCP 통신과 UDP 통신의 차이

슈뢰딩거의 고등어 2022. 1. 30. 17:20

롯데정보통신 모의테스트 문제에서 나왔던 질문인데 답변을 못했다.

 

또다시 나올 것 같지는 않지만, 알아두어야 하는 기초적인 것이라서 정리한다.

TCP 포트 두드려봐서 열렸는지 아닌지 판단하는 것이 이전 직장에서 하던 일 중 하나인데...

이런 것도 대답을 못하다니... 어휴... 다시 한번 기초의 중요성을 느껴 정리를 한다.


소켓통신에는 기본적으로 2가지 통신 방법이 있다.

신뢰성 프로토콜인 TCP와 비신뢰성 프로토콜인 UDP 가 그것이다.

  tcp udp
신뢰성 신뢰성 비신뢰성
양방향/ 단방향 양방향 단방향
속도 느림 빠름
사용처 메일, 웹, 파일 공유 (데이터를 누락시키면 안되는 서비스) 스트리밍, 방송 서비스
단점 1) 데이터를 보내기 전에 반드시 연결이 형성되어야한다.
2) 1: 1 통신만 가능하다.
3) 속도가 느리다.
데이터가 전송이 무사히 되었는지 알 수 없다.
데이터를 받는쪽에서 포트를 확인하여 데이터가 들어왔는지 확인을 해야한다.
장점 1) 데이터의 전송 순서를 보장한다.
2) error correction 매커니즘
3) 데이터 흐름제어 및 혼잡 제어
1) 비연결형 서비스로 연결없이 통신이 가능하다.
2) 속도가 빠르다.

 

TCP

Transmission Control Protocol 은 인터넷에서 가장 흔하게 그리고 많이 쓰이는 프로토콜 방식이다.

왜냐하면, TCP 는 error correction 이라는 것이 존재하는 데 말 그대로 에러를 다시 잡아주는 것이다. 덕분에 데이터를 못 받았을 경우 다시 재요청할 수 있다.

예를 들어, 서버에서 클라이언트에게 어떤 정보를 보냈다고 하자.

그러면 클라이언트는 서버가 보낸 정보를 제대로 받았는지 확인해주는 메세지를 다시 서버에게 돌려주고, 클라이언트가 제대로 받지 못했을 경우에는 resend를 서버에 요청할 수 있다. 그러면 loss 된 데이터를 다시 클라이언트에게 보낼 수 있는 것이다.

이런 방법들을 flow control 이라고 하며, 데이터를 loss하지 않고 받을 수 있게 한다. 즉, guarnated delivery

 

일반적인 전화와 유사한 방식으로 동작한다 생각하면 기억이 쉽다.

전화를 걸려면 전화번호를 알아야 하듯이, 통신을 하기 위해서는 상대방의 ip 주소와 port를 알고 있어야 연결을 요청할 수 있다.

그리고 연결 요청을 걸더라도 받아주지 않으면 계속해서 대기해야한다. 이것은 서버가 응답을 받아주지 않으면 계속 요청을 하다가 중간에 포기하는 것도 전화와 유사하다. 1:1이 연결이 되어야 tcp 통신을 할 수 있다.

 

만약, 전화를 받았을 경우 끊기 전까지는 계속해서 통신을 할 수 있다. 그리고 양방향 모두 가능하다. 데이터의 확인 절차도 거치게 된다. 위에 설명한 error correction! 만약 전화가 잘 들리지 않는다면 상대방은 다시 말해달라고 하는 것처럼, tcp 통신도 데이터를 받지 못했을 경우 다시 요청하는 메커니즘을 가진다.

 

UDP

User Datagram Protocol 은 인터넷에서 또 많이 쓰이는 프로토콜인데 그 사용처는 tcp 통신과는 다르다.

가장 큰 차이는 단방향 통신이라는 것!

서버가 클라이언트에게 혹은 클라이언트가 서버에게! error correction 이 없고, 무조건 보내는 쪽에선 던지기만 하고 받는 쪽에서는 받기만 한다. 그러다가 데이터 로스가 중간에 생기면 그냥 무시한다. 그냥 던지고 받는 거다. 덕분에 tcp 통신보다 빠른 전송을 보여주게 된다.

 

UDP는 편지로 비유할 수 있다. 편지를 쓸 때 편지지에 데이터를 기록하고 편지봉투에 주소를 기입하고 그냥 보내버린다. 상대가 받았는지 받지 못했는지 여부는 알 수 없다. 그러한 원리는 udp (단방향통신) 에서 적용된다.

마찬가지로 udp 로 데이터를 보내버리면 그 데이터가 잘 도착했는지 확인할 방법은 없다. 단지 보냈다는 사실만 존재할 뿐이다. udp 통신 자체는 상대방과 연결되어 있는 개념이 아니다.

 

편지를 받는 사람 입장에서 생각해보면, 편지가 왔는지 안 왔는지 여부는 편지함을 열어보기 전까지는 알 수 없다. 마찬가지로, 상대방이 udp를 통해서 데이터를 보냈다 하더라도 udp 소켓을 통해서 자신의 포트를 열어보기 전에는 데이터가 왔는지 안왔는지 알 수 없다. 즉 자신의 로컬에 소켓을 개설하고 데이터가 들어왔는지 오지 않았는지를 확인하는 메커니즘이 된다.

 

tcp 는 데이터를 주고받을 때 데이터가 도착했는지 하지 않았는지 내부적으로 확인하게 된다. 만약 하지 않았다면 재요청을 하는 메커니즘을 가지고 있다. 이러한 확인 절차 때문에 속도면에서 udp 보다 느리다. 

하지만 udp 는 빠르지만 데이터가 정확하게 도착했는지 확인할 수 없는 비신뢰성 프로토콜이다.

 

그렇다면 두 통신방법은 각자 어디에서 사용이 될까?

웹페이지 전송에서 어떤 데이터 베이스를 전송할 때는 반드시 tcp 통신이 사용되어야 한다. 상상해보라, 웹페이지가 전송 오류로 이상한 화면이 떠져 있다면 혹은 아예 뜨지가 않는다면...

udp 통신은 비디오 오디오 신호 전송에 사용된다. 빠른 프레임으로 돌아가는 비디오 스트리밍 프로그램에 한두 프레임 로스가 생겼다고 

resend 를 재요청하고, 데이터 로스를 일일이 확인해서는 버퍼링 때문에 오히려 속 터질 것이다. 몇 프레임 정도 놓쳐도 오히려 상관없고

놓친 프레임은 과감하게 버리는 방식이다. 큰 파일을 스트리밍으로 내려 받을 때 적합하다. 인터넷 스트리밍 영상이나 음향들의 퀄리티가 오프라인으로 받아놓고 보는 것보다 좋지 않은 이유도 이것이다.

 

TCP와 UDP의 공통점

포트번호를 이용하여 주소를 지정한다.

 

Comments