TCP(Transmission Control Protocol)
전송 제어 프로토콜(Transmission Control Protocol)은 인터넷 상에서 데이터를 메세지의 형태로 보내기 위해 IP(Internet Protocol Suite)와 함께 사용하는 프로토콜로 주로 서버와 클라이언트 간에 데이터를 신뢰성 있게 전달하기 위해 사용합니다.
일반적으로 TCP와 IP를 함께 사용하는데, IP가 데이터의 배달을 처리한다면 TCP는 패킷을 추적 및 관리하게 됩니다.
일반적으로 TCP와 IP를 함께 사용하는데, IP가 데이터의 배달을 처리한다면 TCP는 패킷을 추적 및 관리하게 됩니다.
TCP 는 OSI 7 Layer 모델 중 전송계층(4 Layer - Transport Layer)에서 사용되는 프로토콜입니다.
전송 계층은 송신자와 수신자를 연결하는 통신서비스를 제공하는 계층으로 데이터의
전달을 담당하며 전달되는 패킷의 오류를 검사하고 재전송 요구 등의 제어를 담당합니다.
전달을 담당하며 전달되는 패킷의 오류를 검사하고 재전송 요구 등의 제어를 담당합니다.
TCP의 특징
- 연결형 서비스로 가상 회선 방식을 제공
- 가상 회선 방식을 제공한다는 것은 발신지와 수신지를 연결하여 패킷을 전송하기 위한 논리적 경로를 배정한다는 말입니다.
- 3-way handshaking 과정을 통해 연결을 설정하고, 4-way handshaking 과정을 통해 연결을 해제합니다.
3-way handshaking 과정은 발신지와 수신지 사이에 논리적인 접속(세션)을 성립하는 과정을 의미합니다.
- 흐름 제어(Flow control)
데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지합니다.
버퍼 오버 플로우는 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점을 의미합니다. - 혼잡 제어(Congestion control)네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지합니다.
- 높은 신뢰성을 보장TCP는 그 특성상 자신이 보낸 데이터에 대해서 상대방이 받았다는 의미의 응답 패킷을
다시 받아야 통신이 정상적으로 이뤄졌다고 생각합니다.
그래서 만약 자신이 보낸 데이터에 대한 응답 패킷을 받지 못하면 패킷이 유실되었다고 판단하고
보냈던 패킷을 다시 한번 보냅니다. 이 과정을 TCP 재전송 이라고 합니다.
TCP 재전송은 보냈던 패킷을 다시한번 보내기 때문에 네트워크 성능에 저하를 가져올 수밖에 없지만,
TCP통신의 특성상 반드시 필요한 과정입니다.
이러한 TCP 재전송은 생각보다 자주 일어날 수 있으며, 이를 대비할 수 있는 예외 처리를 해두는 것이
서비스 품질 유지에 도움이 됩니다. - 전이중(Full-Duplex), 점대점(Point to Point) 방식전이중(Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있습니다.점대점(Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있습니다.
TCP의 구조
- Source Port (16bits) : 출발지 포트 번호
- Destinations Port (16bits) : 목적지 포트 번호
- Sequence Number (32bits) : 송신 데이터 순서 번호
송신 시 전송하는 데이터의 시작 바이트 순번을 담습니다. 바이트 순번은 전송하는 데이터의 바이트 단위로 부여하는 연속된 번호를 의미합니다. - Acknowlegment Number (32bits) : 상대방이 다음에 전송할 순서 번호
수신확인 응답(ACK)와 함께 해당 필드에 상대방이 다음에 전송할 순서 번호를 담아서 보냅니다. - HLEN (4bits) : 헤더의 길이
4bytes 단위로 표시하며 헤더는20bytes와 옵션헤더 최대 40bytes로 구성됩니다. - Reserved (4bits)
미래를 위해 예약된 필드로, 모두 0으로 채워져야 합니다. - Control Flags (6bits)
- URG : 긴급 데이터 설정
- ACK : 수신 확인 응답 설정
- PSH : 송수신 버퍼에 있는 데이터를 즉시 처리
- RST : 연결 중단(강제종료)
- SYN : 연결 설정
- FIN : 연결 종료
- Windows Size (16bits)
수신측에서 송신측에 보내는 Receiver window size로 수신버퍼의 여유 공간 크기를 의미합니다. - Checksum (16bits)
헤더를 포함한 전체 세그먼트에 대한 오류를 검사하기 위한 필드입니다. - Urgent Pointer (16bits)
세그먼트가 긴급 데이터를 포함하고 있는 경우에 사용되는 필드로 긴급 데이터의 위치값을 담고 있습니다.
TCP 통신 과정(연결-전송-종료)
위에서 설명한 특징을 그림으로 더 자세히 살펴보겠습니다.
상태값 설명
상태 | 설 명 |
---|---|
CLOSED | 완전히 연결이 종료된 상태 |
LISTEN | 서버의 데몬이 떠 있어서 클라이언트의 접속 요청을 기다리고 있는 상태(Windows에선 LISTENING) |
SYN_SENT | 클라이언트가 서버에게 연결을 요청한 상태 |
SYN_RECEIVED | 서버가 클라이언트로부터 접속 요구(SYN)을 받아 클라이언트에게 응답(SYN/ACK)을 하였지만, 아직 클라이언트에게 확인 메시지(ACK)는 받지 못한 상태 |
ESTABLISHED | 서버와 클라이언트 간에 세션 연결이 성립되어 통신이 이루어지고 있는 상태(클라이언트가 서버의 SYN을 받아서 세션이 연결된 상태) |
FIN_WAIT1 | 클라이언트가 서버에게 연결을 끊고자 요청하는 상태(FIN을 보낸 상태) |
CLOSE_WAIT | TCP 연결이 상위 응용프로그램 레벨로부터 연결 종료를 기다리는 상태 |
FIN_WAIT2 | 서버가 클라이언트로부터 연결 종료 응답을 기다리는 상태(서버가 클라이언트로부터 최초로 FIN을 받은 후, 클라이언트에게 ACK을 주었을 때) |
LAST_ACK | 호스트가 원격지 호스트의 연결 종료 요구 승인을 기다리는 상태(서버가 클라이언트에게 FIN을 보냈을 때의 상태) |
TIME_WAIT | 연결은 종결되었지만 (분실 되었을지 모를 느린 세그먼트를 위해) 당분간 소켓을 열어 놓은 상태. 기본값은 120(초). Active Close 하는 쪽의 마지막 ACK가 유실되었을 때, Passive Close 하는 쪽은 자신이 보낸 FIN에 대한 응답을 받지 못했으므로 FIN을 재전송함. 이 때 TCP는 connection 정보를 유지하고 있고 ACK를 다시 보낼 수 있음 |
0 댓글