7.1. TCP 통신 구조

URG와 긴급 데이터 포인터는 오늘날 TCP 통신에는 사용되지 않습니다. 큰 이유로는 다음과 같습니다.

1). URG와 긴급 데이터 포인터는 태생 자체가 TCP 순차 전송 컨셉과 반대되는 개념으로

수신자 입장에서는 일관성이 떨어진다는 느낌을 받으며, 신뢰성이 하락하게 되어

이는 그대로 성능저하와 연결될 수 있기 때문입니다.


2). URG와 긴급 데이터 포인터가 네트워크 보안 공격에 사용될 가능성이 알려져

오늘날 TCP 통신에는 처음부터 비활성화 하는 경우가 많습니다.


3). 오늘날 TCP 통신에는 TCP 순차 전송 컨셉을 유지하기 위한 장치 (흐름제어, 혼잡제어)들이 동작하고 있기 때문에

더 이상 불완전한 URG와 긴급 데이터 포인터를 사용 할 필요가 없어졌습니다.

또한, “TLS”(Transport Layer Security)와 같이 보안 계층 프로토콜등의 도입으로

훨씬 더 뛰어난 기술들을 사용하여 오늘날 URG와 긴급 데이터 포인터를 사용 할 필요가 없어졌습니다.


TCP 프로토콜은 응용계층과 전송계층 사이의 소켓으로 매개하기 때문에 발신지와 수신지 두 호스트만 동작합니다.

( 라우터나 스위치에서는 TCP가 동작하지 않습니다. )

TCP는 “양방향 송수신”이 가능하며, 한 TCP 소켓은 “일대일”(단일 송신자와 수신자)만 가능하기 때문에

기본적으로 멀티캐스팅은 지원하지 않습니다.


TCP 세그먼트 크기는 “MSS”(Maximum Segment Size)에 의해 제한됩니다.

( MSS는 TCP 세그먼트 내 데이터 영역의 최대 바이트 크기 입니다. )

TCP 연결설정 단계(syn=1 handshake 첫 단계)에서 TCP 양측에서 각각 헤더 내 옵션 필드에

MSS을 참조하여 설정을 잡고 전송을 시도합니다.

추가적으로 지정된 MSS이상의 메시지는 보낼 수 없으므로,

이보다 더 긴 길이의 메시지를 보내기 위해 TCP 헤더에 있는 “순서번호”의 개념을 사용합니다.


순서번호를 이용한 TCP통신 과정은 다음과 같습니다.

1). 처음에 순서번호를 0으로 설정하고 발신자가 MSS보다 적은 바이트의 메시지를 보냅니다.

2). 받은 수신자가 1바이트 단위로 받은 개수를 순서번호에 더하여
다음 순서번호를 TCP 헤더에 있는 “확인응답번호”로 보냅니다.

3). 발신자가 확인응답번호를 받고 다음 보낼 메시지에 해당 번호로 갱신하여 보냅니다.

4). 위의 일련의 과정을 “누적확인응답”방식이라고 표현하고, 이를 사용하여 데이터 순서를 맞춰줍니다.


TCP 연결은 기본적으로 “3-way handshaking” 절차를 사용하여 통신합니다.

“3-way handshake” 는 TCP 연결설정(connection establishment)절차 중 하나로
클라이언트 프로세스가 서버 프로세스와의 연결설정을 원한다는 것을 클라이언트 TCP에게 알림으로써 시작됩니다.


총 3단계로 구성되며, 각 단계는 다음과 같습니다.

1단계). 클라이언트 TCP는 SYN 세그먼트를 서버 TCP로 전송합니다.

SYN = 1 , len(data) = 0 , clientISN(Initial Sequence Number)를 적절히 선택하여 순서번호 필드에 삽입합니다.

(일종의 번호표를 매겨 놓습니다.)


2단계). 서버 TCP는 SYN + ACK 세그먼트를 클라이언트 TCP로 송신합니다.

SYN =1 , ACK 필드 = clientISN + 1 , len(data) = 0 , serverISN 을 적절히 선택하여 순서번호 필드에 삽입합니다.

