네트워크

인터넷에서 웹브라우저까지 (7) - TCP, UDP

예 찬 2022. 2. 1. 23:24

 

 

 

3-way Handshaking 과정을 통해 수립한 TCP 연결에서 클라이언트 애플리케이션과 서버 애플리케이션이 양방향으로 데이터를 전송할 수 있습니다.

 

TCP 연결에서는 하나의 데이터를 여러 개의 세그먼트로 나누어서 순차적으로 전송합니다.

 

 

 

 

수신 호스트는 나누어진 세그먼트를 데이터로 재조립해야 합니다.

 

하지만 네트워크 상황에 따라 데이터가 순서대로 도착하지 않을 수도 있고, 손실될 수도 있기 때문에 세그먼트의 헤더에는 순서 번호(Sequence Number)확인 응답 번호(Acknowledgement Number)가 포함됩니다.

 

순서 번호는 송신 애플리케이션이 몇 번째 세그먼트를 전송했는지 알려주고 확인 응답 번호는 송신 애플리케이션에게 다음 세그먼트를 요청하는 데 사용합니다.

 

처음 세그먼트를 전송할 때 사용되는 순서 번호와 확인 응답 번호는 3-way Handshaking 과정에서 정해집니다.

 

순서 번호와 확인 응답 번호를 통해 송신 호스트와 수신 호스트가 양방향으로 통신하는 과정을 알아보겠습니다.

 

 

TCP 연결 수립 후 호스트 A가 호스트 B에게 전체 데이터 중에 10 바이트의 세그먼트를 전송합니다.

 

 

 

 

호스트 B는 정상적으로 세그먼트를 받으면 ACK 세그먼트와 함께 자신이 보낼 데이터를 호스트 A에게 전송합니다.

(호스트 A의 데이터와 별개의 데이터입니다.)

 

호스트 A가 500번 세그먼트부터 10 바이트를 전송했기 때문에 호스트 B의 확인 응답 번호에는 다음 데이터인 510번이 설정됩니다.

 

 

 

 

호스트 A는 510번 세그먼트를 보내고, 호스트 B가 보낸 세그먼트의 다음 세그먼트인 1005번 세그먼트를 요청합니다.

 

 

 

 

이런 과정이 데이터 전송이 완료될 때까지 반복됩니다.

 

통신 과정에서 수신 호스트는 전송받은 세그먼트의 헤더에서 체크섬 필드 값을 보고 오류를 검사합니다.

 

송신 호스트는 체크섬 값을 구하기 위해 전송하는 세그먼트를 16비트 단위로 나눈 뒤 1의 보수를 사용하고 더 합니다.

 

 

 

 

결괏값을 세그먼트의 체크섬 필드에 설정하고 전송합니다.

 

수신 호스트에서는 전송받은 세그먼트를 16비트 단위로 나누고 체크섬 필드를 포함하여 더 합니다.

 

 

 

 

연산 결과 0이라면 오류가 없다고 판단하고 ACK 세그먼트를 보냅니다.

 

만약 0이 아니라면 세그먼트를 버리고 ACK 세그먼트를 보내지 않습니다.

 

재전송 타이머 동안 ACK 세그먼트를 받지 못한 송신 호스트는 세그먼트를 재전송합니다.

 

 

 

 

재전송된 세그먼트에 체크섬을 계산한 결과 문제가 없다면 수신 호스트는 ACK 세그먼트를 보냅니다.

 

일반적으로 ACK 세그먼트는 세그먼트를 전송받고 일정 시간 뒤 전송하지만 수신 호스트에 중복된 세그먼트가 도착한 경우에는 ACK 세그먼트가 누락되었다고 판단하여 ACK 세그먼트를 즉시 보냅니다.

 

 

 

 

이처럼 수신한 세그먼트에 대해 ACK 세그먼트를 받으면서 문제가 있을 시 재전송하는 방법을 ARQ(Automatic Repeat Request)라고 합니다.

 

하지만 패킷을 한 번에 하나씩 전송받고 ACK 세그먼트를 보내는 것보다 여러 패킷을 전송받아 한번 ACK 세그먼트를 보내는 게 효율적입니다.

 

 

 

 

여러 패킷에 대해 한번 ACK를 보내는 방식을 누적 ACK 방식이라고 하고 슬라이딩 윈도우(Sliding Window Protocol)에서 사용합니다.

 

TCP에서는 효율적인 전송을 하기 위해 슬라이딩 윈도우를 통한 흐름 제어(Flow Control)를 수행합니다.

 

