요약
- 누적 TCP 확인 응답은 하나의 진행하는 경계선만 식별한다. 한 번의 전송 회차에서 여러 손실이 발생하면, 첫 공백 뒤에 있는 온전한 구역들은 누적 확인 응답만으로는 묘사되지 않는다.
- RFC 2018은 누적 확인 응답을 최종 권위로 유지하고 혼잡 제어는 발신자에게 남겨두면서, 수신자가 연속적이지 않은 바이트 범위를 보고할 수 있게 했다.
- RFC 3517과 RFC 6675는 그 근거를 보수적인 스코어보드 기반 복구 절차로 전환했으며, 확인 응답 시계가 정지할 수 있는 상황에서 사용하는 유한한 구조 재전송까지 포함했다.
발신자에서 여덟 개의 세그먼트가 출발했는데 두 번째가 사라졌다고 상상해 보라. 수신자는 세 번째부터 여덟 번째까지의 세그먼트를 보관할 수 있지만, 평범한 확인 응답 번호는 공백 바로 앞에 고정된 채 남는다. 그 번호를 반복해서 보내는 것은 발신자에게 문제가 있음을 알려주지만, 무엇이 살아남았는지의 전체 모양은 알려주지 못한다. 공격적인 발신자는 광범위하게 재전송할 수 있고, 신중한 발신자는 각 빈틈이 연이은 라운드 트립에 걸쳐 드러나기를 기다릴 수 있다. 어느 쪽이든 근거가 너무 좁기 때문에 시간이나 용량을 소모한다.
이것이 TCP 선택적 확인 응답(Selective Acknowledgment, SACK) 뒤에 있던 문제였다. 1996년 10월 RFC 2018이 나왔을 때 그 아이디어가 완전히 새로운 것은 아니었다. 이른 형태가 RFC 1072에 포함되었지만 배포되지 않았는데, 부분적으로는 창 확장(window scaling)과의 상호작용이 논쟁적이었기 때문이다. RFC 2018은 이 거래를 단순화했다. 연결 개시 핸드셰이크 동안 TCP 엔드포인트는 두 바이트짜리 SACK-Permitted 옵션을 보낼 수 있었다. 허가가 존재하면 수신자는 이후의 확인 응답에 SACK 블록을 첨부할 수 있었다. 각 블록은 이미 수신한 연속 구역의 왼쪽과 오른쪽 경계를 묘사했다.
핵심은 아키텍처적 구분이었다. 누적 확인 응답은 여전히 한 경계선 아래의 모든 바이트가 도착했다는 의미였다. SACK 블록은 그 위의 구역들에 대한 참고적 근거였다. 블록은 경계선을 진행시키지 않았고 발신자가 자신의 사본을 버리게 하지도 않았다. 메모리 압박 아래 있는 수신자는 보고했던 데이터를 뒤로 물렸다가 버릴 수 있다. 평범한 확인 응답 번호가 어떤 바이트를 넘어 이동하기 전까지, 발신자는 그 바이트를 보관할 책임을 유지한다.
이 지도는 또한 불가피하게 불완전했다. TCP는 옵션 영역으로 40바이트만 확보한다. SACK 옵션은 최대 네 개의 블록을 담을 수 있고, 타임스탬프가 공간을 차지하는 경우에는 보통 세 개까지다. 그래서 RFC 2018은 가장 최근 블록에 첫 자리를 주고 최근에 보고된 블록을 반복하도록 권했다. 그 정렬은 두 가지 역할을 했다. 보고를 최신 상태로 유지하고, 확인 응답이 손실되더라도 근거가 살아남을 가능성을 높였다. 선택성은 결코 완전한 지식이 아니었다. 수신자 상태에 대한 규율된 압축이었다.
정보만으로 복구 정책이 정해지지는 않았다. RFC 2018은 TCP의 혼잡 제어 의무를 의도적으로 보존했고 발신자 알고리즘의 많은 부분을 열어두었다. 다음 제도적 단계는 2003년 4월의 RFC 3517이었다. 이 문서는 보수적인 SACK 기반 손실 복구 방법을 기술했다. 발신자는 누적 및 선택적으로 확인된 시퀀스 구역의 스코어보드를 유지하고, 어떤 공백이 손실인지 추론했으며,Pipe라는 변수를 통해 네트워크에 남아 있는 바이트 수를 추정하고, 혼잡 창을 넘지 않으면서 다음에 무엇을 보낼지 선택했다.
이 분리는 중요했다. 수신자는 근거를 제공하고, 발신자가 그것을 해석한다. SACK은 혼잡을 무시할 면허가 되지 않으면서 바이트 선택을 개선할 수 있었다. 여러 손실을 하나의 복구 에피소드 안에서 수리할 수 있었지만, 발신자는 여전히 창을 줄이고 TCP의 혼잡 원칙에 따라 새 전송을 제한했다. 더 풍부한 지도는 통제를 더 정밀하게 만들었지, 책임을 덜게 하지 않았다.
2012년 8월에 공개된 RFC 6675는 RFC 3517을 폐기하고 보수적 알고리즘을 다듬었다. 이 문서는 새로 보고된 SACK 데이터를 중복 확인 응답의 정의에 사용했고, 발신자의 최대 세그먼트 크기보다 작은 세그먼트에 대한 손실 추론을 개선했으며,RescueRxt를 추가했다. 이 상태는 창 끝 근처의 손실과 새 데이터 부재가 확인 응답 시계를 정체시킬 수 있는 상황에서 복구 에피소드마다 한 번의 낙관적 구조 재전송을 허용한다. 그 허가는 의도적으로 유한하다. 세그먼트 하나, 발신자 최대 세그먼트 크기 이하.
따라서 이 역사는 비효율적인 TCP에서 효율적인 TCP로 나아가는 단순한 행진이 아니다. 이것은 표준이 불확실성을 어떻게 배분하는가에 대한 역사다. 수신자는 자신이 보유한 조각을 볼 수 있지만 나중에 그것을 내놓을 수도 있다. 발신자는 재전송 버퍼와 혼잡 대응을 소유하지만 경로를 늦은 보고를 통해서만 본다. 옵션 공간은 얼마나 많은 근거가 이동할 수 있는지를 제한한다. 타임아웃은 가정을 무효로 만들 수 있다. SACK은 이러한 경계들을 명시적으로 만듦으로써 복구를 개선했다.
오래 남을 교훈은, 프로토콜 성능이 종종 더 강한 중앙 지휘가 아니라 더 나은 근거를 통해 먼저 바뀐다는 것이다. 누적 확인 응답은 경계선에 대한 판정이었다. 선택적 확인 응답은 부분적 성공에 대한 지도가 되었다. 뒤이은 표준들이 가장 중요한 작업을 한 방식은, 발신자가 그 지도를 얼마나 신뢰할 수 있는지, 원본 데이터를 얼마나 오래 보관해야 하는지, 그리고 잘못된 확신의 대가를 네트워크에 전가하지 않으면서 얼마나 공격적으로 행동할 수 있는지를 결정한 것이었다.
출처
회원 브리핑
프로필 심층 컨텍스트
올바른 멤버십 등급으로 로그인하면 전체 브리핑과 출처 노트를 볼 수 있습니다.
Strategic Circle 전용
Strategic Circle
모든 독자에게 공개됩니다. 가입 후 로그인하면 프로필 브리핑를 열람할 수 있습니다.
Strategic Circle 가입하기Leadership Alliance 전용
Leadership Alliance
자격을 갖춘 IP 자산 소유자 및 운영진을 위한 콘텐츠입니다. 로그인하면 Leadership Alliance 브리핑을 열람할 수 있습니다.
Leadership Alliance 가입하기





