TCP를 소개하는 마지막 글이다. TCP가 커넥션을 맺는 방법과 Congestion Control을 자세히 알아보자. TCP는 신뢰성 있는 전송을 제공하는 것이 기본적인 목적인 만큼 Control에 관해선 할 말이 많다.
TCP 연결 관리
- TCP은 Connection Oriented Protocol이다.
- 데이터 전송을 보장하는 파라미터들을 각자 설정하기 위해 연결을 맺는다.
- 2 Way Handshaking의 문제점
- 클라이언트는 서버가 alive 상태인 것을 확인할 수 있다.
- 하지만 서버는 클라이언트의 SYN 메세지가 언제 전송된 것인지, 혹은 이미 종료된 연결의 SYN 메시지인 지 알 수 없다.
- 서버 측도 클라이언트가 alive 상태인 것을 확인하기 위해 3 way Handshaking을 한다.
- 3 Way Handshaking
- 클라이언트는 SYN M을 보낸다
- 서버는 ACK M+1과 SYN N을 보낸다.
- 클라이언트는 ACK N+1과 경우에 따라서 payload를 실어서 보낸다.
- 쉽게 설명하자면 클라이언트도 서버가 살아 있는지 확인하고, 서버도 클라이언트가 살아있는지 확인하는 과정이다.
- TCP 연결 해제
- 클라이언트는 FIN flag를 1로 설정하고 보낸다.
- 서버는 ACK를 보내고 남은 데이터를 전송해준 후 FIN 플래그를 1로 설정해서 보낸다
- 클라이언트는 서버 측 FIN에 대해 ACK를 보내고 ACK 를 받은 서버는 연결 해제된다.
- 클라이언트는 ACK가 사라졌을 경우를 대비해 max segment lifetime의 2배만큼 기다렸다가 종료한다.
- 서버가 보낸 FIN 에 대한 ACK가 사라졌을 경우 서버는 계속 연결을 유지하고 있는 상태가 된다.
Congestion Control
- 애플리케이션의 전송량과 수신측에서 실제로 받는 데이터 양의 비교
- 애플리케이션이 시간당 점점 많은 양을 보내면 수신 측에서 중복을 제외하고 실제로 받는 양은 점점 늘어나지만
- Link Capacity의 절반도 차기 전에 Congestion으로 인한 Loss와 불필요한 Retransmission으로 실제로 받는 양은 급격히 줄어든다.
- 따라서 혼잡을 피해 적당히 보내는 것이 중요하다.
- Congestion Control의 두가지 방법
- End to End Approach : End System에서 Congestion Control을 한다.
- Network Assisted : Network가 Congestion Control을 한다.
- 코어는 전송만 담당해야 한다는 인터넷의 원칙에 따라 TCP는 End to End Approach를 사용한다.
- AIMD : Additive Increase Multiplicate Decrease (마치 주식투자 같다.)
- CWND : Congestion Window
- 지난 포스팅에서 여러 번 설명했던 CWND에 대해 더 자세히 알아보자
- CWND : RWND를 무시할 때 송신 측이 ACK 없이 보낼 수 있는 data의 크기이다.
- CWND를 더해나가다가 Loss가 발생하면 (3 duplicated ack, timeout으로 탐지) 확 줄인다.
- 초기 CWND는 작은 값이므로 Slow Start라고 한다.
- Tahoe mode : CWND를 1 MSS로 줄이고 다시 Exponential 하게 증가한다.
- Reno mode : CWND를 현재 CWND의 반으로 줄이고 선형적으로 증가시킨다.
- ssthreshold와 CWND의 값이 같게 되어 혼잡 회피(Congestion Avoidance) 단계부터 시작한다.
- CWND : Congestion Window
- TCP Slow Start
- 초기 CWND는 1 MSS이다. (Slow 한 상태)
- MSS : Maximum Segment Size
- 각 ACK를 정상적으로 받을 때마다 CWND를 1 MSS 만큼씩 증가시켜서
- 1 RTT마다 CWND는 두배씩 증가하게 된다.
- 초기 CWND는 1 MSS이다. (Slow 한 상태)
- TCP Congestion Avoidance
- 혼잡이 일어날 때까지 CWND를 두배씩 증가시킬 순 없다!
- Slow Start Threshold ( Threshold : 한계점)
- 줄여서 ssthresh라고 한다.
- ssthresh의 값은 임의로 설정된 값이다.
- CWND가 ssthresh보다 커지면 Congestion Avoidance로 진입한다.
- Congestion Avoidance에서는 CWND를 1 RTT마다 1 MSS 씩 늘려나간다.
- Loss가 발생하면 ssthresh는 현재 CWND의 절반이 된다.
- 그러므로 Reno 모드에서는 Loss 발생 시 혼잡 회피 단계부터 시작하게 된다.
- 시간에 따른 CWND는 톱니 모양이다.
- TCP의 평균 전송량은 (3/4)*(평균 CWND/RTT)가 된다.
- TCP Throughput의 정확한 계산
- (1.22*MSS) / (RTT * root(L))이다.
- 빠른 속도를 유지하려면 새로운 버전의 TCP가 필요하게 된다.
- TCP Fairenss
- Slow Start를 무시하고 두 연결이 링크로부터 같은 거리에 있다고 할 때
- 두 연결의 처리율은 Capacity 절반에 수렴한다.
더보기
본 게시물은 kocw 이화여자대학교 이미정 교수님의 컴퓨터 네트워크 강의를 듣고 정리한 글임을 밝힙니다.
내용상 틀린 부분이 있을 수도 있으며 이에 대한 책임을 지지 않습니다.
틀린 부분이나 오타 지적은 댓글로 남겨주세요.
'컴퓨터 네트워크' 카테고리의 다른 글
네트워크 14강 - Inside Router, IP (0) | 2020.08.11 |
---|---|
네트워크 13강 - Network Layer의 소개 (0) | 2020.08.10 |
네트워크 11강 - TCP part.2 (0) | 2020.08.10 |
네트워크 10강 - TCP part.1 (0) | 2020.08.10 |
네트워크 9강 - Transport Layer 개론 (0) | 2020.08.10 |