본문으로 바로가기

TCP와 UDP 차이점을 생각해보며 두 전송 방식의 원리를 정리하고자 한다.

 

1. 서론

UDP와 TCP의 차이점을 비유해보면,

 

UDP는 저돌적인 막무가내 스타일이다.

수신측의 상황을 전혀 고려하지 않고 송신측에서 보낼 데이터가 있으면 그냥 전송한다.

그냥 데이터를 보내놓으면 할일 다했다 끝

-> 비연결지향적 프로토콜

 

TCP는 신사적인 스타일이다.

말을 걸기 전에 먼저 악수를 건네 호의를 보이는 것이다. (지금 대화 가능하신가요?)

수신 측에 신호를 보내 수신이 가능한 상태인지 묻고, 응답을 받으면 그제서야 데이터를 주고받는다.

데이터를 보내놓고도 제대로 수신된건지 확인하고,

송수신을 마칠 때에도 연결 종료 신호를 주고받으며 신중하게 끊는다.

-> 연결 지향적 프로토콜

 

 

실제 흔히 사용하는 HTTP통신을 비롯하여 파일전송이나 이메일전송은 모두 TCP를 사용한다.

 

 그럼 무조건 신뢰성 높은 TCP가 좋을까?

 

아니다.

UDP는 송수신 제어가 없어 신뢰성이 떨어지지만 그만큼 전송속도가 빠르다.

보통은 흐름제어, 오류제어, 혼잡제어 3제어가 되는 안정적인 TCP전송을 사용하지만,

패킷 한두개쯤 손실되어도 큰 이상이 없고, 전송속도에 민감한 음성 통신(VoIP) 이나 실시간스트리밍(Streaming)같은 경우는 UDP가 좋다.

또한, TCP는 무조건 1:1로 연결을 맺어 송수신을 하므로 다수의 통신을 할 수 없다. 그래서 한번에 여러 사람이 접속하는 화상회의 서비스같은 경우도 UDP를 사용한다.

 

우리가 사용하는 HTTP통신에서는 TCP를 채택하여 사용하므로

UDP는 간단하게만 알아두고

TCP통신 과정에 대해 더 정리해보고자 한다.

 

2. 3-Way-Handshaking

3단계 연결 설정(3-Way-Handshaking)은 TCP의 주요한 특징이다.

이는 데이터 송수신 이전에 송, 수신자 사이의 연결을 확정짓는 과정이다.

 

3-Way-Handshaking

① client 측은 server측에 동기화 요청을 하기 위해

접속해야 하는 socket이 무엇인지. 제어정보를 기록한 TCP header를 송신한다. (SYN-SENT)

(이때, header의 SYN(control bit) = 1) - SYN신호를 보낸다고 이야기한다.

 

② network를 통해 packet이 server에 도착하면,

server의 TCP부 에서 TCP header를 조사하여 수신처port에 적힌 socket을 찾아낸다.

해당 socket에 필요한 정보를 기록한다. (접속 진행중 상태)

packet이 잘 도착했음을 알리는 응답 msg를 전송한다. (SYN_RECEIVED)

(이때, header의 ACK(control bit) = 1) - SYN + ACK신호를 보낸다고 이야기한다.

 

③ 응답 msg가 client의 IP를 경유하여 TCP부로 도착하면,

접속동작이 성공했는지 확인하고,

socket에 server IP와 port번호 + 접속완료 제어정보를 기록한다.

server에 응답알림 TCP header를 반송한다.

(이때, header의 ACK(control bit) = 1) - ACK신호를 보낸다고 이야기한다.

 

서버가 client측의 ACK을 받으면 비로소 송수신 연결설정이 완료된다. (ESTABLISHED)

 

TCP 통신은 위와 같이 3단계의 연결 설정 이후에

데이터를 주고받을 때에도 계속 신중한 태도를 유지한다.

송신 측에서 데이터를 전송하고 나서 수신측이 보낸 ACK 신호가 올 때까지 대기한다.

만약 일정 시간 이후에 ACK신호가 오지 않으면 전송오류로 판단하여 재전송한다.

(TCP방식만 따로 빼서 더 구체적으로 정리해보아야겠다)

 

데이터 전송을 모두 마친 이후에 연결을 종료하는 방식도 신중하다.

3-Way-Terminating 방식이라고 일컫는데,

이 방식은 Handshaking 방식과 유사하다.

단지, header의 control bit에서 SYN 대신, FIN을 사용한다는 점만 다르다.

 

다만, client 측에서 FIN을 보냈을 시점에 server의 데이터 처리가 아직 끝나지 않았다면,

FIN + ACK을 함께 보내지 않고 ACK을 먼저 보낸 이후에

데이터 처리를 끝내고 나서 FIN을 보내어 연결종료를 한다.

이 경우는 4-Way-Terminating 에 해당한다. (그냥 한단계가 늘었을 뿐이다)

 

3. Buffering 방식

이렇게 TCP방식이 신중할 수 있는 이유는 버퍼링(Buffering)방식 덕분이다.

TCP방식으로 데이터를 송수신할 때

protocol stack은 application으로부터 받은 데이터를 곧바로 송신하지 않고,

자체 내부의 송신용 buffer memory에 저장 한다.

그렇기 때문에 수신오류가 발생했을 때, 데이터를 재전송할 수 있는 것이다.

따라서 Buffering 방식은 TCP와 UDP를 구분짓는 핵심 구성요소라고 볼 수 있다.

 

4. netstat -n

netstat은 원래 network statistics의 줄임말로

활성화되어있는 네트워크 연결 상태를 확인할 수 있는 명령어다.

 

netstat -n 실행결과

위 실행결과를 살펴보자.

 

1) 프로토콜 : 연결에 사용된 프로토콜의 종류

 

2) 로컬 주소 : 출발지 주소 (내PC)

로컬 주소 127.0.0.1:1024 에서 127.0.0.1 은 IP주소, 1024는 포트번호(port number)다.

포트번호 + IP주소 를 합쳐서 소켓(Socket) 이라고 부른다.

 

구분 크기 구성체계 비고
포트 번호 16bit 단일 전송 계층(Transport Layer)
IP주소 32bit network ID + host ID 네트워크 계층(Network Layer)
MAC주소 48bit OUI + 일련번호 데이터링크 계층(Datalink Layer)

 

3) 외부 주소 : 목적지 주소

 

4) 상태 : 연결 상태

 

 

5. 결론

- UDP = 막무가내 (신뢰성이 낮지만 빠르다. 실시간성이 필요할 때 사용)

- TCP = 신사적 (신뢰성이 높지만 UDP에 비해서는 느리다. 안정성을 필요로 하는 파일전송 등에 사용)

- 3-Way-Handshaking = 연결 전 수신가능상태 확인 (악수요청)

 

 

 

반응형