네트워크 통신에 사용되는 프로토콜 TCP와 UDP에 대해 알아보자 ❕
1. 프로토콜 (Protocol)
통신 규약. 네트워크에서 서로 다른 장치들 간의 원활한 통신을 위해 정의된 규칙이다. 사람과 사람이 의사소통을 할 때도 서로 이해할 수 있는 언어를 사용해야 하듯이, 컴퓨터와 같은 장치들도 서로 이해할 수 있는 언어를 사용해야 서로 통신이 가능하다. 이를 위한 규칙을 프로토콜이라고 한다.
프로토콜의 종류로는 HTTP, TCP, UDP, IP, SMTP 등이 있다.
프로토콜의 기본 요소
- 구문(Syntax) : 전송하려는 데이터의 형식과 구조를 정의. 데이터를 어떻게 표현하고 어떤 규칙으로 메시지를 보낼지 결정한다.
- 의미(Semantics) : 어떤 의미를 가지고 동작을 수행할 지를 정의. 데이터 처리 방법과 에러 제어 방법에 대한 정보를 포함한다.
- 시간(Timing) : 데이터 전송 시간과 관련된 규칙을 정의. 데이터 전송의 시작과 종료 시점, 속도 및 순서를 포함한다.
=> 어떤 데이터를 어떤 순서와 속도로 보낼지, 오류가 발생했을 때 어떻게 대처할지를 포함한다.
2. TCP & UDP

TCP와 UDP 모두 전송 계층(Transport Layer)에서 사용되는 프로토콜이다. 전송계층은 네트워크에서 송수신자(장치) 간의 통신을 제어하는 계층이며, IP에 의해 전달되는 패킷의 오류를 검사하고 재전송 요구 등의 데이터에 대한 제어를 담당한다.
TCP (Transmission Control Protocol, 전송 제어 프로토콜)
TCP는 네트워크에서 데이터를 안정적으로 전송하기 위한 연결 지향적인 프로토콜이다. 수신자와 발신자 간의 연결을 설정하고 이를 유지해 데이터가 온전히 도착하도록 신뢰성을 보장한다.
TCP는 보통 파일 전송, 이메일, 웹 브라우징 등에서 사용된다.
(HTTP/1.1
및 HTTP/2
는 TCP를 사용했지만, HTTP/3
는 UDP를 기반으로 하는 QUIC프로토콜을 기본으로 사용한다)
일반적으로 TCP와 IP를 함께 사용해 데이터를 안정적으로 전송할 수 있도록 하는데, IP는 효율적인 방법으로 최종 목적지로 전송하는 것을 담당하고, TCP는 신뢰성 있고 무경설을 보장하는 연결을 통해 데이터를 안전하게 전송하는 것을 담당한다.


TCP 특징
- 연결 지향 방식
- *흐름 제어 및 혼잡 제어
- 신뢰성 보장
TCP는 통신을 시작할 때와 종료할 때 각각 3-way handshake, 4-way handshake을 통해 서로 준비가 되었는지 확인하고, *패킷의 전송 순서를 정하고 나서야 실제 통신을 시작한다. 따라서 데이터 전송의 신뢰성을 보장(흐름 제어, 혼잡 제어, 오류 제어)한다. 손실된 데이터가 있다면 재전송하는 기능도 한다.
*패킷(Packet)?
데이터 통신에서 전송되는 기본적인 단위. 네트워크에서 효율적인 통신을 위해 데이터를 작은 조각으로 나누는데, 이 조각을 패킷이라고 한다.
*흐름제어(Flow Control), 혼잡제어(Congestion Control)?
흐름제어는 송수신자 간의 데이터 흐름을 조절해 수신자가 처리할 수 있는 속도로 데이터를 전송하도록 하는 것이고
혼잡제어는 많은 사람이 사용하는 네트워크에서 혼잡을 방지하기 위해 송신자가 보내는 데이터의 전송속도를 강제로 줄여 대처하는 것을 말한다.
-> 흐름제어가 송수신자 간의 전송속도를 조절한다면, 혼잡제어는 호스트와 라우터를 포함한 더 넓은 범위에서 전송 문제를 해결한다.
UDP (User Datagram Protocol, 사용자 데이터그램 프로토콜)
UDP도 네트워크에서 데이터를 전송하기 위해 사용하는 프로토콜이다. TCP와는 달리 비연결형 프로토콜이며, 패킷 교환 시 *데이터그램 방식을 사용한다. 각각의 패킷은 독립적인 관계를 가지고 다른 경로로 전송되고 처리된다. 따라서 신속한 데이터 전송이 중요한 상황에서 사용된다.