SYN 요청을 받았으니 TCP 버퍼와 변수등의 자원 할당을 진행합니다.


3단계). 클라이언트 TCP는 ACK 세그먼트를 서버 TCP로 전송합니다.

SYN = 0 , ACK 필드 = serverISN + 1 , seqNo = clientISN + 1 , len(data) = 0

ACK 세그먼트에 서버로 보내는 선행 또는 요청 데이터가 포함될 수도 있습니다.

연결설정 이후, 데이터 송수신은 SYN = 0으로 통신하고 정보를 주고 받습니다.


해당 과정에서 SYN 및 SYN+ACK 세그먼트는 순서번호를 반드시 소비하고,

ACK 세그먼트는 데이터 전송을 하지 않을 때는 순서번호를 소비하지 않습니다.


“4-way handshake” 는 TCP 연결종료(connection termination)절차 중 하나로 다음과 같습니다.

1단계). 클라이언트 TCP는 FIN 세그먼트를 서버 TCP로 전송합니다.

FIN = 1 , len(data) = 0 ( FIN 은 연결을 종료하겠다는 의미입니다. )


2단계). 서버 TCP는 ACK 세그먼트를 클라이언트 TCP로 송신합니다.

3단계). 이후 서버 TCP가 한번 더 FIN 세그먼트를 클라이언트 TCP로 송신합니다.

FIN = 1 , len(data) = 0


4단계). 클라이언트 TCP는 ACK 세그먼트를 서버 TCP로 전송합니다.


이후, 전송 대기시간 후 두 TCP는 연결을 정상 종료 합니다.

비정상 종료를 하기 위해 RST 세그먼트를 사용합니다. RST가 수신된다면 연결이 즉시 중단됩니다.
( 닫힌 포트에 접속하거나 의도적으로 주소를 차단한 경우에 사용됩니다. )


링크계층 ppt 큰그림 TCP 동작

7.2. TCP 신뢰적 데이터 전송기법

TCP 처리에서 타이머들을 사용하여 지연이나 손실에 대한 재전송 및 처리속도를 조절할 수 있습니다.

타이머 “unAcked” 와 “oldest segment” 의 동작원리는 다음과 같습니다.

1). 발신하는 TCP에서 데이터요청이 들어오면, 타이머를 작동하고, 순서번호를 데이터를 받은만큼 갱신해줍니다.


2). 수신하는 TCP에서 순서번호를 받고 이후 다음의 세그먼트를 받으면, 두 개를 받았다는 응답 ACK를 보냅니다.


3). 발신하는 TCP에서 요청 순서번호를 받았을 때,

만약, 요청 순서번호가 “oldest”, “unAcked” 보다 크다면,
“oldest”, “unAcked”들을 요청 순서번호로 갱신하면서 unAcked가 남아있다면, 타이머를 작동합니다.

만약, 요청 순서번호가 “oldest”, “unAcked” 보다 같거나 작다면,
이는 중복수신 상태이며, “Duplicate ACK” 를 카운트 하면서 3회를 넘어서 요청이 오면, 요청된 것을 재전송 해줍니다.


4). 수신하는 TCP에서 기다리던 순서번호보다 큰 순서의 데이터를 받으면, 기다리던 순서번호를 재전송합니다.


5). 발신 또는 수신측에서 지연으로 인해 “타임아웃”이 발생하면,
“oldest”, “unAcked” 들을 재전송하고 타이머를 리셋 후, 다시 작동합니다.


“RTT”(Round Trip Time 또는 왕복 시간)은 패킷이 목적지에 도달하고 나서
해당 패킷의 응답이 출발지로 돌아오기까지의 시간입니다.


“SRTT”(Smoothed RTT)는 RTT 측정값들의 평균이며, 최초 SRTT 값은 최초의 RTT 값으로 설정합니다.

SRTT는 “지수가중이동평균”(Exponential Weighted Moving Average, EWMA)방식이고, 수식은 다음과 같습니다.

\(SRTT = (1 – \frac{1}{8})SRTT + \frac{1}{8}RTT\)

“RTTVAR”(Round-Trip Time VARiation)은 RTT값의 변화율을 의미합니다. 수식은 다음과 같습니다.

