UDP와 TCP는 전송계층에서 사용되는 네트워크 통신 프로토콜이다.
각 차이점을 알아보며 특징을 이해해보도록 하자.
UDP
UDP는 비 연결형 통신 프로토콜이다.
비 연결형 통신 프로토콜이란, 서버와 클라이언트 간의 연결 없이 데이터를 주고 받는다는 의미이다.
연결 없이 데이터를 주고받는다는 뜻은 클라이언트에서 서버를 향해 데이터를 보낼 수는 있으나, 그 반대로 서버에서 클라이언트로 데이터를 보낼 수는 없다는 뜻이다.
왜? 서버는 대상이 특정되어 있지만, 클라이언트는 불특정 다수이므로 대상을 특정할 수 없다.
=> 서버에서도 특정 클라이언트의 정보를 안다면 데이터를 보낼 수도 있다.
서버와 클라이언트가 연결되어 있지 않기 때문에, 각 패킷들은 서로 다른 경로로 이동하여 목적지에 도착하게 된다.
각 패킷의 경로가 다른 이유로, 패킷의 전송 시간이 일정하지 않아 보내는 순서와 도착하는 순서가 다를 수가 있다.
=> 데이터의 신뢰성이 보장되지 않는다.
클라이언트에서 A,B,C의 순서로 패킷을 서버로 보내면, 서버에서는 A,B,C의 순서로 패킷을 수신해야 하지만
UDP 통신의 경우 A,C,B 나 B,A,C 등 클라이언트가 송신한 순서와 다소 다를 가능성이 생긴다.
그렇다면, 데이터를 신뢰성있게 보내지도 못하는 프로토콜이 무슨 의미가 있을까?
UDP의 장점은 바로 속력에 있다. 데이터를 송수신하는데 있어서 고려하지 않는 것들이 많아 빠른 처리가 가능하기 때문에 네트워크에 부하를 적게 주며, 신뢰성은 낮더라도 연속성은 높은 통신을 할 수 있게 된다.
이러한 이유로 UDP는 비디오 스트리밍과 같이 신뢰성보다 연속성이 중요한 서비스에 주로 사용된다.
(비디오 스트리밍의 경우 중간 1프레임정도 문제가 발생하더라도 크게 눈치채지 못하지만, 느린 송수신으로 인해 화질이 저하되거나 프레임이 낮아지는 것은 쉽게 알아차릴 수 있다.)
TCP
TCP는 연결형 통신 프로토콜이다.
연결형 통신 프로토콜이란, 클라이언트와 서버가 논리적으로 연결된 상태로 데이터를 주고 받는다는 의미이다.
클라이언트와 서버가 서로 이어져 있기 때문에, 양방향 통신이 가능하다. 클라이언트에서 서버로 데이터를 보낼 수 있으며, 서버에서도 클라이언트로 데이터를 보낼 수 있다.
TCP 통신에서 클라이언트와 서버를 연결하는 이유는 신뢰성 있는 데이터의 송수신을 위해서이다. 서로 연결되어 있기 때문에, 데이터의 순서와 무결성을 보장할 수 있다. 또한, 유실된 패킷이 존재할 경우 클라이언트에 재송신을 요청할 수도 있게 된다.
TCP 통신에서 클라이언트와 서버의 연결, 해제에는 특별한 방법이 사용된다.
바로, 3 Way - Handshake 와 4 Way - Handshake 이다.
3 Way - Handshake
3Way - Handshake 란, TCP 통신에서 클라이언트와 서버가 서로 연결하기 위해 사용하는 방식이다.
이 때, SYN과 ACK라는 두개의 플래그를 사용한다. (구체적로는 더 많은 플래그가 사용되는 것으로 안다.)
SYN : 무작위 난수를 담아, 상대방에게 보낸다. (응답을 요청하는 신호)
ACK : 상대가 보낸 SYN에 담긴 난수에 1을 더해, 상대방에게 보낸다. (SYN에 대한 응답 신호)
먼저, 클라이언트가 서버에 SYN을 보낸다.
서버는 SYN을 수신한 뒤, SYN에 대한 ACK와 함께 새로운 SYN을 보낸다.
클라이언트는 서버에서 보낸 SYN에 대한 ACK를 다시 서버에 보내고, 서버가 ACK를 수신한 뒤 서로 연결이 확립된다.
이는 신뢰성 있는 통신을 위해, 서로 데이터를 송신하고 수신할 수 있는 준비가 되어있는지 사전에 확인하는 과정이다.
4 Way - Handshake
4Way - Handshake 란, TCP 통신에서 클라이언트와 서버가 안정적으로 연결을 해제하기 위해 사용하는 방식이다.
이 때는, FIN과 ACK라는 두개의 신호를 사용한다.
FIN : 연결을 종료하겠다는 신호
ACK : FIN에 대한 응답 신호
서버에 연결을 시도하는 것은 클라이언트로부터 시작되지만, 접속을 해제하는 것은 서버가 먼저 시도할 수도 있다.
그러므로, 서버와 클라이언트가 아니라 A와 B로 표현할 것이다.
A는 먼저 연결 해제를 요청하는 쪽이며, B는 해제를 요청받는 쪽이다.
먼저, A는 B에게 FIN을 보낸다.
B는 FIN을 수신한 뒤 A에 ACK를 송신하고, 잠시 대기 상태에 머문다.
(대기상태에 머무는 이유는 A가 보낸 패킷중 도달하지 않은 것이 있을 수 있기 때문에 이를 기다리는 것이다.)
B에서 충분히 대기했다고 판단하면, A에 FIN신호를 보낸다.
A는 FIN을 수신한 뒤, B에 ACK를 송신하고 잠시 대기상태에 머문다.
(역시나, B에서 보낸 패킷중 아직 도착하지 않은 것이 있을 수 있기 때문이다.)
B는 ACK를 수신받은 뒤, 소켓을 닫는다.
(이 때, A는 아직 소켓을 닫지 않았으므로 송신중인 패킷이 있다면 수신할 수 있다.)
A는 충분한 대기시간을 거친 뒤, 최종적으로 소켓을 닫는다.
이러한 과정을 통해, 연결 해제로 인해 데이터의 유실이 발생하거나 데드락에 빠지는 것을 방지할 수 있다.
TCP는 이처럼, 연결과 해제 과정에서도 여러 과정을 거치지만 패킷을 송수신할 때, 데이터의 신뢰성을 보장하기 위한 여러 절차를 거치기 때문에 UDP에 비해 상대적으로 느린 속력을 보인다.
TCP의 경우는 속도보다 신뢰성에 무게를 둔 프로토콜인만큼, 파일을 다운로드 받는 등의 서비스에 이용된다.
TCP vs UDP
두 프로토콜의 차이를 표로 한눈에 알아보자.
UDP | TCP |
비 연결형 통신 | 연결형 통신 |
데이터의 신뢰성이 낮다. | 데이터의 신뢰성이 높다. |
데이터 송수신 속력이 상대적으로 빠르다. | 데이터 송수신 속력이 상대적으로 느리다. |
단방향 통신이다. | 양방향 통신이다. |
'네트워크' 카테고리의 다른 글
네트워크 - DNS (Domain Naming Systyem) (0) | 2024.05.26 |
---|---|
네트워크 - PING (Packet Internet Groper), Ping Of Death (0) | 2024.05.26 |
네트워크 - LAN, MAN, WAN (0) | 2024.05.26 |