TCP는 연결형, 신뢰성 있는 프로토콜이다. TCP는 연결형 서비스를 제공하기 위하여 분명하게 연결 설정, 연결 해제 단계를 정의한다. TCP는 신뢰성을 제공하기 위해 Go-Back-N과 Selective-Repeat의 결합을 사용한다.
1. TCP 서비스
- 프로세스 대 프로세스 통신
TCP는 UDP처럼 포트 번호를 사용하여 프로세스 간 통신을 제공한다.
- 스트림 전달 서비스
TCP는 스트림 중심 프로토콜이다. TCP에서 송신 프로세스는 바이트 스크림으로 데이터를 전달하고 수신 프로세스도 바이트의 스트림으로 데이터를 수신하도록 만든다.
송신 및 수신 프로세스는 똑같은 속도로 데이터를 만들고 처리할 수 없기 때문에 TCP는 저장을 위해서 버퍼가 필요하다. 버퍼를 구현하는 한 방법은 1바이트 구역의 원형 배열을 사용하는 것이다.
TCP는 확인응답 메시지를 받을 때까지 버퍼에 이 데이터를 유지한다. 색깔이 있는 영역은 전송 TCP에 의해 송신될 바이트들이다. 회색 영역에 있는 바이트들이 확인 응답을 받은 후에는 그 영역은 다시 재생되어 송신 프로세스에 의해 사용이 가능하다.
전송층에서 TCP는 세그먼트라고 하는 패킷으로 다수의 바이트를 묶어서 그룹화를 한다. TCP는 각 세그먼트에 헤더를 붙이고 전송을 위해 IP계층으로 세그먼트를 전달한다. 세그먼트들은 IP 데이터그램으로 캡슐화되고 전송된다. 이러한 전체 동작은 수신 프로세스에게는 투명하다. 나중에 세그먼트들이 순서가 바뀌거나, 손실 또는 훼손된 상태로 수신될 수 있으며 재전송될 수 있음을 볼 것이다.
- 전이중 통신
TCP는 전이중 서비스(Full-Duplex)를 제공하여 데이터는 동시에 양 방향으로 전달될 수 있다. 각 TCP는 송신 및 수신 버퍼를 가지고 있으며, 세그먼트는 양 방향으로 이동한다.
- 다중화와 역다중화
- 연결형 서비스
TCP는 연결형 프로토콜이다. A사이트에 있는 프로세스가 B사이트에 있는 다른 프로세스로부터 데이터를 송신하고 수신하기를 원한다면 다음의 과정이 일어난다.
- 2개의 TCP는 두 사이트 사이에 연결을 설정한다.
- 양 방향으로 데이터를 교환한다.
- 연결이 종료된다.
- 신뢰성 있는 서비스
TCP는 데이터의 안전하고 확실한 도착을 확인하기 위하여 확인응답 기법을 사용한다.
2. TCP 특징
- 번호부여 시스템
Byte Number
TCP는 연결 상태에서 전송되는 모든 데이터 바이트에 번호를 부여한다. 번호지정은 각 방향에서 독립적이다. 번호는 0에서 2^32-1사이에서 임의로 만들어진 번호로 시작한다.
Sequence Number
바이트들에 대한 번호가 매겨진 후, TCP는 전송되는 각 세그먼트에게 순서 번호를 할당한다. 각 방향에서의 순서 번호는 다음과 같이 정의된다.
- 첫 번째 세그먼트의 순서 번호는 임의 번호인 ISN(초기 순서 번호)이다.
- 어떤 다른 세그먼트의 순서 번호는, 이전 세그먼트의 순서 번호에 이전 세그먼트에 의해 전달된 바이트의 수를 합한 것이다.
Acknowledgment Number
연결이 설정되었을 때 양쪽에서 동시에 데이터를 송수신할 수 있다. 양측은 각각 대개 서로 다른 시작 바이트 번호로 바이트 번호를 부여한다. 그러나 확인 응답 번호는 상대방이 수신해야 하는 다음 바이트의 번호를 정의한다. 또한 확인응답 번호는 누적된다.
3. 세그먼트
TCP에서는 패킷을 세그먼트라고 한다. 세그먼트는 20 ~ 60바이트의 헤더와 응용 프로그램으로부터 온 데이터로 구성된다. 헤더는 선택항목이 없다면 20바이트이며, 선택항목이 있다면 60바이트까지이다.
4. TCP 연결
TCP는 연결형 전송 프로토콜로서 발신지와 목적지 사이에 가상 경로를 설정한다. 한 메시지에 속하는 모든 세그먼트들은 이 가상 경로를 통해서 전송된다. 전체 메시지를 위하여 단일 가상 경로를 사용하는 것은 훼손되거나 손실된 프레임의 재전송뿐만 아니라 확인응답 프로세스를 가능하게 한다. TCP 연결은 물리적이지않고 바로 가상이라는 점이다.
- 연결 설정
TCP는 전이중 모드로 데이터를 전송한다. 2개의 시스템에 있는 2개의 TCP가 연결될 떄 동시에 서로 다른 세그먼트를 송신할 수 있다. 이것은 양쪽이 각각 통신을 초기화해야 하고, 데이터를 전송하기 전에 다른 쪽으로부터 승인을 받야아 한다는 것을 의미한다.
- 데이터 전송
연결이 설정된 후에 양방향으로 데이터 전송이 발생한다. 클라이언트와 서버 모두 데이터와 확인응답을 보낼 수 있다. 확인응답은 데이터와 함께 피기백된 것이다.
데이터 밀어넣기
수신 TCP는 데이터가 도착하면 버퍼에 저장하고, 응용 프로그램이 준비가 되거나 또는 수신 TCP가 사용하기에 좋다고 느껴질 떄 응용프로그램으로 데이터를 전달한다.
예를 들어 한쪽에 있는 응용 프로그램이 다른 쪽에 있는 응용프로그램에게 키를 입력한 것을 보내고 즉시 응답을 수신하기를 원한다. 데이터의 지연 전송과 지연 전달은 이 응용 프로그램에게 적합하지 못할 수 있다. TCP는 이런 상황을 처리할 수 있다. 송신 부분에 있는 응용 프로그램은 밀어넣기(PUSH) 동작을 요청할 수 있다. 이것은 송신 TCP는 창이 채워지는 것을 기다려서는 안 된다는 것을 의미한다.
긴급 데이터
각 데이터 바이트는 스트림에서 위치를 가진다. 그러나 응용프로그램이 긴급 바이트를 송신살 필요가 있는 경우가 있고, 이것은 한 부분의 데이터가 수신 응용 프로그램에 의해 특별한 방법으로 처리되기를 송신 응용 프로그램이 원한다는 것을 의미한다. 해결 방법은 URG 비트를 설정한 세그먼트를 전송하는 것이다.
연결 종료
대개 클라이언트에 의해 시작되지만 데이터를 교환하는 데 참여한 양쪽의 어느 한쪽에서 연결을 종류할 수 있다.
세 방향 핸드셰이킹
절단-폐쇄
연결 재 설정
한 종단의 TCP가 연결 요구를 거부할 수도 있고, 현재 연결을 중지하거나, 혹은 유휴 연결을 종료할 수도 있다.
5. 상태 천이도
연결 설정, 연결 종료, 그리고 데이터 전송 동안 발생하는 모든 다른 이벤트를 추적하기 위하여, TCP는 유한 상태 기기(FSM)를 규졍한다.
6. TCP의 창
TCP는 데이터 전송을 위한 각 방향에 대해서 2개의 창을 사용하며, 따라서 양방향 통신을 위하여 4개의 창이 필요하다.
-송신 창
사용되는 창의 크기는 100바이트이지만 뒷부분에서 송신 창 크기는 수신자와 하부 네트워크의 혼잡에 의하여 조절되는 것을 볼 수 있다. TCP의 송신 창은 선택적 반복 프로토콜(SR)에서 사용하는 것과 유사하지만 다음과 같은 차이점이 있다.
- 창과 관련된 개체 자체의 차이. 선택적 반복에서 창은 패킷의 번호를 나타내지만, TCP의 창은 바이트 번호를 나타낸다.
- 어떤 구현에서는 TCP는 프로세스로부터 데이터를 수신하고 추후에 그것들을 전송하지만, 여기에서는 송신 TCP가 프로세스로부터 데이터를 수신하자마자 데이터에 대한 세그먼트를 전송할 수 있다고 가정하였다.
- TCP 프로토콜은 단지 하나의 타이머만 사용한다.
- 수신 창
TCP의 수신 창과 선택적 반복에서 사용되는 창은 다음 두 가지의 차이점이 있다.
- TCP에서 응용 프로세스가 자신의 속도로 데이터를 읽어갈 수 있다. 수신 창의 크기는 항상 버퍼의 크기보다 작거나 같다. rwnd = buffer size - number of waiting bytes to be pulled
- TCP에서 주된 확인응답 메커니즘은 수신받기를 기대하는 다음 바이트를 알려주는 누적 확인응답 방법이다.
7. 흐름 제어
흐름 제어는 생산자가 데이터를 만드는 속도와 소비자가 데이터를 사용하는 속도의 균형을 맞추는 것이다. TCP는 흐름제어와 오류제어를 구분한다.
- 창 열기와 닫기
연결이 설정될 떄 버퍼의 크기는 고정되지만, 흐름 제어를 수행하기 위하여 TCP는 송신측과 수신측으로 하여금 자신의 창 크기를 조정하도록 한다. 송신 창은 새로운 확인응답이 도착하는 경우에는 닫힌다. 송신 창은 수신측으로부터 광고되는 수신 창 크기에 의해서 열린다.
-창 축소
수신창은 축소될 수 없다. 그렇지만 수신측에서 창의 축소를 야기하는 rwnd값을 통보하는 경우에 송신 창은 축소될 수 있다. 어떤 구현은 송신 창이 축소되는 것을 허용하지 않는다.
8. 오류 제어
TCP는 신뢰성 있는 전송층 프로토콜이다. 즉 데이터 스트림을 TCP로 전달하는 응용 프로그램은 TCP가 전체 스트림을 순서에 맞고 오류 없이, 또한 부분적인 손실이나 중복 없이 상대편에 있는 응용 프로그램에게 전달함을 확신하는 것을 의미한다.
- 검사합
각 세그먼트에는 검사합 필드가 있으며, 이 필드는 세그먼트가 훼손되었는지를 검사하기 위해 사용된다. TCP는 모든 세그먼트에 필수 사항인 16비트 검사합을 이용한다.
- 확인응답
데이터를 포함하지는 않지만 하나의 순서 번호를 소비하는 제어 세그먼트도 역시 확인응답이 된다. ACK 세그먼트는 결코 확인응답되지 않는다.
누적 확인응답(ACK): 본래 TCP는 세그먼트의 수신을 누적하여 확인응답할 수 있도록 설계되었다. 헤더에서 32비트이다.
선택 확인응답(SACK): 헤더 옵션의 발신인에 대한 추가 정보. 경우에만 순서가 잘못된 바이트 및 중복된 바이트 보고한다.
- 재전송
오류 제어 메커니즘의 핵심은 세그먼트의 재전송이다. 전송된 세그먼트는 확인응답되기 전까지 버퍼에 저장된다. 재전송 타이머가 만료되거나 송신측 버퍼에 있는 첫 번째 세그먼트에 대한 3개의 중복 ACK를 수신하는 경우에는 세그먼트가 재전송된다.
RTO(Retransmission time-out): 타이머 값, RTT(왕복 시간)를 기준으로 업데이트됨
Three Duplicat ACK segments: RTO가 상당히 큰 경우 빠른 재전송 시나리오
- 순서에 맞지 않는 세그먼트
현재의 TCP에서는 순서에 맞지 않게 들어오는 세그먼트를 버리지 않고, 그 세그먼트를 일시적으로 저장하며, 분실된 세그먼트가 도착하기 전까지는 이 세그먼트를 순서에 맞지 않는 세그먼트로 표시한다. 그렇지만 순서에 맞지 않는 세그먼트를 프로세스로 전달하지는 않는다. TCP는 데이터가 순서에 맞게 프로세스에 전달되도록 한다.
- TCP에서 데이터 전송을 위한 FSM
TCP에서의 데이터 전송은 Go-Back-N(GBN)와 유사한 면이 있지만 선택적 반복(SR)프로토콜에 더 비슷하다. TCP는 순서에 어긋난 세그먼트를 수신하기 때문에 선택적 반복 프로토콜과 유사하게 동작한다고 간주할 수 있지만, 고유의 확인응답은 누적이기 떄문에 GBN처럼 보인다. 그렇지만 SACK를 이용하는 TCP는 SR에 더 가깝다.
- 몇 가지 시나리오
Rule1: 엔드 A가 엔드 B로 데이터 세그먼트를 전송할 때 수신할 것으로 예상되는 다음 시퀀스 번호를 제공하는 (피기백) 및 수신 확인을 포함해야 한다.. 이 규칙은 필요한 세그먼트 수를 줄여 트래픽을 줄인다.
Rule2: 수신기에 전송할 데이터가 없고 세그먼트를 수신하고 순서대로 세그먼트(예상 시퀀스 번호 포함)를 정렬하고 이전 세그먼트가 이미 승인된 경우, 수신기는 다른 세그먼트가 도착할 때까지 또는 일정 기간(500ms)이 경과할 때까지 ACK 세그먼트 전송을 지연한다. 이 규칙은 ACK 세그먼트를 줄인다.
Rule3: 세그먼트가 수신기에 의해 예상되는 시퀀스 번호와 함께 도착하고 이전 순서 세그먼트가 확인되지 않은 경우, 수신기는 즉시 ACK 세그먼트를 전송한다. 이렇게 하면 불필요한 세그먼트 재전송을 방지할 수 있다.
Rule4: 예상보다 높은 순서 외 시퀀스 번호를 가진 세그먼트가 도착하면 수신기는 즉시 다음 예상 세그먼트의 시퀀스 번호를 알리는 ACK 세그먼트를 전송한다. 이것은 빠른 재전송이다.
Rule5: 누락된 세그먼트가 도착하면 수신기는 ACK 세그먼트를 전송하여 예상되는 다음 시퀀스 번호를 알린다. 이렇게 하면 누락된 것으로 보고된 세그먼트가 수신되었음을 수신기에 알린다.
Rule6: 중복 세그먼트가 도착하면 수신기는 세그먼트를 폐기하지만, 즉시 다음 순서로 예상되는 세그먼트를 나타내는 ACK를 전송한다. 이것은 ACK 세그먼트 자체가 손실될 때 몇 가지 문제를 해결한다.
9. TCP 혼잡 제어
TCP는 네트워크에서 혼잡 제어를 위해 서로 다른 정책을 사용한다.
- 혼잡 창
TCP에서 흐름 제어를 논의할 때, 전송 창 크기는 반대 방향에서 각 세그먼트 전송을 알리는 rwnd의 값을 사용하는 수신측에 의해 제어됨을 언급했다. 이러한 전략을 사용하는 것은 수신한 바이트들에 의해 수신 창이 절대 오버플로우 되지 않는것을 보장한다.
전송되는 세그먼트들의 개수를 제어하기 위해, TCP는 네트워크의 혼잡 상황에 의해 제어되는 윈도우 크기인 혼잡 창(cwnd)이라 불리는 또 다른 변수를 사용한다. cwnd변수와 rwnd변수는 TCP에서 함께 전송 창 크기를 정의한다. 실제 창 크기는 두 값의 최솟값이다.
- 혼잡 감지
cwnd 값을 설정하고 변경하는 방법에 대해 논의하기 전에 TCP 송신자가 네트워크에서 발생할 수 있는 정체를 탐지할 수 있는 방법을 설명해야한다. TCP 송신자는 네트워크에서 타임아웃과 3개의 중복 ACK의 두 가지 이벤트 발생을 사용한다.
첫 번째는 타임아웃이다. TCP 송신자가 시간 초과가 발생하기 전에 세그먼트 또는 세그먼트 그룹에 대한 ACK를 수신하지 않으면 해당 세그먼트 또는 세그먼트가 손실되고 손실이 정체로 인해 발생한다고 가정한다.
다른 이벤트는 3개의 중복 ACK의 수신이다. TCP 수신자가 중복된 ACK를 응답하면, 이것은 세그먼트가 지연되었다는 신호이다. 그러나 3개의 중복 ACK를 보내는 것은 네트워크에서 혼잡 때문에 세그먼트가 손실된 것이다.
- 혼잡 정책
혼잡을 통제하기 위한 TCP의 전반적인 정책은 세 가지 알고리즘에 바탕을 둔다. 느린 시작, 혼잡 회피, 그리고 빠른 회복이다.
느린시작: 지수 증가
느린 시작 알고리즘에서 혼잡 창(cwnd)의 크기는 최대 세그먼트 크기(MSS)에서부터 시작한다. MSS는 연결 설정 과정 동안 동일한 이름의 옵션을 이용하여 협상된다.
ACK 처리된 각 세그먼트에 대해 TCP는 허용 창 크기의 1/2 임계값에 도달할 때까지 정체 창의 크기를 늘린다. 창의 크기가 기하급수적으로 증가한다.(2^n)
혼잡 회피: 가산 증가
혼잡을 사전에 방지하려면 기하급수적인 증가 속도를 늦춰야 한다. 크기가 임계값에 도달한 후 ACK가 여러 세그먼트에 대한 것인 경우에도 각 ACK에 대해 한 세그먼트씩 크기가 증가한다. ACK가 해당 시간 초과 또는 정체 창 크기가 수신기 창 값에 도달하기 전에 도착하는 한 이 전략은 계속된다.
- 정책 전환
지금부터의 문제는 각 정책이 언제 사용되고, TCP가 언제 하나의 정책에서 다른 정책으로 움직이냐는 것이다. 이 질무넹 대답하기 위해 TCP의 세 가지 버전인 Taho TCP, Reno TCP와 New Reno TCP에 대해 언급할 필요가 있다.
Taho TCP
Taho TCP로 알려져 있는 초기 TCP는 그들의 혼잡 정책에 오직 서로 다른 두 가지 알고리즘이 느린 시작과 혼잡 회피 알고리즘을 사용하였다. 그러나 중복 ACK수의 증가 및 재설정과 같은 몇가지 사소한 작업을 삭제하여 FSM을 덜 복잡하고 단순하게 만들어야 한다.
Taho TCP는 혼잡 감지, 타임아웃, 그리고 3개의 중복된 ACK을 발견하기 위해 2개의 신호를 이용한다. ACK가 도착할 때마다 혼잡 창 크기는 1씩 증가한다. 만약 혼잡이 감지되면 TCP는 즉시 이러한 곡격적인 증가를 가로막고 임계치를 현재 cwnd의 절반으로 제한하고 혼잡 창을 1로 재설정하여 새로운 느린 시작 알고리즘을 다시 시작한다.
혼잡 회피 상태에서 혼잡 창 크기는 ACK의 크기가 현재 창 크기와 같아질때마다 1씩 증가된다. 만약 이 상태에서 혼잡이 탐지되면, TCP는 다시 ssthresh의 값을 현재 cwnd 값의 반으로 재설정하고 다시 느린 시작 상태로 이동한다.
Reno TCP
세 가지 버전의 TCP 중에서 Reno 버전이 오늘날 가장 일반적이다. 이 버전에서는 대부분의 경우 3개의 중복 ACK를 관찰하여 정체를 감지하고 처리하는 것으로 관찰되었다. 일부 제한 시간 이벤트가 있더라도 TCP는 공격적인 기하급수적인 증가를 통해 이러한 이벤트를 복구한다.
이 버넞에서 만약 타임아웃이 일어나면, TCP는 느린 시작 상태로 들어간다. 또 한편으로는 만약 3개의 중복된 ACK가 도착하면, TCP는 빠른 회복 상태로 전환하고, 더 중복된 ACK들이 도착하는 한 같은 상태를 유지한다. 이것은 cwnd가 지수적으로 증가하는 느린 시작처럼 작동한다. 그러나 cwnd는 ssthresh에 3MSS을 더한 값에서 시작한다.
10. 선택 사항
TCP헤더에는 최대 40바이트의 선택사항 정보가 있을 수 있다. 이러한 선택사항 정보들은 목적지에게 부가 정보를 전달하거나 또는 다른 선택사항의 정렬을 맞추기 위하여 사용된다.
'Study > Networking' 카테고리의 다른 글
10.1 응용층 소개 & 10.2 클라이언트-서버 패러다임 (1) | 2023.06.03 |
---|---|
9.5 스트림 제어 전송 프로토콜(SCTP) (0) | 2023.06.03 |
9.3 사용자 데이터그램 프로토콜(UDP) (0) | 2023.06.03 |
9.1 전송층 서비스(TransportLayer Service) & 9.2 전송층 프로토콜 (2) | 2023.05.30 |
8.3 유니캐스트 라우팅 프로토콜 & 8.4 멀티캐스트 라우팅 (1) | 2023.04.16 |