TCP(Transmission Control Protocol) - 전송 제어 프로토콜
TCP는 애플리케이션 사이에서 안전하고 안정적으로 데이터를 통신할 수 있도록 하는 프로토콜(규약)이다.
IP 규칙만으로는 해결할 수 없던 문제들,
예를 들어 데이터 유실이나 패킷 순서가 이상하다거나, 늦게 전달되는 등의 문제들을 해소한다.
인터넷 통신을 택배 수하물로 비유하자면,
IP는 단순 배달 주소지, TCP는 이 주소로 문제없이 택배가 발송될 수 있도록 여러 부가 정보들이 담긴 택배 스티커라고 할 수 있겠다.
TCP 세그먼트
네트워크에서 데이터는 통째로 전달되지 않는다. 작은 조각들로 잘게 쪼개어 전달한 후, 나중에 순서대로 합치는 방식이다.
TCP 통신도 마찬가지다.
TCP를 통해 통신하는 과정은 다음과 같다.
1. 데이터 스트림에서 받은 데이터를 일정 단위로 분할한다.
2. 분할된 데이터 단위에 TCP 헤더를 붙여 TCP 세그먼트를 생성한다.
3. TCP 세그먼트를 IP 데이터그램으로 변환한다. IP 데이터그램은 인터넷 통신에 사용되는 데이터 패킷이다.
4. IP 데이터그램을 수신 애플리케이션에 보낸다.
TCP 세그먼트는 헤더와 데이터필드로 나뉜다.
주요 헤더를 살펴보자.
- Source Port: 데이터를 송신하는 애플리케이션의 포트 번호
- Destination Port: 데이터를 수신하는 애플리케이션의 포트 번호
- Sequence Number(SYN): 분할된 데이터의 순서 (앞서 데이터를 일정단위로 분할해 보낸다고 했다)
- Acknowledge Number(ACK): 데이터를 수신하는 애플리케이션의 입장에서, 다음에 받을 TCP 세그먼트의 Sequence Number (받았던 데이터 세그먼트의 Sequence Number에서 +1한 값이다)
신뢰성 있는 통신 관리
TCP 통신은 데이터를 주고받기 전, 목적지가 데이터를 받을 준비가 되었는지 확인한다.
종료 또한 상대의 종료 준비를 확인한다.
덕분에 굉장히 안전한 데이터 통신이 가능하다.
1. 데이터 통신 전: 3-way-handshake
- SYN: 클라이언트가 서버에세 SYN(synchronize) 플래그가 설정된 메세지를 보낸다. 이때 SYN은 클라이언트의 임의 시퀀스 번호 A를 포함한다.
- SYN-ACK: 서버는 클라이언트의 SYN에 응답해 SYN-ACK 메시지를 보낸다. 서버는 새로운 시퀀스 번호 B를 포함한 SYN(Synchronize) 플래그를 전송하고, 클라이언트의 시퀀스 번호 A에 1을 더한 ACK(acknowledgement) 플래그를 함께 보낸다(A+1)
- ACK: 클라이언트는 서버로부터 받은 SYN에 대해 ACK 메세지를 전송한다. 이때 ACK는 서버의 시퀀스 번호 B에 1을 더한 값(B+1)을 포함한다.
그러니까 데이터 통신 이전에 안전한지 돌다리 두드려보는 느낌이라고 생각하면 되겠다.
TCP 용어에서 SYN은 두 가지 맥락에서 쓰인다.
1. TCP 세그먼트의 Sequence Number
- 헤더에 있는 32비트 숫자필드
- 보내는 바이트 스트림에서 “이 세그먼트의 첫 번째 바이트 번호가 몇 번인지”를 나타낸다.
- 예: Seq=1000 이라면 이 세그먼트의 데이터 부분은 1000번 바이트부터 시작.
2. TCP 세그먼트의 SYN 플래그(Synchronize)
- TCP 헤더에 있는 제어 플래그 비트(1비트) 중 하나
- “연결을 맺자, 그리고 내가 정한 시퀀스 번호를 처음으로 동기화하자”라는 의미를 가짐
- 이 플래그가 세트된 세그먼트에는 반드시 시퀀스 번호가 들어 있음 (보통 랜덤한 초기 값)
- handshake 과정에서만 쓰임.
ACK도 마찬가지로 ACK 플래그와 Ackowledge number로 두 가지 맥락에서 쓰인다.
핸드셰이크 과정에서 클라이언트와 서버는 시퀀스 번호를 설정하고, 윈도우 크기를 협상해 데이터 흐름을 제어하기 때문에 신뢰성 있는 데이터 전송이 가능해요. 또, 패킷 손실이 발생해도 재전송 메커니즘을 통해 데이터를 정확하게 전달할 수 있어요.
2. 데이터 통신
- 클라이언트가 서버에게 데이터를 보낸다.
- 서버는 잘 전송받았다는 의미에서 세그먼트에 ACK 플래그를 넣어 응답한다.
- 만약 클라이언트가 서버로부터 ACK를 못받았다면 데이터가 제대로 송/수신되지 못한 것으로 판단하고 데이터를 재전송한다.
- 클라이언트도 서버로부터 데이터를 잘 받았다는 의미에서 세그먼트에 ACK 플래그를 넣어 응답한다.
3. 데이터 통신 종료 시: 4-way-handshake
- 클라이언트가 접속을 끊기 위해 CLOSE() 함수를 호출한다.
- 그러면 서버로 FIN 플래그를 보내게 된다.
- 서버는 이에 응답해 ACK 플래그를 전송한다. 만일 서버에서 클라이언트로 보낼 남은 데이터가 있을 경우 이때 나머지를 모두 전송시킨다.(남은 데이터 전송 유무에 따라 타이밍이 달라져서 보통 분리됨. 하지만 남은 데이터가 없을 땐 FIN+ACK를 합쳐 보낼 수도 있다)
- 서버는 CLOSE() 함수를 호출하고 FIN 플래그를 클라이언트에게 보낸다.
- 클라이언트가 이에 응답해 ACK 플래그를 보낸다.
TCP의 전송 제어 기법
추후 추가 예정
출처
https://docs.tosspayments.com/resources/glossary/tcp
TCP(Transmission Control Protocol) | 토스페이먼츠 개발자센터
TCP(Transmission Control Protocol)는 애플리케이션 사이에서 안전하게 데이터를 통신하는 규약이에요.
docs.tosspayments.com
🌐 아직도 모호한 TCP / UDP 개념 ❓ 쉽게 이해하자
HTTP / IP / TCP / UDP 는 모두 프로토콜 프로토콜은 클라이언트와 서버가 정보를 교환할 수 있도록 하는 메시지 형식 대한 규칙 이라고 보면 된다. 수신 호스트가 전송 받은 메시지를 이해하려면 설
inpa.tistory.com