CS/네트워크
TCP/IP (4): TCP - 데이터의 신뢰성을 보장하는 프로토콜
나디아 Nadia
2025. 6. 16. 14:29
TCP (Transmission Control Protocol)
: 데이터의 신뢰성을 보장하는 프로토콜
- 일종의 보험 역할
- ex) 택배 회사가 택배 분실 시 다시 보내주는 정책과 같음
→ 택배 기사가 사고나 다른 문제로 인해 고객에게 택배를 전달하지 못하면 다시 똑같은 물품으로 배송해준다는 정책
→ 이때 택배 기사는 물리 계층, 데이터링크 계층, 네트워크 계층, 트랜스포트 계층을 이용해 사용자의 집에 정확하게 택배를 전달해줌
→ 여기서 택배 기사가 사고가 나서 택배를 전달하지 못하면, 택배 회사는 다시 새로운 택배 기사를 통해 택배를 전달함- 실제로 택배를 전달해주는 것은 택배 기사, 즉 물리 계층, 데이터링크 계층(MAC), 네트워크 계층(IP), 트랜스포트 계층(Port)이지만, 정책적으로 신뢰성을 보장해주는 것은 트랜스포트 계층의 TCP임
개요
- 물리 계층, 데이터링크 계층, 네트워크 계층을 이용하면 원하는 호스트에 정확하게 데이터를 전달할 수 있음
→ 하지만 문제가 발생해서 패킷의 내용이 왜곡되거나 분실되는 상황이 생길 수도 있음
→ 호스트에 제대로 된 데이터가 전달되지 못함
⇒ 이를 보완하기 위해 TCP가 등장
TCP 통신에서 사용하는 핵심 제어 신호
SYN (Synchronize) | 연결 시작 요청 신호 | "통신할래?" |
ACK (Acknowledgment) | 응답 확인 신호 | "응, 잘 받았어!" |
FIN (Finish) | 연결 종료 요청 | "이제 끝내자" |
SEQ (Sequence Number) | 데이터의 순서 번호 | "이 데이터는 몇 번째야" |
3 way handshake
: 통신을 시작하는 3단계 절차
- 사용자와 상대방이 통신을 시작하는 단계로, 데이터를 3번 송수신하면서 통신에 필요한 약속을 하는 것 (= 악수)
사용자와 케이틀린이 TCP 통신을 하려는 상황
- 사용자가 케이틀린에게 SYN(Synchronization) 패킷을 보냄
- 케이틀린은 사용자에게 최대 세그먼트 길이와 ACK(Acknowledgement) 패킷을 보내 통신을 수락함
- 최대 세그먼트 길이를 결정하는 이유
⇒ TCP는 애플리케이션에서 전송하는 데이터를 Segmentation으로 분할해서 전송함- 분할하는 이유
- 너무 큰 데이터가 분실되는 경우 잃어버리는 데이터가 많기 때문
→ 데이터를 분할하면 일부 데이터가 분실되었더라도 그 부분만 다시 보내면 되기 때문에 효율적임 - 데이터링크 계층에서 보낼 수 있는 데이터의 최대 크기가 정해져있기 때문
- 너무 큰 데이터가 분실되는 경우 잃어버리는 데이터가 많기 때문
- ex) 만약 이더넷 프레임의 기본값을 사용한다면 최대 크기는 1,500 바이트임
→ TCP 헤더 20 바이트와 IP 헤더 20바이트를 제외하면 최대 크기는 1460임
- 분할하는 이유
- 최대 세그먼트 길이를 결정하는 이유
- 이렇게 케이틀린이 최대 세그먼트 길이와 함께 응답 메시지를 전송하면 사용자도 응답 메시지를 보냄
⇒ 데이터가 3번 송수신 되면서 악수했기 때문에 3 way handshake라고 부름
TCP의 동작
- TCP는 상대와 통신하기 위해 3 way handshake로 커넥션을 만듦
- 3 way handshake로 커넥션이 확립됐으면 실질적인 데이터를 전송할 수 있음
- 커넥션을 끊을 때는 4 way handshake로 진행
3 way handshake 이후 데이터 전송 상황
- 데이터와 함께 해당 데이터에 시퀀스 번호를 붙여서 케이틀린에게 전송함(14)
- 케이틀린은 사용자가 보낸 시퀀스 번호에서 데이터 크기만큼 더한 값(14)에 1을 더해 ack 필드에 적어서 응답함(ack: 14 + 14 + 1 = 29)
- 상대가 보내는 데이터도 시퀀스 번호를 붙임(seq: 1000)
- 상대가 보내는 데이터도 시퀀스 번호를 붙임(seq: 1000)
- 케이틀린의 ACK 메시지가 도착하면,
- seq 번호: 케이틀린에게 받은 데이터의 ack 번호를 적어서 그 다음 데이터를 전송함
(seq: 29 → 케이틀린이 29번 데이터를 요청했다는 뜻) - ack 번호: 케이틀린에게 받은 데이터의 seq 번호(1000)에서 데이터의 크기를 더한 값(4)에 1을 더한 값을 적어줌
(ack: 1000 + 4 + 1 = 1005)
- seq 번호: 케이틀린에게 받은 데이터의 ack 번호를 적어서 그 다음 데이터를 전송함
- 만약 사용자가 보낸 데이터가 분실됐거나 케이틀린의 응답 메시지가 분실됐다면, 사용자에게 ACK 메시지가 돌아오지 않음
→ 시간이 지나도 케이틀린에게 응답이 오지 않는다면, 케이틀린이 데이터를 못 받았다고 가정하고 같은 데이터를 다시 보냄 - 케이틀린이 ACK 패킷을 제대로 보냈다면 사용자는 다음 패킷을 보내게 됨
⇒ 이렇게 데이터를 보낼 때마다 확인 응답을 받고, 확인 응답이 있어야만 다음 데이터를 보내는 방식으로 신뢰성 있는 데이터 전송을 보장함
4 Way Handshake
: 통신을 종료하는 4단계 절차
- 사용자와 상대방이 통신을 종료하는 단계로, 데이터를 4번 송수신하면서 서로 연결을 끊는 데 필요한 약속을 주고받는 것 (= 작별 인사)
- 커넥션을 끊을 때는 4 way handshake로 진행
케이틀린과 사용자가 TCP 연결을 끊는 상황
- 먼저 연결을 끊으려는 호스트 측에서(케이틀린) FIN 패킷을 보냄
- 그럼 사용자는 케이틀린의 FIN 패킷에 대한 ACK 패킷과 함께 사용자의 FIN 패킷을 보냄
- 케이틀린은 사용자의 FIN 패킷에 최종적으로 ACK 패킷을 보내며 커넥션이 끊어짐