UDP 특징
- 비연결성
- 신속성
- 신뢰성 보장 X
TCP와 달리 연결을 설정하고 해제하는 과정이 존재하지 않으며, 일부 패킷 손실이 허용되는 환경에서 데이터를 신속하게 전송하기 위해 사용한다. 신뢰성을 보장하지 않기 때문에 TCP보다 속도가 빠르며 네트워크 부하가 적다.
UDP는 보통 실시간 영상 스트리밍이나, 음성 통화에서 사용된다.
*데이터그램 방식?

네트워크에서 데이터를 작은 단위인 패킷(Packet)으로 나누어 전송하고, 도착지에서 재조립되는 방식을 패킷 교환 방식
이라고 한다. 패킷 교환 방식에는 데이터그램 방식과 가상회선 방식이 있는데, 그 중 데이터그램 방식
은 나누어진 패킷들이 각각 다른 경로를 통해 개별적으로 이동하면서 도착지에 도달하여 재조립되는 방식이고, 가상회선 방식
은 패킷이 미리 정의된 경로를 통해 순차적으로 전송되는 방식이다.
TCP & UDP 비교
두 프로토콜의 차이를 정리해보면 다음과 같다

프로토콜 | TCP | UDP |
연결 방식 | 연결형 | 비연결형 |
패킷 교환 방식 | 가상회선 방식 | 데이터그램 방식 |
전송 순서 | 보장 | 보장 X |
수신 여부 확인 | 확인 | 확인 X |
통신 방식 | 1:1 통신 | 1:1 / 1:N / N:M 통신 |
신뢰성 | 높다 | 낮다 |
속도 | 빠르다 | 느리다 |
3. TCP 3, 4 way handshake
앞서 TCP는 통신을 시작할 때와 종료할 때 서로 준비가 되어있는지를 미리 확인하고 패킷의 전송 순서를 정하고 나서야 본격적인 통신을 하고 통신을 종료한다고 했는데, 이 과정을 핸드쉐이킹(handshaking)이라고 한다. 통신을 시작할 때는 3-way handshake, 통신을 종료할 때는 4-way handshake를 한다.
handshake 과정에서는 SYN, ACK, FIN 이라는 패킷을 주고 받는데 이는 TCP Header의 특정 비트로 표현된다.

- SYN (Synchronize) : 연결 설정을 위해 사용되는 제어 비트. 클라이언트가 서버에 연결을 요청할 때 사용
- ACK (Acknowledgement) : 패킷 수신을 확인하는데 사용되는 제어 비트. 데이터를 제대로 받았음을 송신자에게 알려준다.
- FIN (Finish) : 연결 종료를 위해 사용되는 제어 비트. 연결을 종료하고자 할 때 사용
통신 시작 (3-way handshake)

- 클라이언트는 서버에게 접속을 요청하는 SYN을 보낸다.
- SYN 플래그에 클라이언트의 ISN을 담는다.
- 클라이언트는 SYN을 보내고 서버의 응답을 기다리기 위해 SYN_SENT 상태로 변경된다.
- 서버는 클라인터에게 접속 요청을 수락하는 SYN + ACK을 보낸다.
- SYN 플래그에 클라이언트의 ISN+1 값, ACK 플래그에 서버의 ISN을 담는다.
- 서버는 Listen 상태에서 SYN이 들어온 것을 확인하고 SYN_RECV상태로 바뀌어 SYN + ACK을 클라이언트에게 보낸다.
- 클라이언트는 다시 서버에게 ACK을 보내고, 이 후 데이터 통신이 가능하게 된다.
- ACK 플래그에 서버의 ISN+1 값을 담는다.
- SYN + ACK 상태를 확인한 클라이언트는 서버에게 ACK을 보내고 연결이 성립된다. (Established)
통신 종료 (4-way handshake)