TCP는 송신 버퍼와 수신 버퍼를 가지고 있습니다. 

 

송신 호스트는 송신할 세그먼트를 송신 버퍼에 저장하였다가 송신 윈도우 크기 이내로 들어오면 세그먼트를 전송합니다.

 

 

 

 

수신 호스트로 보내진 세그먼트는 먼저 수신 버퍼에 저장되고 수신 윈도우 크기(rwnd) 내로 들어오면 세그먼트를 수신하고 ACK 세그먼트를 보냅니다.

 

윈도우 크기는 한 번에 전송할 수 있는 세그먼트의 갯수를 의미하고 초기값은 3-way Handshaking 과정에서 정해집니다.

 

윈도우 크기의 경우 네트워크 상황에 따라 변할 수 있기 때문에 수신 호스트는 ACK 세그먼트를 보낼 때 현재 윈도우 크기 ( 수신 가능한 역량)을 같이 보내 송신 호스트의 전송 속도를 조절합니다.

 

송신 윈도우의 경우 cwnd와 rwnd 중 더 작은 값으로 설정됩니다.

 

cwnd는 TCP가 혼잡 제어(Congestion Control)를 수행할 때 사용하고 수신 호스트의 수신 역량을 초과하지 않도록 윈도우 크기를 결정한 값입니다.

 

cwnd 값은 1부터 시작해서 세그먼트 전송이 성공하면 값을 두 배씩 증가시키다가 ssthresh(slow start threshold) 값에 도달하면 1씩 증가하면서 네트워크에 혼잡이 일어나지 않는 값을 가집니다.

 

슬라이딩 윈도우 프로토콜을 통해 흐름 제어가 일어나는 과정을 살펴보겠습니다.

 

 

 

 

rwnd가 2, cwnd가 6이므로 더 작은 값인 rwnd가 송신 윈도우의 크기로 정해집니다.

 

호스트 A는 윈도우 크기만큼 세그먼트를 전송합니다.

 

 

 

 

호스트 B는 ACK 세그먼트를 보내면서 rwnd가 1이라는 것을 알립니다.

 

호스트 A는 윈도우 크기를 1로 조절하고 세그먼트를 보냅니다.

 

 

 

 

이번엔 rwnd가 3으로 변경되었고 호스트 A는 윈도우 크기를 3으로 조절하고 세그먼트를 보냅니다.

 

만약 rwnd가 cwnd를 넘어가게 되면  cwnd 값으로 송신 윈도우 크기를 조절합니다.

 

위와 같은 과정으로 TCP는 전송 속도를 조절하면서 수신할 수 있는 역량을 넘어서 데이터가 전송되는 것을 막아줍니다.

 

 

TCP 통신 과정에서 더 이상 보낼 데이터가 존재하지 않는다면 TCP 연결을 종료해야 합니다.

 

정상적인 연결 종료는 4-way Handshaking 과정으로 이루어집니다.

 

 

4 -way Handshaking 

 

 

위에서 알아본 것과 같이 TCP는 순서 번호를 통해 세그먼트 손실이나 중복 전송 등을 제어할 수 있고 슬라이딩 윈도우를 통해 흐름 제어와 혼잡 제어를 수행해서 신뢰성 있는 전송을 제공합니다.

 

Transport Layer에는 TCP와 달리 연결을 수립하지 않고 유연하게 데이터를 전송하는 비연결성 프로토콜인 UDP(User Datagram Protocol)가 있습니다.

 

UDP는 데이터를 세그먼트로 전송하지 않고 메세지로 전송하기 때문에 순서 번호 필드가 존재하지 않고 흐름 제어를 수행하지 못하기 때문에 신뢰성 있는 전송을 제공할 수 없습니다.

 

또한 비연결성 프로토콜로 서 연결을 수립하지 않기 때문에 세그먼트들이 독립적인 경로로 전송됩니다.

 

신뢰성 있는 전송을 제공하지는 못하지만 헤더가 단순하여 전송 속도가 빠르고 여러 경로를 통해 데이터를 전송할 수 있기 때문에 빠른 전송 속도가 필요한 애플리케이션에 적합합니다.

 

 

UDP 헤더

 

 


 

Transport Layer에서는 Application layer의 특정 애플리케이션으로 데이터를 전달합니다. 

 

Application layer는 OSI 7 Layers의 Session Layer, Presentation Layer, Application Layer에 해당하고 사용자가 직접 사용할 수 있는  서비스를 제공합니다.