4계층인 전송 계층의 목적은 목적지를 찾아가는 주소가 아니라 애플리케이션에서 사용하는 프로세스를 정확히 찾아가고 데이터를 분할한 패킷을 잘 쪼개 보내고 패킷 순서가 바뀌지 않도록 잘 조립하여 원래의 데이터를 만들어내는 것입니다.

TCP/IP 프로토콜 스택에서 전송 계층은 TCPUDP가 담당합니다.

그 중에서 먼저, TCP에 대해서 설명하겠습니다.

TCP 프로토콜은 신뢰할 수 없는 공용망에서도 정보유실 없는 통신을 보장하기 위해 세션을 안전하게 연결하고 데이터를 분할하고 분할된 패킷이 잘 전송되었는지 확인하는 기능이 있습니다.

패킷에 번호(Sequence Number, Seq)를 부여하고 잘 전송되었는지에 대해 응답(Acknowledge Number, Ack)합니다.

또한, 한꺼번에 얼마나 보내야 수신자가 잘 받아 처리할 수 있는지 전송 크기(Window Size)까지 고려해 통신합니다.

📌 패킷 순서, 응답 번호

아래의 이미지는 시퀀스 번호ACK 번호의 기본 동작 방식, 패킷을 하나 보내고 이에 대한 응답을 받는 동작 과정입니다.
tcp-1TCP에서는 분할된 패킷을 잘 분할하고 수신 측이 잘 조합하도록 패킷에 순서를 주고 응답 번호를 부여합니다.

패킷에 순서를 부여하는 것을 시퀀스 번호, 응답 번호를 부여하는 것을 ACK 번호입니다.

두 번호가 상호작용해 순서가 바뀌거나 중간에 패킷이 손실된 것을 파악할 수 있습니다.

보내는 쪽에서 패킷에 번호를 부여하고 받는 쪽은 이 번호의 순서가 맞는지 확인합니다.

받은 패킷 번호가 맞으면 응답을 주는데 이때 다음 번호의 패킷을 요청합니다. 이 숫자를 ACK 번호라고 합니다.

송신 측이 1번 패킷을 보냈는데 수신 측이 이 패킷을 잘 받는다면 1번을 잘 받았으니 다음에는 2번을 달라는 표시로 ACK 번호 2를 줍니다.

📌 윈도 사이즈와 슬라이딩 윈도

TCP는 일방적으로 패킷을 보내는 것이 아니라 상대방이 얼마나 잘 받았는지 확인하기 위해 ACK 번호를 확인하고 다음 패킷을 전송합니다. 작은 패킷을 하나 보내고 응답을 받아야만 하나를 더 보낼 수 있다면 모든 데이터를 전송하는 데 긴 시간이 걸릴 것입니다. 그래서 데이터를 보낼 때 패킷을 하나만 보내는 것이 아니라 많은 패킷을 한꺼번에 보내고 응답을 하나만 받습니다.

가능하면 최대한 많은 패킷을 한꺼번에 보내는 것이 효율적이지만 네트워크 상태가 안 좋으면 패킷 유실 가능성이 커지므로 적절한 송신량을 결정해야 하는데 한 번에 데이터를 받을 수 있는 데이터 크기윈도 사이즈라고 하고 네트워크 상황에 따라 이 윈도 사이즈를 조절하는 것슬라이딩 윈도라고 합니다.

TCP는 데이터에 유실이 발생하면 윈도 사이즈를 절반으로 떨어뜨리고 정상적인 통신이 되는 경우, 서서히 하나씩 늘립니다. 네트워크에 경합이 발생해 패킷 드롭이 생기면 작아진 윈도 사이즈로 인해 데이터 통신 속도가 느려져 회선을 제대로 사용하지 못하는 상황이 발생할 수 있습니다.

이런 경우, 경합을 피하기 위해 회선 속도를 증가시키거나 경합을 임시로 피하게 할 수 있는, 버퍼가 큰 네트워크 장비를 사용하거나 TCP 최적화 솔루션을 사용해 이런 문제들을 해결할 수 있습니다.

📌 3방향 핸드셰이크

TCP는 유실없는 안전한 통신을 위해 통신 시작 전, 사전 연결작업을 진행합니다.

TCP 프로토콜은 데이터를 안전하게 보내고 받을 수 있는지 미리 확인하는 작업을 거칩니다. TCP에서는 3번의 패킷을 주고받으면서 통신을 서로 준비하므로 3방향 핸드셰이크 라고 부릅니다.

tcp-2

TCP는 이런 3방향 핸드셰이크 진행 상황에 따라 상태(State) 정보를 부르는 이름이 다릅니다.

  • 서버에서는 서비스를 제공하기 위해 클라이언트의 접속을 받아들일 수 있는 LISTEN 상태로 대기합니다.

  • 클라이언트에서 통신을 시도할 때 Syn 패킷을 보내는데 클라이언트에서는 이 상태를 SYN-SENT라고 부릅니다.

  • 클라이언트의 Syn을 받은 서버는 SYN-RECEIVE 상태로 변경되고 Syn, Ack로 응답합니다.

  • 이 응답을 받은 클라이언트는 ESTABLISHED 상태로 변경하고 그에 대한 응답을 서버로 다시 보냅니다.

  • 서버에서도 클라이언트의 이 응답을 받고 ESTABLISHED 상태로 변경됩니다.

  • ESTABLISHED 상태는 서버와 클라이언트 간의 연결이 성공적으로 완료되었음을 나타냅니다.

💡 플래그(Flag)

어떤 패킷이 새로운 연결 시도이고 기존 통신에 대한 응답인지 구분하기 위해 헤더에 플래그(Flag)라는 값을 넣어 통신합니다.

TCP 플래그에는 총 6가지가 있고 통신의 성질을 나타냅니다. 초기 연결, 응답, 정상 종료, 비정상 종료 등의 용도로 사용됩니다.

플래그설명
SYN연결 시작 용도로 사용합니다. 연결이 시작될 때 SYN 플래그에 1로 표시해 보냅니다.
ACKACK 번호가 유효할 경우, 1로 표시해 보냅니다. 초기 SYN이 아닌 모든 패킷은 기존 메시지에 대한 응답이므로 ACK 플래그가 1로 표기됩니다.
FIN연결 종료 시 1로 표시됩니다. 데이터 전송을 마친 후 정상적으로 양방향 종료 시 사용됩니다.
RST연결 종료 시 1로 표시됩니다. 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용됩니다.
URG긴급 데이터인 경우, 1로 표시해 보냅니다.
PSH서버 측에서 전송할 데이터가 없거나 데이터를 버퍼링 없이 응용 프로그램으로 즉시 전달할 것을 지시할 때 사용됩니다.

이상으로 TCP에 대해서 간단히 알아봤습니다.

참고

  • IT 엔지니어를 위한 네트워크 입문 (고재성, 이상훈 지음)
profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글