안녕하세요, 오늘은 네트워크의 기본 중 하나인 TCP와 관련된 개념에 대해 배워보겠습니다. 이 글을 통해 TCP의 작동 방식과 특징을 이해할 수 있게 될 것입니다 UDP 편은 다음 포스트를 참조해주세요!
TCP와 UDP의 역할
목적지 단말안에서 동작하는 여러 애플리케이션 프로세스 중 통해해야 할 목적지 프로세스를 정확히 찾아가고 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 잘 만들어내기 위한 역할을 합니다.
4계층 프로토콜과 서비스 포트
- 인캡슐레이션과 디캡슐레이션에서 다루었던 것처럼 데이터를 보내고 받는 인캡슐레이션, 디캡슐레이션 과정에 각 계층에서 정의하는 헤더가 추가되고 여러 가지 정보가 들어갑니다. 다양한 정보중 가장 중요한 두가지 정보는
- 각 계층에서 정의하는 정보
- 상위 프로토콜 지시자 정보
- 송신측에서 추가한 2계층 헤더 MAC 주소 정보는 수신 측의 2계층에서 확인하고 사용됩니다. 마찬가지로 송신 측에서 추가한 3계층 IP 주소는 수신 측 3 계층에서 사용합니다. 4계층에서는 이런 정보로 시번스 번호, ACK 번호가 있습니다.
- 상위 프로토콜 지시자는 디캡슐레이션 과정에서 상위 계층의 프로토콜이나 프로세스를 정확히 찾아가기 위한 목적으로 사용됩니다. 2계층은 이더 탑입, 3계층은 프로토콜 번호, 4계층은 포트 번호가 상위 프로토콜 지시자입니다.
- 3계층의 프로토콜 번호나 2계층의 이더 타입과 같은 상위 프로토콜 지시자는 출발지와 도착지를 구분해 사용하지 않고 한 개만 사용하지만 4계층 프로토콜 지시자인 포트 번호는 출발지와 목적지를 구분해 처리해야합니다.
- 예를 들어, 우리가 웹 브라우저를 사용하여 인터넷에서 웹 페이지를 요청한다고 가정해봅시다. 이 때 사용되는 프로토콜은 HTTP입니다. HTTP는 4계층 프로토콜로, TCP/IP 위에서 동작합니다.
- 우리의 컴퓨터(출발지)가 서버(목적지)로 HTTP 요청을 보낼 때, 이 요청은 TCP/IP 패킷에 포함됩니다. 이 패킷의 3계층에서는 IP 주소가 사용되며, 2계층에서는 MAC 주소가 사용됩니다. 이러한 정보들은 출발지와 목적지 사이의 통신에서 항상 동일하게 유지됩니다.
- 하지만 HTTP 요청에는 포트 번호도 있습니다. 예를 들어, 출발지 컴퓨터는 포트 12345를 사용하여 요청을 보내고, 서버는 포트 80에서 이를 수신할 수 있습니다. 이 포트 번호는 출발지와 목적지 사이의 통신을 식별하는 데 사용됩니다.
- 이렇게, 프로토콜 인디케이터들 중에서 3계층 프로토콜 번호와 2계층 이더 유형은 출발지와 목적지 간의 통신에서 항상 같은 값으로 유지되지만, 4계층의 포트 번호는 출발지와 목적지 사이의 통신을 구별하기 위해 각각 다르게 처리됩니다.
TCP
- TCP 프로토콜은 신뢰할 수 없는 공용망에서도 정보유실 없는 통신을 보장하기 위해 세션을 안전하게 연결하고 데이터를 분할하고 분할된 패킷이 잘 전송되었는지 확인하는 기능이 있습니다.
- 패킷에 번호를 부여하고 잘 전송되었는지에 대해 응답합니다.
- TCP의 여러 역할 덕분에 네트워크 상태를 심각하게 고려하지 않고 특별한 개발 없이도 쉽고 안전하게 네트워크를 사용할 수 있습니다.
TCP의 특징
- 연결형 서비스로 가상 회선 방식을 제공합니다.
- 3-wayhandshake를 통해 연결한다.
- 4-wayhamdshake를 통해 해제한다.
- 흐름 제어(Flow control)
- 네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지
- 혼잡 제어
- 네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지
- 높은 신뢰성을 보장
- 신뢰성이 높은 전송을 하기 때문에 UDP보다 속도가 느림
- 전이중(Full-Duplex), 점대점(Point to Point) 방식
- 전이중(Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있다.
- 점대점(Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있다.
윈도 사이즈와 슬라이딩 윈도
- TCP는 일방적으로 패킷을 보내는 것이 아니라 상대방이 얼마나 잘 받았는지 확인하기 위해 ACK 번호를 확인하고 다음 패킷을 전송합니다.
- 패킷이 잘 전송되었는지 확인하기 위해 별도 패킷을 받는 것 자체가 통신 시간을 늘리지만 송신자와 수신자가 먼 거리에 떨어져 있으면 왕복 지연시간이 늘어나므로 응답을 기다리는 시간이 더 길어집니다. 그래서 데이터를 보낼 때 패킷을 하나만 보내는 것이 아니라 많은 패킷을 한꺼번에 보내고 응답을 하나만 받습니다.
- 가능하면 최대한 많은 패킷을 한꺼번에 보내는 것이 효율적이지만 네트워크 상태가 안좋으면 패킷 유실 가능성이 커지므로 적절한 송신량을 결졍해야하는데 한번에 데이터를 받을 수 있는 데이터 크기를 윈도 사이즈라 합니다.
- 네트워크 상황에 따라 이 윈도 사이즈를 조절하는 것을 슬라이딩 윈도라고 합니다
- TCP 헤더에서 윈도 사이즈로 표현할 수 있는 최대 크기는 2의 16승 입니다. 실제로 64KB만큼 사이즈를 가질 수 있지만 이 사이즈는 회선의 안정성이 높아지고 고속화되는 현대 네트워크에서는 너무 작은 숫자입니다.
3-Wayhandshake (TCP 연결 과정)
제어 플래그
SYN
- 두 장치 간의 TCP 연결을 시작하는 데 사용됩니다. 클라이언트가 서버와의 통신을 시작하려고 하면 SYN 플래그 세트와 순서 번호가 포함된 TCP 패킷을 보냅니다. 이는 연결의 시작을 나타내며 클라이언트와 서버 간의 시퀀스 번호를 동기화합니다.
SYN + ACK
- 이에 대한 응답으로 서버는 SYN 및 ACK 플래그가 모두 설정된 패킷을 다시 전송하여 SYN을 승인합니다. ACK 플래그는 클라이언트의 SYN 수신을 확인하고, SYN 플래그는 자체 시퀀스 번호를 제공하여 연결을 설정하려는 서버의 의도를 나타냅니다.
ACK
- 패킷에 순서를 부여하는 것을 시퀀스 번호, 응답 번호를 부여하는 것을 ACK 번호라고 부릅니다.
연결 과정
- Client 측에서 Server로 SYN을 보내고 SYN-SENT 상태로 변경.
- Server 측에서 Client가 보낸 SYN 를 인식하고 ACK 제공.
- Client 측에서 Server가 보낸 SYN + ACK를 인식하고 ACK를 제공 후 ESTABLISHED 상태로 변경.
- Server 측에서 Client가 보낸 ACK를 인식하여 ESTABLISHED 상태로 변경.
4-Wayhandshake (TCP 연결 해제 과정)
제어 플래그
FIN
- TCP 연결을 안전하고 안정적으로 종료하는 데 매우 중요하며, 연결이 닫히기 전에 양측이 데이터 교환을 완료했는지 확인합니다.
ACK
- 패킷에 순서를 부여하는 것을 시퀀스 번호, 응답 번호를 부여하는 것을 ACK 번호라고 부릅니다.
연결 과정
- 해당 Client 측에서 연결 해제 신호 FIN을 보낸다. 그 후 Client 측은 FIN-WAIT-1 상태로 변경된다.
- Server 측에서 FIN 신호를 확인하고해당 Client 측으로 ACK 신호를 보내고 동시에 close 요청을 한다. 그리고 CLOSE-WAIT 상태가 된다
- 해당 Server가 ACK를 보내 Client 측에서 확인하여 FIN-WAIT-2 상태로 변경된다.
- 해당 FIN Close 요청을 받은 Server는 애플리케이션 종료 프로세스를 진행하고 해당 클라이언트 측으로 FIN 신호를 보내 Server 측도 끊는다고 신호를 보낸다. 그 후 LAST-ACK 상태로 변경된다.
- FIN을 받은 Client는 신호를 확인했다는 ACK 신호를 Server에게 보내고 TIME-WAIT 상태로 변경된다.
- 일정 시간이 지나면 CLOSE 상태로 변경된다.
TCP 연결 과정 상태
상태 | 설명 |
CLOSED | TCP 연결의 초기 상태로 현재 활성화된 연결이 없음을 나타냅니다. |
LISTEN | TCP 서버가 들어오는 연결을 받아들일 준비가 되었음을 나타내기 위해 사용됩니다. |
SYN-SENT | 클라이언트는 SYN(동기화) 패킷을 전송했으며 서버로부터 해당 SYN-ACK(동기화 승인)를 기다리고 있습니다. |
SYN-RECEIVED | 서버는 SYN 패킷을 수신하고 SYN-ACK 패킷을 클라이언트로 다시 보냈습니다. |
ESTABLISHED | 클라이언트와 서버 모두 3방향 핸드셰이크(SYN, SYN-ACK, ACK)를 성공적으로 완료하고 연결이 설정되었습니다. |
FIN-WAIT-1 | 연결의 한 쪽에서는 FIN(완료) 패킷을 보내 연결을 종료하고 FIN 패킷에 대한 ACK(승인) 또는 다른 쪽의 FIN을 기다리고 있음을 나타냅니다. |
FIN-WAIT-2 | FIN을 시작한 쪽은 FIN에 대한 ACK를 받았고 이제 상대방의 FIN을 기다리고 있습니다. |
CLOSE-WAI | 연결이 상대방으로부터 FIN을 받고 ACK를 보냈으나 아직 자신의 FIN을 보내지 않았습니다. |
TIME-WAIT | 연결을 닫고 최종 ACK를 보낸 쪽은 상대방이 ACK를 받았는지 확인하기 위해 기다리고 있습니다. |
LAST-ACK | FIN을 보내고 ACK를 받은 측은 이제 자신의 FIN에 대한 최종 ACK를 기다리고 있습니다. |
Reference
[1] 고재성, 이상훈. "IT 엔지니어를 위한 네트워크 입문." 길벗, 2022.
'네트워크' 카테고리의 다른 글
VPN(Virtual Private Network)이란? (1) | 2024.09.13 |
---|---|
NAT(Network Address Translation)란? (2) | 2024.09.10 |
TCP와 UDP개념정리 (UDP 편) (0) | 2024.08.28 |
IP주소 구조와 네트워크 기본 개념 정리 (0) | 2024.08.06 |
네트워크 계층 이해하기: OSI 7계층 모델 (0) | 2024.06.29 |