- TCP 연결이 되어있는 상태에서 클라이언트가 연결을 종료하겠다는 FIN을 보낸다.
- 클라이언트는 접속을 끊기 위해 먼저 CLOSE() 함수를 호출한다.
그 후 서버에게 FIN을 보내고 응답을 기다리기 위해 FIN-WAIT-1 상태로 변경된다.
- 클라이언트는 접속을 끊기 위해 먼저 CLOSE() 함수를 호출한다.
- 서버는 클라이언트에게 ACK를 보낸다.
- 서버는 클라이언트의 종료 요청을 확인하는 ACK을 보내고 CLOSE_WAIT 상태로 변경된다.
ACK을 받은 클라이언트도 서버의 연결 종료를 기다리기 위해 FIN_WAIT2 상태로 변경된다.
- 서버는 클라이언트의 종료 요청을 확인하는 ACK을 보내고 CLOSE_WAIT 상태로 변경된다.
- 종료 준비가 끝난 서버도 클라이언트에게 FIN을 보낸다.
- 클라이언트는 서버가 연결을 닫았다는 신호를 수신하면 ACK을 보낸다.
- 클라이언트는 ACK를 보낸후 TIME_WAIT 상태로 변경된다.
이 후 모든 준비가 끝나면 CLOSED 상태로 변환된다.
- 클라이언트는 ACK를 보낸후 TIME_WAIT 상태로 변경된다.
Q. (4)에서 클라이언트는 ACK을 보낸 후 바로 연결을 닫지 않고, 일정 시작 뒤에 닫는 이유는 뭘까?
지연 패킷이 발생한 경우를 대비하기 위해서이다. 패킷이 뒤늦게 도착해 이를 처리하지 못한다면 데이터 무결성 문제가 발생하기 때문에 클라이언트는 FIN을 받고도 TIME_WAIT를 통해 혹시 모를 패킷 수신을 기다린다.
참고자료 😃
https://mangkyu.tistory.com/15
https://better-together.tistory.com/140
https://daengsik.tistory.com/30
https://jeongkyun-it.tistory.com/180
https://evan-moon.github.io/2019/11/17/tcp-handshake/
'Network' 카테고리의 다른 글
[Network] HTTP & HTTPS 개념 및 동작방식 (0) | 2024.03.10 |
---|---|
[Network] 웹 통신 흐름 (0) | 2024.03.10 |
네트워크 통신에 사용되는 프로토콜 TCP와 UDP에 대해 알아보자 ❕
1. 프로토콜 (Protocol)
통신 규약. 네트워크에서 서로 다른 장치들 간의 원활한 통신을 위해 정의된 규칙이다. 사람과 사람이 의사소통을 할 때도 서로 이해할 수 있는 언어를 사용해야 하듯이, 컴퓨터와 같은 장치들도 서로 이해할 수 있는 언어를 사용해야 서로 통신이 가능하다. 이를 위한 규칙을 프로토콜이라고 한다.
프로토콜의 종류로는 HTTP, TCP, UDP, IP, SMTP 등이 있다.
프로토콜의 기본 요소
- 구문(Syntax) : 전송하려는 데이터의 형식과 구조를 정의. 데이터를 어떻게 표현하고 어떤 규칙으로 메시지를 보낼지 결정한다.
- 의미(Semantics) : 어떤 의미를 가지고 동작을 수행할 지를 정의. 데이터 처리 방법과 에러 제어 방법에 대한 정보를 포함한다.
- 시간(Timing) : 데이터 전송 시간과 관련된 규칙을 정의. 데이터 전송의 시작과 종료 시점, 속도 및 순서를 포함한다.
=> 어떤 데이터를 어떤 순서와 속도로 보낼지, 오류가 발생했을 때 어떻게 대처할지를 포함한다.
2. TCP & UDP

TCP와 UDP 모두 전송 계층(Transport Layer)에서 사용되는 프로토콜이다. 전송계층은 네트워크에서 송수신자(장치) 간의 통신을 제어하는 계층이며, IP에 의해 전달되는 패킷의 오류를 검사하고 재전송 요구 등의 데이터에 대한 제어를 담당한다.
TCP (Transmission Control Protocol, 전송 제어 프로토콜)
TCP는 네트워크에서 데이터를 안정적으로 전송하기 위한 연결 지향적인 프로토콜이다. 수신자와 발신자 간의 연결을 설정하고 이를 유지해 데이터가 온전히 도착하도록 신뢰성을 보장한다.
TCP는 보통 파일 전송, 이메일, 웹 브라우징 등에서 사용된다.
(HTTP/1.1
및 HTTP/2
는 TCP를 사용했지만, HTTP/3
는 UDP를 기반으로 하는 QUIC프로토콜을 기본으로 사용한다)
일반적으로 TCP와 IP를 함께 사용해 데이터를 안정적으로 전송할 수 있도록 하는데, IP는 효율적인 방법으로 최종 목적지로 전송하는 것을 담당하고, TCP는 신뢰성 있고 무경설을 보장하는 연결을 통해 데이터를 안전하게 전송하는 것을 담당한다.


