4계층인 전송 계층
의 목적은 목적지를 찾아가는 주소가 아니라 애플리케이션에서 사용하는 프로세스를 정확히 찾아가고 데이터를 분할한 패킷을 잘 쪼개 보내고 패킷 순서가 바뀌지 않도록 잘 조립하여 원래의 데이터를 만들어내는 것입니다.
TCP/IP
프로토콜 스택에서 전송 계층은 TCP
와 UDP
가 담당합니다.
그 중에서 먼저, TCP
에 대해서 설명하겠습니다.
TCP
프로토콜은 신뢰할 수 없는 공용망에서도 정보유실 없는 통신을 보장하기 위해 세션을 안전하게 연결하고 데이터를 분할하고 분할된 패킷이 잘 전송되었는지 확인하는 기능이 있습니다.
패킷에 번호(Sequence Number, Seq)
를 부여하고 잘 전송되었는지에 대해 응답(Acknowledge Number, Ack)
합니다.
또한, 한꺼번에 얼마나 보내야 수신자가 잘 받아 처리할 수 있는지 전송 크기(Window Size)
까지 고려해 통신합니다.
아래의 이미지는 시퀀스 번호
와 ACK 번호
의 기본 동작 방식, 패킷을 하나 보내고 이에 대한 응답을 받는 동작 과정입니다.
TCP
에서는 분할된 패킷을 잘 분할하고 수신 측이 잘 조합하도록 패킷에 순서를 주고 응답 번호를 부여합니다.
패킷에 순서를 부여하는 것을 시퀀스 번호
, 응답 번호를 부여하는 것을 ACK 번호
입니다.
두 번호가 상호작용해 순서가 바뀌거나 중간에 패킷이 손실된 것을 파악할 수 있습니다.
보내는 쪽에서 패킷에 번호를 부여하고 받는 쪽은 이 번호의 순서가 맞는지 확인합니다.
받은 패킷 번호가 맞으면 응답을 주는데 이때 다음 번호의 패킷을 요청합니다. 이 숫자를 ACK 번호
라고 합니다.
송신 측이 1번 패킷을 보냈는데 수신 측이 이 패킷을 잘 받는다면 1번을 잘 받았으니 다음에는 2번을 달라는 표시로 ACK 번호 2를 줍니다.
TCP
는 일방적으로 패킷을 보내는 것이 아니라 상대방이 얼마나 잘 받았는지 확인하기 위해 ACK 번호
를 확인하고 다음 패킷을 전송합니다. 작은 패킷을 하나 보내고 응답을 받아야만 하나를 더 보낼 수 있다면 모든 데이터를 전송하는 데 긴 시간이 걸릴 것입니다. 그래서 데이터를 보낼 때 패킷을 하나만 보내는 것이 아니라 많은 패킷을 한꺼번에 보내고 응답을 하나만 받습니다.
가능하면 최대한 많은 패킷을 한꺼번에 보내는 것이 효율적이지만 네트워크 상태가 안 좋으면 패킷 유실 가능성이 커지므로 적절한 송신량을 결정해야 하는데 한 번에 데이터를 받을 수 있는 데이터 크기를 윈도 사이즈
라고 하고 네트워크 상황에 따라 이 윈도 사이즈를 조절하는 것을 슬라이딩 윈도
라고 합니다.
TCP
는 데이터에 유실이 발생하면 윈도 사이즈를 절반으로 떨어뜨리고 정상적인 통신이 되는 경우, 서서히 하나씩 늘립니다. 네트워크에 경합이 발생해 패킷 드롭이 생기면 작아진 윈도 사이즈로 인해 데이터 통신 속도가 느려져 회선을 제대로 사용하지 못하는 상황이 발생할 수 있습니다.
이런 경우, 경합을 피하기 위해 회선 속도를 증가시키거나 경합을 임시로 피하게 할 수 있는, 버퍼가 큰 네트워크 장비를 사용하거나 TCP
최적화 솔루션을 사용해 이런 문제들을 해결할 수 있습니다.
TCP
는 유실없는 안전한 통신을 위해 통신 시작 전, 사전 연결작업을 진행합니다.
TCP
프로토콜은 데이터를 안전하게 보내고 받을 수 있는지 미리 확인하는 작업을 거칩니다. TCP
에서는 3번의 패킷을 주고받으면서 통신을 서로 준비하므로 3방향 핸드셰이크
라고 부릅니다.
TCP
는 이런 3방향 핸드셰이크 진행 상황에 따라 상태(State) 정보를 부르는 이름이 다릅니다.
서버에서는 서비스를 제공하기 위해 클라이언트의 접속을 받아들일 수 있는 LISTEN
상태로 대기합니다.
클라이언트에서 통신을 시도할 때 Syn
패킷을 보내는데 클라이언트에서는 이 상태를 SYN-SENT
라고 부릅니다.
클라이언트의 Syn
을 받은 서버는 SYN-RECEIVE
상태로 변경되고 Syn
, Ack
로 응답합니다.
이 응답을 받은 클라이언트는 ESTABLISHED
상태로 변경하고 그에 대한 응답을 서버로 다시 보냅니다.
서버에서도 클라이언트의 이 응답을 받고 ESTABLISHED
상태로 변경됩니다.
ESTABLISHED
상태는 서버와 클라이언트 간의 연결이 성공적으로 완료되었음을 나타냅니다.
어떤 패킷이 새로운 연결 시도이고 기존 통신에 대한 응답인지 구분하기 위해 헤더에 플래그(Flag)
라는 값을 넣어 통신합니다.
TCP
플래그에는 총 6가지가 있고 통신의 성질을 나타냅니다. 초기 연결, 응답, 정상 종료, 비정상 종료 등의 용도로 사용됩니다.
플래그 | 설명 |
---|---|
SYN | 연결 시작 용도로 사용합니다. 연결이 시작될 때 SYN 플래그에 1로 표시해 보냅니다. |
ACK | ACK 번호가 유효할 경우, 1로 표시해 보냅니다. 초기 SYN이 아닌 모든 패킷은 기존 메시지에 대한 응답이므로 ACK 플래그가 1로 표기됩니다. |
FIN | 연결 종료 시 1로 표시됩니다. 데이터 전송을 마친 후 정상적으로 양방향 종료 시 사용됩니다. |
RST | 연결 종료 시 1로 표시됩니다. 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용됩니다. |
URG | 긴급 데이터인 경우, 1로 표시해 보냅니다. |
PSH | 서버 측에서 전송할 데이터가 없거나 데이터를 버퍼링 없이 응용 프로그램으로 즉시 전달할 것을 지시할 때 사용됩니다. |
이상으로 TCP에 대해서 간단히 알아봤습니다.