전송 제어 프로토콜(TCP)(네트워크보안)(Wireshark로 배우는 컴퓨터 네트워크)
용어정리
본문정리
TCP 서비스
프로세스-대-프로세스 통신
포트 번호를 이용하여 프로세스-대-프로세스 통신을 제공한다.
스트림 전달 서비스
스트림 기반의 프로토콜이다. UDP에서 프로세스는 미리 정해진 크기의 메시지를 전달한다. 여기에 자신의 헤더를 붙인후 IP에 전달한다. 프로세스가 전달하는 각 메시지를 사용자 데이터그램이라 한다. 송·수신 프로세스는 바이트 스트림 형태로 데이터를 주고 받는다.
송·수신 프로세스가 동일한 속도가 아닐 수 있어 버퍼가 필요하다. 버퍼 중 순환 버퍼를 이용할 수 있다. 송신의 버퍼는 빈 공간·전송되었지만 확인응답되지 않은 공간·전송할 공간(예제에서 공간 단위는 1바이트이다.)으로 구성되어 있고 수신의 버퍼는 빈공간·수신되었지만 프로세스가 읽지 않은 공간으로 구성되어 있다.
IP는 바이트 스트림 형태가 아닌 패킷 형태로 데이터를 전달한다. TCP는 일련의 바이트를 세그먼트라는 패킷으로 그룹화 한다.
전이중 통신
데이터를 동시에 양방향으로 전송할 수 있다.
다중화와 역다중화
UDP와 같지만 TCP는 연결형 프로토콜이므로 해당 프로세스들 간에 연결이 설정되어야 한다.
연결형 서비스
TCP 세그먼트는 IP 데이터그램으로 캡슐화되어 순서에 어긋나게 전송되거나 손실되거나 훼손되면 재전송 될 수 있고, 다른 경로를 거쳐 목적지에 전달될 수 있다. 다만 TCP는 연결형으로 상대방에게 순서에 맞게 바이트를 전달할 책임이 있다.
신뢰성 서비스
확인응답 메커니즘을 이용한다.
TCP 특징
번호와 시스템
세그먼트 헤더에는 세그먼트 번호 값이 없지만 순서 번호와 확인응답 번호가 있다. 이건 세그먼트가 아닌 바이트 번호와 관련이 있다.
TCP는 모든 데이터 바이트에 번호를 매기는데 , 각 방향에 대해 독립적이고 각 바이트마다 번호를 매긴다. 0부터 시작할 필요는 없다. 0에서 2^32-1 사이의 임의의 값을 선택하여 처음 바이트로 설정한다. 바이트 순서화는 흐름 제어와 오류 제어에서 사용한다.
순서 번호는 첫 번째 바이트에 해당 바이트 크기를 더한 값으로 정한다.(p.514) 즉 세그먼트 내의 순서 번호 필드 값은 그 세그먼트에 포함되는 첫 번째 데이터 바이트의 번호를 나타낸다. 순서 번호는 데이터와 제어정보(피기백킹)을 전달하는데 사용된다. 사용자 데이터를 전달하지 않는 세그먼트는 논리적으로 순서 번호를 가질 필요는 없다. 필드는 있지만 값은 유효하지 않다. 하지만 제어 정보만을 가지는 세그먼트는 순서 번호를 필요로 하며 수신 측으로부터 확인응답된다. 이 세그먼트는 연결 설정, 해제, 중단을 위해 사용된다.
TCP에서 통신은 양방향으로 이루어진다. 순서번호는 위와 같고 확인응답 번호는 자신이 수신하기를 기대하는 다음 바이트의 번호를 이용한다. 확인응답번호는 누적되는데 이는 확인응답번호로 5643을 이용했다면 5642까지 모든 바이트를 수신했다는 의미이다.
흐름 제어
송신 프로세스와 송신TCP사이, 송신 TCP와 수신TCP 사이의 데이터 양을 조절한다. TCP는 바이트 흐름을 조절하기 위해 번호화 시스템을 이용한다.
오류 제어
세그먼트가 오류 감지를 위한 데이터 단위이지만, 오류 제어는 바이트 단위로 동작한다.
혼잡 제어
송신 측에서 전송되는 데이터의 양은 수신측에 의해서 조절될 뿐만 아니라 네트워크 혼잡 정도에 의해서도 결정된다.
세그먼트
TCP 에서 패킷을 세그먼트라 한다.
형식
헤더는 기본적으로 20바이트이고 최대 60바이트까지 구성된다.
발신지, 목적지 포트 주소 : 16bit이다.
순서 번호 : 32bit이고 세그먼트에 포함된 데이터의 첫 번째 바이트에 부여된 번호이다. 목적은 세그먼트의 첫 번째 바이트가 이 번호에 해당하는 바이트라는 것을 알려주는 것이다. 연결 설정 단계에서 각 TCP는 난수 발생기를 이용하여 초기 순서 번호를 만들며, 이때 사용되는 ISN(초기 순서번호)은 각 방향에 따라 서로 다른 번호가 사용된다.
확인응답 번호 : 32bit이고 상대방 노드로부터 수신하고자 하는 바이트의 번호를 나타낸다. 확인응답과 데이터는 함께 피기백킹 될 수 있다.
헤더 길이 : 4바이트 워드 단위로 5 ~ 15이다.
예약 : 나중에 사용하기 위해 예약된 6비트 필드이다.
제어 : 6 종류의 제어 비트 또는 플래그이다. 동시에 1로 설정 될 수 있다. 흐름 제어, 연결 설정과 종료, 연결 재설정, TCP의 데이터 전송 모드를 위해서 사용된다.
창 크기 : 16비트로(최대 65,535바이트) 수신창이라고도 하며, 수신 측에 의해서 결정된다.
검사합 : 16비트로 의사 헤더가 검사합 계산을 위하여 세그먼트에 추가된다.
긴급 포인터 : 긴급 포인터가 1로 설정되어 있는 경우에만 유효한 이 16비트 필드는 세그먼트가 긴급 데이터를 포함하고 있을 때 사용된다.
옵션 : 최대 40바이트까지 옵션 정보가 있을 수 있다.
캡슐화
응용층에서 온 데이터를 TCP 세그먼트가 캐슐화한다.
TCP 연결
연결형 전송 프로토콜이기 때문에 가상 경로를 설정한다. 하나의 메시지에 속하는 모든 세그먼트는 이러한 가상 경로를 통해 전송된다. 이 경로로 재전송과 확인응답 등의 처리도 가능하다. 핵심은 TCP가 IP 서비스를 이용하지만 TCP 자체에서 연결을 제어한다. 다시 말하면 IP는 재전송과 순서 재정렬에 대해서는 알지 못하는다는 의미이다.
연결 설정
TCP는 전이중 방식으로 데이터를 전송하는데 이는 동시에 서로 세그먼트를 주고받을 수 있다는 것이다. 이는 교환이 이루어지기 전에, 한 편에선 통신을 개시하고 다른 쪽에선 통신 개시 요구의 승인이 있어야한다는 의미이다.
TCP의 연결 설정은 3-방향 핸드셰이크라고 한다. 클라이언트라는 응용 프로그램은 서버라는 응용 프로그램과 전송층 프로토콜인 TCP를 이용하여 연결을 설정한다.
3-방향 핸드셰이크 절차는 서버에서부터 시작한다. 서버는 자신의 TCP에게 연결을 시작할 준비가 되었다는 것을 알리는데 이 요청을 수동 개방이라 한다. 서버는 모든 연결을 수락할 수 있지만 자신이 먼저 설정 할 순 없다. 클라이언트 프로그램은 능동 개방을 위한 요청을 수행한다. 능동개방이란 수동 개방이 되어있는 서버와 연결을 설정하고자 하는 클라이언트는 자신의 TCP에게 특정 서버와 연결을 설정한다는 것을 알린다. 절차는 다음과 같다.
1. 클라이언트는 SYN 플래그(제어필드)가 1로 설정된 세그먼트를 서버로 전송한다. 이때 순서번호는 동기화가 목적이다. 이 순서번호를 초기 순서 번호(ISN)이라한다. 이 세그먼트에는 확인응답 번호가 포함되어 있지 않다. 창 크기 필드 있는 값은 확인응답 번호를 포함하는 경우에만 의미가 있기 때문에 이 세그먼트에선 정의 되지 않는다. 즉, SYN 세그먼트는 데이터를 전달하지는 않지만 하나의 순서 번호를 소비한다.
2. 서버는 SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다. 이 세그먼트는 2가지 역할을 하는데 하나는 반대 방향의 통신을 위한 것(순서 번호 초기화)이고 다른 하나는 수신하기를 기대하는 번호를 표시하는 것이다. 여기선 확인응답 번호가 있어 수신 창 크기를 포함한다. 즉, SYN + ACK 세그먼트는 데이터를 전달하지는 않지만 하나의 순서 번호를 소비한다.
3. 클라이언트가 (예제에선)세번째로 ACK 세그먼트를 전송하는데 여기선 ACK플래그 비트를 1로 설정하고 확인응답 번호(서버에서 보낸 순서번호)를 이용한다. 여기서 순서번호는 첫번째와 같다. 왜냐하면 ACK 세그먼트는 데이터를 전달하지 않는 경우 순서 번호를 소비하지 않기 때문이다. 여기선 서버의 창 크기 또한 결정하여 보내준다.
동시 개방이란 두 프로세스가 동시에 서로에게 능동 개방을 요구하는 상황이 일어날 수도 있는데 이 경우 양쪽 TCP는 서로에게 SYN + ACK 세그먼트르 전송한다는 것이다.이때 하나의 단일 연결이 두 TCP 사이에 설정된다.
SYN 플러딩 공격이란 데이터그램의 발신지 IP 주소를 위조하여 많은 수의 SYN 세그먼트를 하나의 서버에 전송하는 경우에 발생한다.
서버는 능동 개방을 요청 받았으므로 TCP 테이블을 만들고 타이머를 설정하는 등 자원을 할당한다. 그 후 서버는 SYN + ACK 세그먼트를 전송하지만 이 세그먼트는 클라이언트가 이용하지 않아 없어진다. 이제 3번째 단계를 서버가 기다리지만 클라이언트는 아무것도 하지 않기 때문에 할당된 자원은 회수되지 않는다. 이 공격은 서비스 거부 공격이라는 보안 공격의 일종이다. 이는 시스템에 과부화가 걸려 유효한 요청에 대해 서비스를 거부하도록 함으로써 시스템을 독점하는 것이다.
데이터 전송
클라이언트와 서버는 양방향으로 데이터와 확인응답을 전송할 수 있다. 동일한 방향으로 전송되는 데이터와 확인응답은 하나의 세그먼트로 전달 될 수 있다. 즉, 확인응답은 데이터와 피기백 된다. 만약 더 이상 보낼 데이터가 없다면 확인응답만 전송한다. 제어필드의 PSH는 세그먼트가 도착하는 대로 프로세스로 전달될 수 있도록 알려주는 역할이다.
송신 TCP는 버퍼를 이용할 수도 있고 세그먼트의 크기를 선택할 수도 있다. 수산 TCP도 버퍼를 가질 수 있다. 이러한 버퍼로 지연이 생길 수 있는데 푸시 동작이 이런한 상황을 처리 할 수 있다. 이는 창이 다 찰 때까지 기다리지 않는다는 것을 의미한다.
TCP는 스트림 지향 프로토콜인데 이는 데이터가 바이트 스트림 형태로 전달됨을 의미한다. 데이터의 각 바이트는 스트림 내의 위치를 가지고 있다. 수신 응용 프로그램이 긴급하게 읽었으면 할 때가 있는데 이때 긴급 데이터, URG 비트를 1로 설정한다. 송신 응용 프로그램은 송신 TCP에게 데이터가 긴급하다는 것을 알린다. 송신 TCP는 세그먼트의 시작에 긴급 데이터를 넣고 세그먼트를 만든다. 해당 세그먼트 나머지에는 버퍼에 있는 일반 데이터가 포함될 수 있다. 긴급 포인터 필드는 긴급 데이터의 끝과 일반 데이터의 시작을 표시한다. 수신측이 이러한 정보를 받으면 운영체제가 어떻게 처리할 지를 정한다.
TCP의 긴급데이터는 우선순위 서비스 또는 신속 데이터 서비스를 제공하는 것은 아니다. 송신 측이 수신 측의 응용 프로그램으로부터 특별한 처리가 필요하다 판단할 때 바이트 스트림의 일부분에 표시하는 서비스이다.
연결 종료
클라이언트와 서버 어느쪽도 연결을 종료할 수 있다. 클라이언트가 대부분 종료를 시작한다. 이하는 종료 옵션이다.
3-방향 현대셰이크가 오늘날 대부분의 구현에서 이용된다. 이하는 종료 순서이다.
1. 정상적인 상황에서 프로세스가 TCP에게 close명령을 보낸다. 첫 번째 세그먼트로서(첫 단계로서) FIN 플래그를 1로 설정한 FIN 세그먼트를 전송한다. 이 세그먼트에는 데이터가 포함될 수 있다. FIN 세그먼트가 제어 세그먼트로 동작하는 경우 하나의 순서 번호를 소비한다.
2. FIN 세그먼트를 수신한 TCP는 프로세스에게 연결 종료 상황을 알려준다. 서버는 세그먼트 수신을 확인하고 동시에 클라이언트 방향으로 FIN + ACK 세그먼트를 전송해야 한다. 이 세그먼트 또한 데이터가 포함될 수 있는데 데이터를 포함하지 않으면 하나의 순서 번호를 소비한다. 즉 데이터를 포함하지 않는 FIN 세그먼트는 하나의 순서 번호를 소비한다.
3. 마지막 단계로 클라이언트 TCP는 서버 TCP로 ACK 세그먼트를 전송한다. 이 세그먼트의 순서 번호는 서버로부터 수신한 세그먼트에 있는 순서 번호에 1을 더한 값으로 설정되는 확인응답 번호가 포함된다. 이때 순서번호는 소비되지 않는다.
절반-닫기란 한 쪽 데이터를 수신하면서 데이터 전송을 종료할 수 있는 기능이다. 서버와 클라이언트 모두 해당 요청을 할 수 있다. 서버가 모든 데이터를 수신한 후 해당 기능이 가능하다. 만약 송신 데이터가 정렬되어야하는 데이터였다면 수신이 모든 데이터를 받은 후에야 정렬을 시작할 것이다. 클라이언트는 모든 데이터를 보낸후 전송 방향의 연결은 종료하지만 정렬 데이터를 수신하기 위해 수신 방향은 개방된 상태로 남겨 놓는다. 서버의 전송 방향은 연결 상태를 유지한다.
클라이언트는 FIN 세그먼트를 전송함으로써 연결을 절반-닫기를 하며 서버는 ACK 세그먼트를 전송함으로써 이를 수락한다. 다만 서버는 여전히 데이터를 전송할 수 있다. 서버가 모든 데이터를 전송한 후 FIN 세그먼트를 전송할 것이고 클라이언트는 ACK에 의해 확인응답될 것이다.
데이터를 포함하지 않는 FIN+ACK 세그먼트는 하나의 순서 번호를 소비한다.
연결 재설정
RST 비트를 1로 설정함으로써 연결 요청을 거절하거나, 중단하거나, 휴지 상태에 있는 연결을 종료할 수 있다.
상태 천이 다이어그램
연결 설정, 연결 종료 등 데이터 전송 기간 동안 방생하는 여러 가지 이벤트를 관리하기 위해 TCP 소프트웨어는 유한 상태 기기(FSM)를 이용하여 구현된다. 천이 다아이어그램 중 타원은 상태를 나타낸다. 한 상태에서 다른 상태로 가는 것을 천이라 하며 지시선으로 나타난다. 첫 번째 문자열은 TCP가 수신하는 입력을 나타내고, 두 번째 문자열은 TCP가 전송하는 출력을 나타낸다.
중요한 것은 FSM 내의 ESTABLISHED로 표시된 상태는 사실 두 개의 서로 다른 조합의 상태이며, 각각은 클라이언트와 서버의 데이터 전송을 위한 것이다.
TCP 창
TCP는 데이터 전송을 위해 각 방향에 대해 두 개의 창(송·수신창)을 사용하며, 따라서 양방향 통신을 위하여 네 개의 창이 필요하다.
송신 창
송신 창의 크기는 수신자와 네트워크의 혼잡에 의해 조절될 수 있으며 열리고, 닫히고, 축소될 수 있다.
선택적 반복에서 창은 패킷의 번호를 나타내지만,TCP 창은 바이트의 번호를 나타낸다. 즉, TCP에서는 세그먼트 단위로 전송이 이루어지지만, 창을 제어하는 변수는 바이트이다.
선택전 반복에선 각 패킷마다 타이머를 사용하지만, TCP는 하나의 타이머만을 사용한다.
수신 창
수신 창은 축소되는 경우는 일어나지 않는다.
선택적 반복과 다르게 TCP에서 응용 프로세스가 자신의 속도로 데이터를 읽어갈 수 있다. 수신 측 버퍼 중 일부는 확인응답된 데이터로 채워져 있겠지만, 수신 프로세스에서 읽어가기 전까지는 이러한 데이터는 버퍼에 저장되어 있어야한다는 것을 의미한다.
수신창의 크기(rwnd)는 버퍼 크기 - 읽히기를 기다리는 바이트 수이며 수신 창이 송신 측으로부터 넘치지 않고 수신할 수 있는 바이트의 개수를 결정한다.(흐름 제어)
선택적 반복에선 확인응답은 선택적이며 훼손되지 않고 수신된 패킷만을 정의 하지만 TCP에선 수신하기를 기대하는 다음 바이트를 알려주는 누적 확인 응답이다.
흐름 제어
TCP는 흐름 제어와 오류 제어를 구별한다.
흐름 제어란 생산자가 데이터를 생성하는 속도와 소비자가 데이터를 처리하는 속도의 균형을 맞추는 것이다.
흐름 제어는 수신측 전송층에서 송신측 전송층 · 송신측 전송층에서 송신자 응용층으로 흐름 제어 피드백을 보내며 이루어진다. 송신측 전송층에서 송신측 응용층은 송신TCP가 다 차면 데이터 수신을 거부함으로써 이루어 질 수 있다. 이 거부하는 신호는 수신 프로세스가 수신할 준비를 마칠 때 버퍼를 읽는데 이때 알 수 있다.
창 열기와 닫기
수신 창은 여러 바이트가 들어오면 수신 창은 닫히고 수신 프로세스가 여러 바이트를 읽으면 열린다.
송신 창의 열기, 닫기, 그리고 축소는 수신 측에 의해서 조절된다. 송신 창은 새로운 확인응답이 도착하는 경우 닫히고 수신측으로부터 광고되는 수신 창의 크기 rwnd에 의해 열린다.
창 축소
수신 창은 축소 될 수 없다. 다만 송신 창은 수신 측에 의해 가능하다.
오른쪽 벽을 왼쪽으로 이동함으로써 창을 축소하는 것은 일반적으로 허용되지 않으나 하나의 예외가 있다. 수신 측은 rwnd 값을 0으로 해서 짧은 시간 동안 창 폐쇄가 가능하다는 것이다. 이 방식은 실제로 창의 크기를 축소하지는 않지만 새로운 광고가 도착하기 전까지는 데이터 전송을 중단한다는 의미이다.
어리석은 창 신드롬
데이터를 천천히 발생하거나 데이터를 천천히 소비하는 경우 효율이 나빠지며 데이터 수가 아주 적을 경우 심각한 문제가 발생한다. TCP 헤더 20바이트, IP헤더 20바이트, 사용자 데이터 1바이트면 오버헤드가 41/1이 되는데 이러한 문제를 어리석은 창 신드롬이라 한다.
송신 측에서 발생하는 신드롬으론 송신 TCP가 한 번에 한 바이트씩 데이터를 천천히 생성하는 응용프로그램을 다루는 경우에 발생한다. 해결방법은 한 바이트 단위의 데이터를 전송하지 못하도록 하는 것이다. 이러한 데이터를 취합하여 가능한 한 큰 블록으로 데이터를 전송하도록 하는 것이다. 데이터를 취합하는 시간을 결정하는 건 NAGLE 알고리즘을 사용하는 것이다. 해당 알고리즘을 요약하면 첫 번째는 작더라도 그냥 보고내고 두번째부턴 ACK가 돌아오거나 혹은 최대 크기가 되면 보내는 것이다.
수신 측에서 발생하는 신드롬으론 수신 TCP가 한 번에 한 바이트씩 천천히 데이터를 소비하는 응용프로그램에 서비스를 제공하는 경우가 있다. 수신 버퍼가 가득 차면 송신 측은 데이터 전송을 멈출 것이다(수신 TCP는 창 크기를 0으로 설정하여 통보를 할테니 말이다) 응용프로그램이 1바이트만 읽으면 수신 TCP는 이를 송신 TCP에게 알려줄 것이고 송신은 다시 1바이트만 보내는 악순환이 반복된다. Clark 해결방법 · 지연된 확인응답이 해결 방법이다.
Clark 해결방법이란 수신 버퍼가 반 이상 있기 전까지는 창의 크기를 0으로 통보하는 것이다.
지연된 확인응답이란 수신 측에선 세그먼트가 도착하자마자 확인응답을 전송하는 대신 충분한 공간이 남아있을 때까지 확인응답을 보류하는 것이다. 이는 송신 TCP가 자신의 창을 진행하지 못하도록 한다. 다른 장점으론 수신 측에선 확인응답을 전송할 필요가 없어 트래픽이 감소된다. 반면 송신측은 재전송할 가능있다는 단점이 있다.
오류 제어
오류 제어는 훼손 세그먼트의 감지 및 재전송, 손실 세그먼틩 재전송, 분실된 세그먼트가 도착하기 전까지 순서가 어긋난 세그먼트를 저장, 중복된 세그먼트의 감지 및 폐기를 포함하는데 이는 검사합, 확인응답, 타임-아웃 등을 통하여 수행된다.
검사합
검사합이 다르면 손상으로 간주하고 세그먼트를 폐기한다. TCP는 모든 세그먼트에 필수사항인 16비트 검사합을 이용한다..
확인응답
제어 세그먼트도 순서 번호를 소비하며 확인응답된다. ACK 세그먼트는 순서 번호를 소비하지도 않고 확인응답되지 않는다.
현재 TCP에선 ACK와 SACK 2가지 확인 응답을 사용한다.
누적확인응답인 ACK는 수신 측에서 순서에 어긋나게 도착하고 저장된 모든 세그먼트는 무시하고 수신하고자하는 다음 바이트를 알려주는 응답이다. 이는 TCP 헤더에 32비트로 표현되며 ACK 플래그 비트가 1로 설정된 경우에만 유효하다.
선택적확인응답인 SACK는 순서에 어긋나게 들어온 데이터 블록과 중복 세그먼트 블록을 알려준다. 이는 헤더에 표현이 되지 않아 옵션 형태로 구현된다.
수신 측은 확인응답을 언제 전송하냐는 규칙은 다음과 같다.
1. 다음 순서 번호인 확인응답 번호를 보낼때 세그먼트에 포함하여 전송한다.
2. 수신 측이 보낼 데이터가 없고 순서에 맞는 세그먼트를 수신했다면 ACK세그먼트의 전송을 보류한다.
3. 수신 측에서 기대한 순서 번호를 가지는 세그먼트가 도착하고 이전에 수신한 순서에 맞는 세그먼트가 아직까지 확인 응답이 없을 때 즉시 ACK세그먼트를 보낸다.(세 개 이상 확인 응답하지 않은 상태로 가지지 않도록함)
4. 기대한 것보다 더 큰 값을 가진 순서 번호를 갖는 세그먼트가 도착하면, 즉시 ACK세그먼트를 전송한다.
5. 누락된 세그먼트가 도착하면 다음 순서 번호를 알리기 위하여 ACK세그먼트를 전송한다.
6. 중복 세그먼트가 도착하면 폐기하고 다음 세그먼트를 알리기 위하여 즉시 확인 응답을 전송한다.
재전송
전송된 세그먼트는 확인응답되기 전까지는 버퍼에 저장된다. 타이머가 만료되거나 첫번째 세그먼트에 대한 3개의 중복 ACK를 수신하는 경우에는 세그먼트가 재전송된다.
송신 TCP는 각각의 연결마다 하나의 재전송 타임 아웃 타이머(RTO)를 구동한다. 타이머가 만료되면 버퍼 앞에 있는 가장 작은 순서 번호를 갖는 세그먼트를 전송하고 타이머를 재구동 한다. TCP에서 RTO의 값은 가변적이며 세그먼트의 왕복 시간을 기반으로 업데이트 된다. 이러한 TCP를 Tahoe라고 한다.
RTO 값이 크지 않은 경우에는 앞에서 언급한 규칙을 이용하여 세그먼트를 재전송해도 충분하다. 처리유을 향상시키기 위해 근래는 세 개의 중복 ACK 규칙을 따른다. 이러한 TCP를 Reno라 한다.
순서가 어긋난 세그먼트
현재의 TCP에서는 순서에 어긋나게 들어오는 세그먼트들을 버리지 않고, 일시적으로 그 세그먼트들을 저자하며, 순실된 세그먼트가 도착하기 전까지는 이 세그먼트들을 순서가 어긋난 세그먼트로 표시한다. 이때 이 세그먼트들을 프로세스로 전달하지는 않는다.
혼잡 제어
TCP의 혼잡 제어는 개방 루프와 폐 루프 메커니즘을 기반으로 한다. 또한 TCP는 혼잡 방지, 감지, 해결을 혼잡 창과 혼잡 정책을 이용한다.
혼잡 창
송신자의 창 크기가 수신자에 의해 결정된다고 하였는데 사실 네트워크도 이에 관여한다. 네트워크가 늦게 데이터를 전달 할 수도 있기 때문이다. 따라서 실제 창 크기는 rwnd와 cwnd 중 최솟값이다. cwnd란 혼잡 창의 크기이다.
혼잡 제어 원칙
느린 시작, 혼잡 회피, 혼잡 감지 이 세단계를 기반으로 한다. 느린 시작 단계에서 송신자는 임계치 까진 매우 낮은 전송을 하지만 이후엔 급격히 전송률을 올린다. 임계치에 도달하면 증가 속도를 감소시킨다. 이때 혼잡이 감지되면 송신자는 느린 시작이나 혼잡 회피로 돌아간다.
느린 시작 알고리즘에서 혼잡 창의 크기는 최대 세그먼트 크기(MSS)에서 시작한다. 처음 MSS는 동일한 이름을 가진 옵션을 이용하여 연결 설정 과정 동안 결정된다. 창의 크기는 하나의 확인응답이 도착할 때마다 하나의 MSS 만큼 증가한다. 이때 지수적으로 증가한다. 느린시작임계치에 바이트 단위의 창이 도달하면 느린 시작은 중지된다.
이렇게 지수적으로 증가하면 혼잡이 발생할 수 있기에 혼잡 회피라는 가산적 증가 알고리즘을 정의한다. 느린 시작 임계치에 도달하면 가산 단계가 시작된다. 1씩 크기가 증가한다는 의미이다. 이는 혼잡이 감지되기 전까지 지속된다.
세그먼트를 재전송할 필요가 있는 경우가 혼잡이 발생했다고 간주하는 경우이다. 경우가 2가지가 있다.
시간 초과가 발생했다는 것은 혼잡이 일어났을 가능성이 높다는 것이다. 이때는 임계치의 값을 현재 창 크기의 반으로 설정하고 cwnd를 하나의 세그먼트 크기로 줄이며 느린 단계로 시작하는 것이다.
세 개의 ACK를 수신했다는 것은 혼잡이 일어났을 가능성이 낮다는 것이다. 왜냐하면 그 이후의 세그먼트는 안전하게 도착했다고 간주할 수 있기 때문이다. 이를 빠른 전송 및 빠른 복구라 한다. 이때는 임계치의 값을 현재 창 크기의 반으로 설정하고 cwnd의 값을 임계치의 값으로 설정한후 혼잡 회피를 시작하는 것이다.
TCP 타이머
타이머 종류는 4가지로 이하와 같다.
재전송 타이머
손실된 세그먼트의 재전송을 위하여, TCP는 한 세그먼트에 대한 확인응답을 기다리는 시간인 재전송 타임-아웃(RTO) 값으로 설정되는 재전송 타이머를 가지고 있다. TCP가 송신 버퍼의 맨 앞에 있는 세그먼트를 전송할 때 타이머를 구동한다.
영속 타이머
TCP가 창 크기를 0으로 통보하였는데 이 ACK 세그먼트가 손실되면 교착상태에 빠진다.(ACK 세그먼트에 대해선 확인응답, 재전송을 하지 않기 때문) 이를 해결하기 위해 TCP는 각 연결마다 하나의 영속 타이머를 사용한다. 송신 TCP가 창 크기0을 가진 확인응답을 수신하면 송신 TCP는 영속 타이머를 구동하며 프로브라고 하는 특수한 세그먼트를 전송한다. 이 프로브는 1바이트이며 순서번호는 있지만 이 번호는 계산에서 무시되고 확인응답되지도 않는다. 수신 TCP가 프로브를 받으면 확인응답이 손실되었고 따라서 확인응답을 재전송하라는 것을 알아차린다. 영속 타이머의 값은 재전송 시간의 값으로 설정된다.
킵얼라이브 타이머
해당 타이머는 두 TCP 사이에 설정된 연결이 오랜 시간 동안 휴지 상태에 있는 것을 방지하기 위해서 사용된다. 한 쪽의 오류로 연결상태가 유지되는 것을 해결하기 위함이라 생각하면 된다. 서버에 해당 타이머가 구현되어 있다. 서버가 클라이언트로부터 세그먼트를 받을 때마다 서버는 이 타이머를 초기화 한다.
시간 대기 타이머
해당 타이머는 연결 종료 동안에 사용되며 이유는 상태 천이 다이어그램에서 설명하였다.
옵션
TCP 헤더에는 최대 40바이트의 옵션 정보가 있을 수 있다. 먼저 옵션은 2가지로 나뉜다. 단일 바이트 옵션과 다중 바이트 옵션이다. 단일 바이트 옵션은 옵션 종료와 무 동작으로 2가지이고 다중 바이트 옵션은 최대 세그먼트 크기, 창 확장 인자, 타임스탬프, SACK-허용 및 SACK로 5가지이다.
욥션 종료 옵션은 옵션 구간의 끝에 패딩을 위하여 사용하는 옵션이다.
무동작 옵션은 옵션 사이의 채우기로서 사용되는 옵션이다.
최대 세그먼트 크기 옵션은 TCP 세그먼트의 목적지에서 수신할 수 있는 데이터 세그먼트의 최대 크기를 정의한다. 다만 데이터 부분의 최대 크기이다.
창 확장 인자 옵션은 헤더에 있는 창 크기 필드는 미닫이 창의 크기를 정의하는데 이때 창 크기를 증가시키기 위해 해당 옵션이 사용된다.
타임스탬프 옵션은 왕복 시간을 측정하거나 또는 순서 번호가 겹치는 것을 방지하는 응용에 사용된다.
SACK-허용 및 SACK 옵션은 누적 확인응답 방식의 단점(순서에 어긋난 것, 중복된 것)을 해결하기 위해 만들어 졌다.
TCP 패키지
TCP 패키지는 전송 제어 블록이라고 하는 테이블과 타이머와 메인 모듈, 입력 프로세스 모듈, 출력 프로세스 모듈로 이루어진 세 개의 모듈, 즉 총 다섯 개의 요소로 구성되어 있다.
전송 제어 블록
TCP는 연결형 전송 프로토콜이며 각 연결에 대한 정보를 보관하기 위한 구조를 이용한다. 이 구조를 전송 제어 블록이라 한다.
타이머
앞서 언급했다.
메인 모듈
TCP 세그먼트가 도착하거나 타임-아웃 이벤트가 발생하거나 응용프로그램으로부터 메시지가 들어오면 실행된다. 여러 상태를 제어하기 위해 CASE 문을 사용한다.
입력 처리 모듈
TCP가 ESTABLISHED 상태에 있을 때 수신하는 데이터나 확인응답을 처리하기 위하여 필요한 모든 기능을 담당한다.
출력 처리 모듈
TCP가 ESTABLISHED 상태에 있을 때 응용프로그램으로부터 수신한 데이터를 전송하기 위하여 필요한 모든 기능을 담당한다.
본문제
Q1. TCP는 ---프로토콜이다.
스트림 중심
Q2. TCP는 ---라고 하는 패킷으로 바이트 열을 그룹화한다.
세그먼트
Q3. TCP는 ---프로토콜이다.
연결형
Q4. TCP는 ---전송 프로토콜이다.
신뢰성 있는
Q5. TCP는 데이터가 오류 없이 안전하게 도착했는지를 검사하기 위하여 ---를 이용한다.
확인응답 메커니즘
Q6. 각 연결에서 전송되는 데이터 바이트들을 TCP에 의해서 번호가 매겨진다. 번호는 ---부터 시작된다.
임의로 생성한 번호
Q7. TCP는 전송되는 각 세그먼트에 순서 번호를 할당한다. 각 세그먼트의 순서 번호는 그 세그먼트로 전달되는 ---바이트의 번호이다.
첫 번째
Q8. TCP 통신은 ---이다.
전-이중
Q9. 세그먼트의 확인응답 필드의 값은 수신 측에서 수신하기를 기대하는 ---바이트와 관련된 순서 번호를 나타낸다.
다음
Q10. TCP세그먼트에서 검사합의 포함은 ---이다.
필수
Q11. TCP 세그먼트는 ---에 캡슐화된다.
IP 데이터그램
Q12. SYN 세그먼트는 데이터를 전달하지는 않지만 ---개의 순서 번호를 소비한다.
1
Q13. SYN + ACK 세그먼트는 데이터를 전달하지는 않지만 --- 개의 순서 번호를 소비한다.
1
Q14. ACK 세그먼트는 데이터를 전달하지 않을 때에는 ---개의 순서 번호를 소비한다.
0
Q15. TCP의 연결 설정 절차는 ---공격이라고 하는 심각한 보안 문제에 노출되어 있다.
SYN 플러딩
Q16. SYN 플러딩 공격은 --- 공격이라고 하는 집단의 보안 공격에 속한다.
서비스 거부
Q17. TCP에서 한쪽 종단은 데이터를 수신하면서 데이터 전송을 종료할 수 있다. 이것을 ---라고 한다.
절반 - 닫기
Q18. 흐름 제어를 수행하기 위하여, TCP는 --- 창 프로토콜을 사용한다.
미닫이(Sliding)
Q19. TCP의 미닫이 창은 --- 기반이다.
바이트
Q20. TCP에서 창의 크기는 rwnd와 cwnd의 ---이다.
최솟값
Q21. 송신 응용 프로그램에서 데이터를 천천히 발생하거나 수신 응용 프로그램에서 데이터를 천천히 소비하는 경우에 미닫이 창 동작에 심각한 문제가 발생할 수 있다. 이러한 문제를 ---라고 한다.
어리석은 창 신드롬
Q22. Nagle 알고리즘은 ---에서 발생하는 어리석은 창 신드롬을 해결할 수 있다.
송신 측
Q23. Clark 해결책은 ---에서 발생하는 어리석은 창 신드롬을 해결할 수 있다.
수신 측
Q24. 확인응답의 손실은 제대로 처리되지 않으면 ---이 발생할 수 있다.
교착상태
Q25. --- 알고리즘에서 혼잡이 감지되기 전까지는 혼잡 창의 크기는 가산적으로 증가한다.
혼잡 회피
Q26. 혼잡 감지 알고리즘에서 타임-아웃으로 인하여 혼잡이 감지되면, 새로운 --- 단계가 시작한다.
느린 시작
Q27. 혼잡 감지 알고리즘에서 세 개의 ACK로 인하여 혼잡이 감지되면, 새로운 --- 단계가 시작한다.
혼잡 회피
Q28. TCP 헤더의 바이트의 총 수를 구하기 위하여 헤더 길이 필드에 ---를 곱한다.
4
Q29. ACK 값이 200이라면, 바이트 ---이 성공적으로 수신되었다.
199
Q30. --- 타이머는 0의 창-크기 알림을 처리하기 위하여 필요하다.
영속