\(RTTVAR = (1 – \frac{1}{4})RTTVAR + \frac{1}{4}| SRTT – RTT |\)

“RTO”(Retransmission TimeOut, RTO)는 “타임아웃 주기”로 타임아웃을 하기까지의 여유시간입니다.

SRTT보다 크게 해야 하지만( 불필요 재전송이 많아지기 때문에 ), 너무 크면 타임아웃 주기의 의미가 사라져

SRTT보다 적당히 크게 유지해야 합니다. 수식은 다음과 같습니다.

\(RTO = SRTT + 4 * RTTVAR\)

TCP에서 수신측의 “처리 속도”가 느려서 데이터가 손실 날 것이 확실한 경우에 발신측 송신 속도를 제어합니다.

이를 TCP의 “흐름제어”(Flow Control)라고 표현하고,

수신측이 수신측 가용버퍼공간(현재 받아줄 수 있는 여유공간)을 발신측에게 알리는데

이 때, TCP헤더에 있는 “수신윈도우”(Receive Window)를 사용하여 전달합니다.


TCP 수신측에서는 발신하는 세그먼트의 수신윈도우에 자신의 “수신 윈도우 값”(rwnd)을 넣어서 보냅니다.

수신 윈도우 값 수식은 다음과 같습니다.

rwnd = 수신측 총 버퍼크기 – ( 마지막으로 수신받은 바이트 수 – 마지막으로 읽은 바이트 수 )

( rwnd = rcv_buffer – ( last_byte_rcvd – last_byte_read ) )

읽은 바이트 수는 발신측에서는 확인응답 받은 횟수이므로

송신측에서 rwnd 값은 마지막으로 보낸 바이트 수 – 응답받은 바이트 수 보다 크거나 같을 것입니다.

( rwnd ≥ last_byte_sent – last_byte_acked )


위의 내용은 발신측과 수신측이 서로 합을 맞춰 데이터 오버플로우나 손실을 방지하는 목적으로 사용됩니다.

하지만, 네트워크의 혼잡에 대응하지는 못합니다.

TCP의 “혼잡제어”(Congestion Control)는 TCP에서 네트워크가 일시적 또는 상시 혼잡하여,

라우터 쪽의 버퍼 오버플로우나 손실이 일어나는 것을 줄이기 위해 발신측 송신 속도를 제어합니다.


TCP의 혼잡제어는 다음 두 가지 방법이 존재합니다.

1). “슬로우 스타트”(Slow Start 또는 느린 시작) : MSS를 1부터 지수적으로 송신량을 증가 시킵니다.

1 RTT마다 2배씩 증가시키고, “송신임계량”(slow start threshold, ssthresh)을 넘으면, 혼잡 회피로 전환 됩니다.

만약, 타임아웃 또는 3번 중복 ACK 수신이 되면, ssthresh 를 cwnd 값의 절반으로 설정합니다.


2). “혼잡 회피”(Congestion Avoidance) : MSS를 1부터 선형적으로 송신량을 증가 시킵니다.

1 RTT마다 1 만큼씩 증가시키고, 만약, 타임아웃 또는 3번 중복 ACK 수신이 되면,

ssthresh 를 cwnd 값의 절반으로 설정합니다.


슬로우 스타트는 초기에 임계점을 대략적으로 알기 위해 사용되는 편이고,
이후에는 혼잡회피 방식을 주로 사용합니다.


7.3. ARQ 프로토콜

“ARQ”(Automatic Repeat reQuest)는 재전송을 기반으로 한 신뢰적 데이터 전송 프로토콜 입니다.

ARQ 프로토콜에서는 오류검출, ACK 응답, NAK (부정 확인) 응답 , 재전송(Retransmission) 기능이 요구 됩니다.


“Stop-and-Wait” 방법은 ARQ 프로토콜 중 하나로,

한 칸의 슬라이드 윈도우( 좌우로 평행이동하는 포인터 )가 윈도우에 있는 데이터를 패킷으로 보낸 후,

타이머를 켭니다.