TCP 특징
- 연결 지향 방식
- *흐름 제어 및 혼잡 제어
- 신뢰성 보장
TCP는 통신을 시작할 때와 종료할 때 각각 3-way handshake, 4-way handshake을 통해 서로 준비가 되었는지 확인하고, *패킷의 전송 순서를 정하고 나서야 실제 통신을 시작한다. 따라서 데이터 전송의 신뢰성을 보장(흐름 제어, 혼잡 제어, 오류 제어)한다. 손실된 데이터가 있다면 재전송하는 기능도 한다.
*패킷(Packet)?
데이터 통신에서 전송되는 기본적인 단위. 네트워크에서 효율적인 통신을 위해 데이터를 작은 조각으로 나누는데, 이 조각을 패킷이라고 한다.
*흐름제어(Flow Control), 혼잡제어(Congestion Control)?
흐름제어는 송수신자 간의 데이터 흐름을 조절해 수신자가 처리할 수 있는 속도로 데이터를 전송하도록 하는 것이고
혼잡제어는 많은 사람이 사용하는 네트워크에서 혼잡을 방지하기 위해 송신자가 보내는 데이터의 전송속도를 강제로 줄여 대처하는 것을 말한다.
-> 흐름제어가 송수신자 간의 전송속도를 조절한다면, 혼잡제어는 호스트와 라우터를 포함한 더 넓은 범위에서 전송 문제를 해결한다.
UDP (User Datagram Protocol, 사용자 데이터그램 프로토콜)
UDP도 네트워크에서 데이터를 전송하기 위해 사용하는 프로토콜이다. TCP와는 달리 비연결형 프로토콜이며, 패킷 교환 시 *데이터그램 방식을 사용한다. 각각의 패킷은 독립적인 관계를 가지고 다른 경로로 전송되고 처리된다. 따라서 신속한 데이터 전송이 중요한 상황에서 사용된다.


UDP 특징
- 비연결성
- 신속성
- 신뢰성 보장 X
TCP와 달리 연결을 설정하고 해제하는 과정이 존재하지 않으며, 일부 패킷 손실이 허용되는 환경에서 데이터를 신속하게 전송하기 위해 사용한다. 신뢰성을 보장하지 않기 때문에 TCP보다 속도가 빠르며 네트워크 부하가 적다.
UDP는 보통 실시간 영상 스트리밍이나, 음성 통화에서 사용된다.
*데이터그램 방식?

네트워크에서 데이터를 작은 단위인 패킷(Packet)으로 나누어 전송하고, 도착지에서 재조립되는 방식을 패킷 교환 방식
이라고 한다. 패킷 교환 방식에는 데이터그램 방식과 가상회선 방식이 있는데, 그 중 데이터그램 방식
은 나누어진 패킷들이 각각 다른 경로를 통해 개별적으로 이동하면서 도착지에 도달하여 재조립되는 방식이고, 가상회선 방식
은 패킷이 미리 정의된 경로를 통해 순차적으로 전송되는 방식이다.
TCP & UDP 비교
두 프로토콜의 차이를 정리해보면 다음과 같다

프로토콜 | TCP | UDP |
연결 방식 | 연결형 | 비연결형 |
패킷 교환 방식 | 가상회선 방식 | 데이터그램 방식 |
전송 순서 | 보장 | 보장 X |
수신 여부 확인 | 확인 | 확인 X |
통신 방식 | 1:1 통신 | 1:1 / 1:N / N:M 통신 |
신뢰성 | 높다 | 낮다 |
속도 | 빠르다 | 느리다 |
3. TCP 3, 4 way handshake
앞서 TCP는 통신을 시작할 때와 종료할 때 서로 준비가 되어있는지를 미리 확인하고 패킷의 전송 순서를 정하고 나서야 본격적인 통신을 하고 통신을 종료한다고 했는데, 이 과정을 핸드쉐이킹(handshaking)이라고 한다. 통신을 시작할 때는 3-way handshake, 통신을 종료할 때는 4-way handshake를 한다.
handshake 과정에서는 SYN, ACK, FIN 이라는 패킷을 주고 받는데 이는 TCP Header의 특정 비트로 표현된다.

