✅ TCP 프로토콜이란?
TCP(Transmission Control Protocol)는 컴퓨터 네트워크에서 데이터를 안정적으로 전송하기 위한 프로토콜입니다. 안정적으로, 순서대로, 에러없이 데이터를 교환할 수 있습니다.
TCP는 데이터를 나누어 전송하고, 전송된 데이터의 정확성을 보장하기 위한 기능을 제공합니다. 데이터를 전송하기 전에 TCP는 데이터를 세그먼트라고 불리는 작은 조각으로 나눕니다. 각 세그먼트는 목적지 컴퓨터에 도달할 때까지 독립적으로 이동할 수 있습니다.
➡️ TCP는 신뢰성 있는 데이터 전송을 위해 다음과 같은 기능을 제공합니다.
- 연결 설정
TCP는 클라이언트와 서버 간에 연결을 설정합니다. 이를 통해 데이터를 안정적으로 전송할 수 있습니다.
- 순서 보장
TCP는 전송된 데이터의 순서를 보장합니다. 데이터 세그먼트가 목적지에 도착하는 순서와 동일한 순서로 재조립됩니다.
- 오류 제어
TCP는 데이터 전송 중에 발생할 수 있는 오류를 감지하고 복구합니다. 오류 검출 및 재전송 기능을 통해 데이터 손실을 최소화합니다.
- 혼잡 제어
TCP는 네트워크 혼잡을 감지하고 대역폭 사용을 조절하여 네트워크 혼잡을 피합니다.
이러한 기능들을 통해 TCP는 안정적이고 신뢰성 있는 데이터 전송을 가능하게 합니다. 따라서, 인터넷에서 웹 페이지의 로딩, 이메일 전송, 파일 다운로드 등과 같은 다양한 작업에 널리 사용되는 프로토콜입니다.
✅ TCP 프로토콜의 구조
- Window 필드
Window 필드는 16비트 크기로, TCP의 혼잡 제어와 함께 데이터의 흐름 제어를 위해 사용됩니다. 이 필드는 수신자가 전송자에게 알려주는 윈도우 크기로, 수신 측이 현재 처리할 수 있는 데이터의 양을 나타냅니다.
🔹TCP Flags
TCP Flags는 TCP 헤더의 제어 비트 필드로, TCP 세그먼트의 특정 동작을 지정하는 데 사용됩니다. 각각의 Flag는 1비트 크기를 가지며, 설정되거나 해제되어 특정 동작을 나타냅니다.
- URG(Urgent):
URG 플래그는 1로 설정되면 세그먼트에 긴급한 데이터가 포함되어 있음을 나타냅니다. 긴급 데이터는 일반 데이터보다 높은 우선순위로 처리되어야 합니다. URG 플래그는 긴급 포인터 필드와 함께 사용되며, 데이터 전송의 순서나 흐름을 변경할 수 있습니다.
- ACK (Acknowledgment):
ACK 플래그는 1로 설정되면 ACK 번호 필드가 유효함을 나타냅니다. ACK 번호는 수신한 세그먼트의 확인 응답 번호입니다. 이 플래그를 설정함으로써 데이터 전송의 확인 응답을 보낼 수 있습니다.
- PSH (Push):
PSH 플래그는 1로 설정되면 수신자에게 버퍼링하지 말고 수신한 데이터를 즉시 상위 계층으로 전달해야 함을 나타냅니다. 이 플래그는 데이터의 실시간 전달을 위해 사용됩니다.
- RST (Reset):
RST 플래그는 1로 설정되면 연결 초기화를 나타냅니다. 이 플래그는 오류가 발생했거나 연결을 강제로 닫아야 할 때 사용됩니다. RST 플래그를 설정하면 현재의 연결이 완전히 닫히고 초기 상태로 되돌아갑니다.
- SYN (Synchronize):
SYN 플래그는 1로 설정되면 연결 설정을 시작하는 요청을 나타냅니다. 이 플래그는 TCP 연결의 초기 단계에서 사용되며, 클라이언트와 서버 간의 핸드쉐이크를 시작하는 데 사용됩니다. S 플래그를 통해서 동기화가 시작됩니다.
- FIN (Finish): FIN 플래그는 1로 설정되면 연결 종료를 나타냅니다. FIN 플래그를 설정하면 현재의 연결이 종료되고 상대방에게 연결 종료를 알리게 됩니다.
✅ TCP를 이용한 통신 과정
🔹연결 수립 과정 -3Way Handshake
TCP를 이용한 데이터 통신을 할 때 프로세스와 프로세스 간의 연결을 위해 가장 먼저 수행되는 과정입니다.
- Step 1: 클라이언트가 서버에게 요청 패킷을 보냄
클라이언트가 서버에 연결 요청을 보냅니다. 이 요청은 SYN (Synchronize) 패킷을 포함하고 있습니다. SYN 패킷에는 클라이언트가 생성한 랜덤한 시퀀스 번호 (sequence number)가 포함되어 있습니다. 이 시퀀스 번호는 데이터 전송 시 패킷의 순서를 관리하는 데 사용됩니다. SYN 패킷을 보내고 난 후, 클라이언트는 SYN_SENT 상태로 전환됩니다.
- Step 2: 서버가 클라이언트의 요청을 받아들이는 패킷을 보냄
서버는 클라이언트의 연결 요청을 받고, 응답으로 SYN-ACK 패킷을 보냅니다. SYN-ACK 패킷에는 서버가 생성한 랜덤한 시퀀스 번호와, 클라이언트의 시퀀스 번호에 1을 더한 ACK 번호가 포함되어 있습니다. SYN-ACK 패킷을 보내고 난 후, 서버는 SYN_RECEIVED 상태로 전환됩니다.
- Step 3: 클라이언트는 이를 최종적으로 수락하는 패킷을 보냄
클라이언트는 서버로부터 받은 SYN-ACK 패킷에 대한 응답으로 ACK (Acknowledgment) 패킷을 보냅니다. 이 ACK 패킷에는 서버의 시퀀스 번호에 1을 더한 번호가 포함되어 있습니다. 이 단계를 거치고 나면 클라이언트와 서버는 연결이 수립된 상태가 되며, 클라이언트는 ESTABLISHED 상태로 전환됩니다. 서버는 ACK 패킷을 받은 후에도 ESTABLISHED 상태로 전환됩니다.
3-way handshake는 클라이언트와 서버 간의 상호 작용을 통해 연결의 신뢰성을 보장합니다. 클라이언트와 서버는 서로의 시퀀스 번호를 교환하고, 상대방의 시퀀스 번호에 대한 확인 응답을 보냄으로써 데이터 전송의 순서와 정확성을 확인할 수 있습니다. 이러한 과정을 통해 양쪽이 서로를 인식하고 연결을 수립하는 것이 가능해집니다.
✅ TCP 상태 전이도
- LISTEN 상태
LISTEN
상태는 서버 소켓이 클라이언트의 연결 요청을 기다리는 상태입니다. 서버 소켓은 지정된 포트에서 클라이언트의 연결을 수신하기 위해LISTEN
상태에 있습니다. 서버 소켓은 클라이언트의 연결 요청을 수신할 준비가 되었으며, 클라이언트의 연결 요청을 처리할 수 있는 상태입니다.
- ESTABLISHED 상태
ESTABLISHED
상태는 클라이언트와 서버 간의 연결이 성립되어 데이터의 교환 및 통신이 가능한 상태입니다. 클라이언트와 서버 간의 3-way handshake 과정이 성공적으로 완료되고, 양쪽에서 데이터 전송이 가능한 상태입니다.ESTABLISHED
상태에서는 양방향으로 데이터를 주고받을 수 있습니다.
➡️ 클라이언트 입장에서 TCP의 상태 변화는 다음과 같습니다.
- 클라이언트가 서버에 연결 요청을 보냅니다. 이 때 클라이언트의 소켓은
SYN_SENT
상태가 됩니다.
- 서버는 클라이언트의 연결 요청을 받아들이고
SYN
패킷을 응답합니다. 이 때 서버의 소켓은SYN_RECEIVED
상태가 됩니다.
- 클라이언트는 서버의 응답을 받고, 다시
ACK
패킷을 서버로 보냅니다. 이로써 클라이언트의 소켓은ESTABLISHED
상태가 됩니다.
- 서버는 클라이언트의
ACK
패킷을 받고ESTABLISHED
상태로 전환됩니다.
- 이후 클라이언트와 서버 간에 데이터를 주고받으면서
ESTABLISHED
상태를 유지합니다.
위의 과정에서 클라이언트의 소켓은 SYN_SENT
→ ESTABLISHED
로 상태가 변화합니다. 서버는 클라이언트의 연결 요청을 받아들여 SYN_RECEIVED
→ ESTABLISHED
로 상태가 변화합니다. 이후에는 양쪽 모두 ESTABLISHED
상태로 유지되며 데이터 통신이 이루어집니다.
✅ 실습
- 실제 시퀀스의 값은 16진수이지만 wireshark가 보기 쉽게 변환해서 알려줌
🏷️이미지 출처 및 참고한 사이트
Uploaded by N2T