TCP 라미나

Laminar란 무엇인가요?

Laminar는 각 RTT 중에 전송된 총 데이터 양을 결정하는 순수 정체 제어로부터 데이터가 전송되는 시기를 정확히 결정하는 전송 스케줄링을 분리하는 TCP 정체 제어를 위한 새로운 프레임워크입니다.

전송 스케줄링의 기본 알고리즘은 밴 제이콥슨의 패킷 보존 원칙을 엄격하게 구현한 것입니다[Jacobson88]. 수신자에게 도착한 데이터는 ACK를 발생시키며, ACK는 발신자가 동일한 양의 데이터를 네트워크로 다시 전송하도록 합니다. 기본 상태 변수는 네트워크에서 순환되는 ACK와 데이터의 양에 암시적입니다. 이 상태는 개선된 tcp_packets_in_flight() 에스티메이터 (total_pipe라고도 함)를 통해 관찰됩니다. total_pipe는 RFC 3517에 설명된 '파이프'를 기반으로 하지만, 현재 ACK에 의해 보고된 데이터의 양과 정체 제어를 통과했지만 TSO와 같은 다른 이벤트를 대기 중인 전송 대기도 포함합니다.

새로운 변수인 CCwin이 주요 정체 제어 상태 변수입니다. 정체 제어 알고리즘은 CCwin을 조정하여 경로를 따라 전반적인 정체 수준을 조절합니다. CCwin은 cwnd와 비슷하지만, cwnd는 상이하고 때로 상충되는 목표를 가진 여러 알고리즘(예: 버스트 억제)에 의해 오버로드되고 사용됩니다.

total_pipe가 CCwin과 다른 경우 전송 예약 알고리즘은 각 ACK에 대한 응답으로 전송되는 세그먼트 수를 약간 조정합니다. 느린 시작과 비례 속도 감소(PRR)(비율 절반을 대체함)가 모두 전송 예약 알고리즘에 삽입됩니다.

Laminar 프레임워크의 주요 이점은 정체 제어와 전송 스케줄링을 별도의 하위 시스템으로 분할함으로써 훨씬 더 단순한 설계 제약의 적용을 받으므로 이전의 코드 구성으로는 실현할 수 없는 많은 새로운 알고리즘을 더 쉽게 개발할 수 있다는 점입니다.

Laminar 프레임워크는 TCP 정체 제어의 기본 설계 철학을 바꾸며 패치 자체에 국한되지 않는 광범위한 영향을 미칠 수 있습니다. 이 패치는 사용자가 코드를 실험하고, 주석을 달고, 간과되었을 수 있는 특이 사례를 발견할 수 있도록 하기 위한 것입니다. 또한 많은 알고리즘이 여전히 누락되어 있다는 점에서 패치는 불완전합니다. 특히 CUBIC 및 Reno 이외의 정체 제어 알고리즘, cwnd 유효성 검사, 대상 측정항목 등입니다. 사람들이 이러한 다른 알고리즘의 리팩터링을 지원하는 데 도움을 줄 수 있다면 큰 도움이 될 것입니다.

Laminar 프레임워크와 그 동기는 인터넷 초안 draft-mathis-tcpm-tcp-laminar에 자세히 설명되어 있습니다.

의견과 제안사항은 mattmathis@google.com으로 보내 주세요.

이 프로젝트는 프로토콜 개선을 통해 웹을 더 빠르게하려는 Google의 노력의 일환입니다.

구현 참고사항

Laminar는 주로 다음 세 가지 함수 (tcp_input.c)로 구현됩니다.

Tcp_cong_avoid() 및 tcp_mult_decr()는 CCwin 상태 변수를 사용하여 AIMD 정체 제어를 수행합니다. 실행취소를 제외하고 이 두 함수에서만 CCwin이 변경됩니다. 두 함수 모두 정체 모듈별 핸들러를 호출합니다.

Tcp_laminar_schedule()은 각 ACK에 대한 응답으로 전송할 데이터 양을 결정합니다. Van Jacobson 패킷 보존을 구현하고 tcp_packets_in_flight()가 CCwin으로 수렴되도록 약간 위아래로 조정합니다.

tcp_packets_in_flight() 에스티메이터에 중요한 변경사항이 있어 대부분의 프로토콜 이벤트에서 변경되지 않습니다. 애플리케이션이 중단되고 tcp_laminar_schedule()의 조정과 실제 패킷 손실이 tcp_packets_in_flight()를 변경합니다. ACK 처리, TSO 및 대부분의 기타 이벤트는 그렇지 않습니다. 손실이 있는 경우 진행 중인 실제 패킷 수는 즉시 변경되지만 재전송 기계에서 손실로 표시하고 Lost_out을 늘릴 때까지 tcp_packets_in_flight() 에스티메이터에 반영되지 않습니다.

패치 받기

패치는 Dave Miller의 net-next에 맞으며 3.5-rc2에 깔끔하게 적용됩니다.
NB: Reno 및 CUBIC 이외의 정체 제어 모듈은 업데이트되지 않았으며 컴파일되지 않습니다. 구성에서 Vegas, 확장 가능, 고속 등 다른 정체 제어 모듈을 빌드하는 경우 먼저 해당 모듈을 사용 중지해야 합니다.