- SYN (Synchronize) : 연결 설정을 위해 사용되는 제어 비트. 클라이언트가 서버에 연결을 요청할 때 사용
- ACK (Acknowledgement) : 패킷 수신을 확인하는데 사용되는 제어 비트. 데이터를 제대로 받았음을 송신자에게 알려준다.
- FIN (Finish) : 연결 종료를 위해 사용되는 제어 비트. 연결을 종료하고자 할 때 사용
통신 시작 (3-way handshake)

- 클라이언트는 서버에게 접속을 요청하는 SYN을 보낸다.
- SYN 플래그에 클라이언트의 ISN을 담는다.
- 클라이언트는 SYN을 보내고 서버의 응답을 기다리기 위해 SYN_SENT 상태로 변경된다.
- 서버는 클라인터에게 접속 요청을 수락하는 SYN + ACK을 보낸다.
- SYN 플래그에 클라이언트의 ISN+1 값, ACK 플래그에 서버의 ISN을 담는다.
- 서버는 Listen 상태에서 SYN이 들어온 것을 확인하고 SYN_RECV상태로 바뀌어 SYN + ACK을 클라이언트에게 보낸다.
- 클라이언트는 다시 서버에게 ACK을 보내고, 이 후 데이터 통신이 가능하게 된다.
- ACK 플래그에 서버의 ISN+1 값을 담는다.
- SYN + ACK 상태를 확인한 클라이언트는 서버에게 ACK을 보내고 연결이 성립된다. (Established)
통신 종료 (4-way handshake)

- TCP 연결이 되어있는 상태에서 클라이언트가 연결을 종료하겠다는 FIN을 보낸다.
- 클라이언트는 접속을 끊기 위해 먼저 CLOSE() 함수를 호출한다.
그 후 서버에게 FIN을 보내고 응답을 기다리기 위해 FIN-WAIT-1 상태로 변경된다.
- 클라이언트는 접속을 끊기 위해 먼저 CLOSE() 함수를 호출한다.
- 서버는 클라이언트에게 ACK를 보낸다.
- 서버는 클라이언트의 종료 요청을 확인하는 ACK을 보내고 CLOSE_WAIT 상태로 변경된다.
ACK을 받은 클라이언트도 서버의 연결 종료를 기다리기 위해 FIN_WAIT2 상태로 변경된다.
- 서버는 클라이언트의 종료 요청을 확인하는 ACK을 보내고 CLOSE_WAIT 상태로 변경된다.
- 종료 준비가 끝난 서버도 클라이언트에게 FIN을 보낸다.
- 클라이언트는 서버가 연결을 닫았다는 신호를 수신하면 ACK을 보낸다.
- 클라이언트는 ACK를 보낸후 TIME_WAIT 상태로 변경된다.
이 후 모든 준비가 끝나면 CLOSED 상태로 변환된다.
- 클라이언트는 ACK를 보낸후 TIME_WAIT 상태로 변경된다.
Q. (4)에서 클라이언트는 ACK을 보낸 후 바로 연결을 닫지 않고, 일정 시작 뒤에 닫는 이유는 뭘까?
지연 패킷이 발생한 경우를 대비하기 위해서이다. 패킷이 뒤늦게 도착해 이를 처리하지 못한다면 데이터 무결성 문제가 발생하기 때문에 클라이언트는 FIN을 받고도 TIME_WAIT를 통해 혹시 모를 패킷 수신을 기다린다.
참고자료 😃
https://mangkyu.tistory.com/15
https://better-together.tistory.com/140
https://daengsik.tistory.com/30
https://jeongkyun-it.tistory.com/180
https://evan-moon.github.io/2019/11/17/tcp-handshake/
'Network' 카테고리의 다른 글
[Network] HTTP & HTTPS 개념 및 동작방식 (0) | 2024.03.10 |
---|---|
[Network] 웹 통신 흐름 (0) | 2024.03.10 |