이후, 응답을 받으면, 슬라이드 윈도우를 우측으로 한 칸 밀고 타이머를 리셋합니다.

만약, 응답이 손실이 나거나 데이터를 보내다 손실이 나서 응답을 못 받은 경우,

타이머에 의해 타임 아웃으로 데이터 패킷을 한 번 더 보내고 타이머를 다시 켭니다.


만약, 응답을 못 받아 재전송을 했지만, 수신측에서 해당 내용을 이미 받았었다면,

재전송된 내용을 버리고 기존과 똑같은 응답을 보냅니다.

Stop-and-Wait의 핵심은 발신측과 수신측이 모두 한 칸의 슬라이드 윈도우로

한 개 전송 – 대기 – 한 개 응답 – 한 개로 처리 순으로 이루어집니다.


“Pipelined” 방법은 ARQ 프로토콜 중 하나로,

Stop-and-Wait 의 방법과 다르게 여러 칸의 슬라이딩 윈도우로 데이터를 동시 전송하고,

응답을 여러 개 받는 방법입니다. 다음은 Pipelined방법을 따르는 ARQ프로토콜을 나열 한 것입니다.


1). “Go-Back-N” 방법은 ARQ 프로토콜 – Pipelined 방법 중 하나로,

여러 칸의 슬라이드 윈도우가 윈도우에 있는 데이터를 최대 전송량만큼 보낸 후, 타이머를 켭니다.

이후, 응답을 전부 받고, 슬라이드 윈도우를 마지막 응답지점 다음으로 밀고 타이머를 리셋합니다.


만약, 데이터의 일부를 못 받거나 응답이 손실되는 등의 일부의 응답을 못 받은 경우,

마지막 응답지점이 예상과는 달라지게 되고 발신측은 응답지점부터 다시 전송해줍니다.

역으로, 응답지점 전까지는 완벽하게 들어 왔다는 표시이고, 응답지점을 기준으로 전송 여부를 나눕니다.

Go-Back-N의 핵심은 발신측은 여러 칸의, 수신측은 한 칸의 슬라이드 윈도우로

여러 개 전송 – 대기 – 한 개씩 응답 – 마지막 한 개로 처리 순으로 이루어집니다.


2). “Selective-Repeat” 방법은 ARQ 프로토콜 – Pipelined 방법 중 하나로,

여러 칸의 슬라이드 윈도우가 윈도우에 있는 데이터를 최대 전송량만큼 보낸 후, 타이머를 켭니다.

이후, 응답을 전부 받고, 슬라이드 윈도우를 받은 응답지점 다음으로 밀고 타이머를 리셋합니다.


만약, 데이터의 일부를 못 받거나 응답이 손실되는 등의 일부의 응답을 못 받은 경우,

일부 응답을 못 받은 지점 들을 발신측이 탐지하고 못 받은 지점들을 다시 전송해줍니다.

응답을 각 데이터별로 보내기 때문에, 각 데이터별로 정상 전송 여부를 알 수 있습니다.

Selective-Repeat의 핵심은 발신측과 수신측이 모두 여러 칸의 슬라이드 윈도우로

여러 개 전송 – 대기 – 여러 개 응답 – 여러 개들로 처리 순으로 이루어집니다.


“TCP의 오류제어 프로토콜”은 Go-Back-N 방식과 Selective-Repeat 방식을 섞은(Hybrid)프로토콜을 사용합니다.

Go-Back-N 과 TCP 오류제어 프로토콜의 유사한 점은 기본적으로 “누적”(Cumulative)방식을 사용한다는 점이고,

차이점은 TCP는 순서가 맞지 않아도 일시적으로 버퍼에 저장 후 처리를 사용하는데, Go-Back-N은 그렇지 않습니다.


Selective-Repeat 와 TCP 오류제어 프로토콜의 유사한 점은 각 데이터 별로 응답을 관리하여

순서나 일부 재전송등의 세부적인 조절이 가능하고,

차이점은 TCP는 순서를 지켜주고 Selective-Repeat는 지켜주지 않으며, 복구 지점과 범위가 조금 다릅니다.


Leave a Reply

Your email address will not be published. Required fields are marked *