admin write
blogblogblogbloglocation loglocation logtag listtag listguest bookguest book
rss feed

SCTP의 congestion control의 경우, multi-homing을 지원하기 때문에 양 쪽의 endpoint에 다른 data path가 생길 수 있다. (primary addr에서 secondary addr로 바뀔 때) 그러므로, 이상적으로 이것을 구현하려면, 서로 다른 path에 다른 congestion control parameter 가 필요하다.

현재의 SCTP congestion control 알고리즘은 :
sender는 같은 dest addr을 upper layer에서 알려짐 받은 대로 전송하지만, SCTP는 dest addr가 inactive할 경우, alternative dest로 전송하는데 이럴 경우 다른 addr로 전송하게 된다.
sender는 분리된 congestion control parameter set를 서로 다른 dest addr별로 가지고 있다. (각각의 dest에 대해, not source-dest)
이 parameter 들은, 오랫동안 쓰이지 않을 경우 파괴된다.
각각의 dest addr에 대해, endpoint는 첫번째 transmission때 slow-start로 전송하기 시작한다.
SCTP에서는 4개의 Duplicated SACK을 전송 받을 때, fast retransmission을 수행한다.

TCP의 경우, 한 TCP session에서 upper-layer protocol로 data를 올릴 때, 순서대로 (in-sequence) data를 전송한다. TCP에서 gap이 발생한다면, gap이 채워질 때 까지 기다렸다가 data를 전송한다.(즉, missing data보다 seq num이 위일 때 까지)
SCTP의 경우, TSN 상, gap이 발생해도 그냥 upper layer로 전송한다. 단, 같은 stream임을 나타내는 SSN이 particular stream에 대해 순서대로 있을 때 전송한다. 혹은 unordered delivery가 indicated 되도 올린다. 이것은 cwnd에는 영향을 미치지 않지만, rwnd에는 영향을 미칠 수 있다.
(이말은 즉, 전체 window size에는 영향을 미칠 수 있다는 이야기)

SCTP의 congestion control은 association 별로 이루어 진다.( not  to an individual stream)
TCP처럼, SCTP도 다음 세가지의 variable로 transmission rate을 정한다.

Receiver advertised window size, RWND
(incoming packet에 대한 buffer 크기에 따라 receiver가 결정, association별로 가지고 있음)
Congestion control window, CWND
(network condition을 기반으로 sender에 의해 결정 됨, destination addr별로 가지고 있음)
Slow-start threshold, SSTHRESH
(sender에 의해 이용 되는 것으로 slow start와 congestion avoidance 단계 결정할 때 쓰임, dest addr 별로 가지고 있음)
partial_byte_acked (congestion avoidance 단계에서 cwnd 조정을 쉽게하기 위해 쓰인다.)

SCTP에서는 각각의 Dest addr에 대해 ssthresh와 partial_byte_acked를 가지고 있다.

Slow-start in SCTP
Network의 available capacity를 측정하기 위해서는 slow start는 transfer 시작에 쓰인다. 혹은,  retransmission timer에 의해 발견된 loss를 repair하기 위해 쓰이기도 한다.

Congestion avoidance in SCTP
partial_bytes_acked를 0으로 세팅
cwnd가 ssthresh보다 크고, SACK이 cumultative ack point를 증가시킬 때, partial_bytes_acked 를 증가시킨다.
SACK이 도착하기 전이고 partial_bytes_acked가 cwnd보다 크거나 같아 지면 SENDER가 cwnd를 증가시키고, partial_bytes_acked를 partial_bytes_acked -cwnd 로 reset 시킨다
slow start와 같이 sender가 주어진 transport addr에  data를 전송하지 않을때, transport의 cwnd이 RTO당 max로 조정된다.(cwnd/2, 2*MTU)

*RTO (Retransmission TimeOut)
lost segment를 다시 전송하기 위해 TCP는 RTO를 조절하는 retransmission timer(segment의 ack을 위한 기다리는 시간)를 사용한다. TCP가 segment를 전송할때, retransmission timer를 몇몇의 특별한 segment에 대해 만든다.
특별한 segment의 case
1.timer가 시작하기 전에, 만약에 어떤 segment 의 ack을 받았다면, timer는 파괴된다.
2.ack이 도착하기전에 timer가 시작하면, segment는 retransmit되고 timer는 reset된다.
RTO의 경우, Smoothed RTT와 RTT Deviation을 이용하여 구한다.
RTO = Smoothed RTT + 4 . RTT Deviation

*RTT (Round Trip Time)
RTO를 계산하려면, RTT를 계산해야한다. 그러나 TCP에서의 RTT계산은 복잡한 process임
- Measured RTT
우리는 send a segment와 receive an ack이 얼마나 걸리는지 알아야 한다. 이것이 Measured RTT인데, 그러나 그들의 one-to-one relationship을 맺고 있지는 않다. 몇몇 segment는 같이 ack되기도 한다. mearsured rtt는 비록 ack이 다른 segments도 같이 ack되더라도 이 ack에 걸리는 time과 segment가 dest에 도착하는 시간을 포함한다. 이 RTT 측정에는 다른 measurement가 시작되지 않는다.
-Smoothed RTT
현재의 인터넷은 그 변동이 많이 심하기 때문에 Measured RTT의 경우 RTO목적에 적합하지 않다. Smoothed RTT가 조금더 적합한데, 이 것은 Measured RTT의 평균에 Smoothed RTT를 첨가해 계산한다.
-RTT Deviation
Smoothed RTT와 Measured RTT를 이용하는데, 대부분의 implementation은 이것을 이용한다.