TCP란?
서버와 클라이언트 사이에 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜이다.
[특징]
데이터를 전송하기 전에 세션을 맺는 연결 지향형 서비스이다.
네트워크 대역폭을 공평하게 공유하도록 TCP 혼잡 제어 방식을 사용한다.
데이터가 전송되는 과정에서 손실이나 순서가 바껴서 전송될 수 있는데, 손실을 검색해서 교정하고 순서를 재조합할 수 있도록 해준다.
3-way handshaking 과정을 통해 연결을 맺고 4-way handshaking을 통해 해제한다.
신뢰성을 보장한다.
UDP보다 속도가 느리다.
TCP 프로토콜은 사용자와 서버간의 세션을 맺은 후에 데이터를 전송한다. 3 Way-Handshake 방식으로 세션을 맺는데, 예를 들어, 클라이언트는 서버에게 연결을 요청한다. 여기서 보내는 값이 SYN값입니다. 만약 클라이언트가 SYN값을 0을 보냈다면, 서버는 SYN 값을 잘 받았다면 잘 받았다는 의미로 SYN 값에 +1을해서 ACK 값을 넣고 새로운 SYN 값과 ACK 값을 동시에 보냅니다. 이때 서버에서 클라이언트로 보내는 SYN 값은 다음 전송을 받을 때 중요하다. 서버에서 SYN+ACK 값을 받게 되면 클라이언트는 잘 받았다는 의미로 받은 ACK 값에 +1을 해서 서버에게 다시 보냅니다. 이렇게 클라이언트가 ACK값까지 보내게 되면 두 장비는 TCP로 연결이 된것입니다.
이 후 데이터를 송수신 한 후에 4 Way Handshake를 통해 세션을 종료합니다. 연결을 종료하기 위해 서버에 FIN을 보내면 FIN_WAIT1 상태가 되고(서버가 FIN 보내는 것도 가능하다.), 서버는 클라이언트한테 FIN을 받고 응답으로 ACK을 보내면 상태는 CLOSE_WAIT가 됩니다. 서버의 통신이 끝나면, 클라이언트에게 FIN을 보내고 LAST_WAIT 상태가 됩니다. 클라이언트는 확인했다는 의미로 ACK을 보내고 TIME_WAIT 상태가 됩니다.
상태 | 설명 |
---|---|
FIN_WAIT1 | Close를 호출한 측의 소켓이 진입하는 상태이다. FIN을 보낸다. |
CLOSE_WAIT | Close를 받으면 CLOSE_WAIT 상태로 진입한다. ACK를 보낸다. |
FIN_WAIT2 | ACK 신호를 받은 소켓은 FIN_WAIT1 > FIN_WAIT2로 상태 변경된다. |
LAST_WAIT | CLOSE 호출 후 진입하는 상태이다. FIN을 보낸다. |
TIME_WAIT | CLOSE를 받으면 진입하는 상태이다. ACK를 보낸다. |
CLOSED | 연결을 종료한다. |
TCP를 언제 사용해야 하는가?
신뢰도가 높은 데이터를 보내야할 때 사용한다.
=> 데이터 조각, 패킷들을 전송할때 마다 확인하고 목적지에 도착해서도 패킷들을 확인하여 누락과 오류를 찾아내서 재 전송을 요청하기 때문이다. 또한, 송수신지의 데이터를 처리하는 속도를 조절해서 수신자의 오버플로우를 방지하는 흐름제어나, 정보의 소통량이 과다할 때 전송하는 패킷의 양을 조절해서 혼잡을 제어한다.
그러나 TCP는 속도 즉, 성능이 떨어진다.
모든 패킷에 대한 응답이 필수적이여서 시간 지연과 속도가 느려지며, CPU의 소모량이 많아져 성능 저하를 초래할 수 있다.
UDP란?
서버와 클라이언트간의 연결없이 서비스하여 빠른 데이터를 전송한다.
[특징]
UDP는 언제 사용해야 하는가?
UDP는 흐름제어나 오류제어 등이 없어서 전송 속도를 최대한 빠르게 할 수 있지만 신뢰성 있는 전송을 보장할 수 없다. 그렇기 때문에 신뢰성보다 속도가 중요한 부분에서 UDP를 사용한다.
실시간 스트리밍을 통해 동영상이나 음성 데이터는 신뢰성보다 속도가 중요하므로 UDP를 사용한다.
DNS나 SNMP에도 사용된다.
하지만 데이터에 손실이 있을 수 있다.
연결을 하기 위해서 사용되는 논리적인 경로가 없으며, 각각의 패킷이 다른 경로로 전송 처리되는 비연결형 프로토콜이다. 정보 송수신에 대한 신호절차가 없으며, 최소한의 오류를 검증하기 때문에 패킷 손실이 많은편이다.
UDP와 TCP의 공통점
UDP와 TCP의 차이점
TCP | UDP |
---|---|
연결이 성공해야 통신 가능하다.(연결형 프로토콜) | 비연결형 프로토콜(연결 없이 통신이 가능) |
데이터의 경계를 구분하지 않는다.(Byte-Stream Service) | 데이터의 경계를 구분한다.(Datagram Service) |
신뢰성 있는 데이터 전송을 한다.(데이터의 재전송 존재) | 비신뢰성 있는 데이터 전송을 한다.(데이터의 재전송이 없다) |
1:1 통신한다. | 1:1, 1:n(Broadcast), n:n(Multicast) 통신한다. |