반응형
4. TCP 연결
- TCP 는 연결형 프로토콜이다.
- 연결형 전송 프로토콜은 발신지와 목적지 간에 가상 경로를 설정한다.
- 하나의 메시지에 속하는 모든 세그먼트는 이러한 가상 경로를 통하여 전송한다.
- 비연결형 프로토콜인 IP 서비스를 이용하는 TCP가 어떻게 연결형을 제공할 수 있는지가 궁금할 것이다.
- 요점은 TCP 연결은 실제가 아닌 가상이라는 것이다.
- TCP는 상위 단계에서 동작한다.
- TCP는 수신 측에서 각 세그먼트를 전송하기 위해서 IP 서비스를 이용하지만, TCP 자체에서 연결을 제어한다.
4.1 연결 설정
- TCP는 전이중 full-duplex 방식으로 데이터를 전송한다.
- ㅇ두 기기에 있는 TCP가 서로 연결되면, 이들은 동시에 서로 세그먼트를 주고받을 수 있다.
- 3-방향 핸드셰이크 three-way handshaking
- 이 절차에서 클라이언트는 응용 프로그램은 서버라는 응용 프로그램과 전송층 프로토콜인 TCP를 이용하여 연결을 설정한다.
- 절차는 서버에서부터 시작한다. (수동 개방 passive open)
- 클라이언트 프로그램은 능동 개방 active open을 위한 요청을 실행한다.
- 수동 개방이 되어있는 서버와 연결을 설정하고자 하는 클라이언트는 자신의 TCP에게 특정 서버와 연결을 설정한다는 것을 알린다.
- 동시 개방
- 두 프로세스가 동시에 서로에게 능동 개방을 요구하는 상황이 일어날 수 있다.
- 이 경우, 양쪽 TCP는 서로에게 SYN + ACK 세그먼트를 전송하게 되고 하나의 단일 연결이 두 TCP 사이에 설정된다.
- SYN 플러딩 공격 SYN flooding attack
- 악의에 찬 공격자가 데이터그램의 발신지 IP주소를 위조하여 서로 다른 클라이언트로 가장한 후에 많은 수의 SYN 세그먼트를 하나의 서버에 전송하는 경우에 발생한다.
- 이 공격은 서비스 거부 공격 denial of service attack 이라는 보안 공격의 일종이다.
4.2 데이터 전송
- 연결이 설정된 후에는 양방향으로 데이터가 전송될 수 있다.

- 푸시 데이터
- 송신 TCP는 송신 응용 프로그램에서 오는 데이터 스트림 저장하기 위하여 버퍼를 이용한다.
- 송신 TCP는 세그먼트의 크기를 선택할 수 있다.
- 수신 TCP는 수신한 데이터를 저장하기 위한 버퍼를 가지고 있으며, 응용 프로그램이 수신할 준비가 되어있을 때 데이터를 응용 프로그램으로 전달한다.
- 하지만, 특정 응용 프로그램의 경우 (ex, 대화 프로그램) 푸시(push) 동작을 통해 창아 디 찰때까지 기다리지 않고 즉시 전송할 수 있다.
- 송신 TCP는 송신 응용 프로그램에서 오는 데이터 스트림 저장하기 위하여 버퍼를 이용한다.
- 긴급 데이터
- 응용 프로그램이 긴급 다이트를 전송할 필요가 있을때, URG 비트를 1로 설정해서 긴급하는 것을 알린다.
4.3 연결 종료
- 데이터를 교환하는 어느 쪽도 연결을 종료할 수 있지만, 일반적으로는 클라이언트에서 종료를 시작한다.
- 현재 대부분의 구현에서는 연결 종료를 위하여 3-방향 핸드셰이크와 절반-닫기 옵션을 가진 4-방향 핸드셰이크 등의 2가지 옵션이 사용된다.
- 3-방향 핸드셰이크

- 절반-닫기
- TCP에서 한쪽 데이터를 수신하면서 데이터 전송을 종료할 수 있다.
- 서버나 클라이언트에서 모두 시작할 수 있다.

4.4 연결 재설정
- 한쪽 편에 있는 TCP는 RST(reset) 빝트를 1로 설정함으로써 연결 요청을 거절하거나, 연결을 중단하거나, 휴지 상태에 있는 연결을 종료할 수 있다.
- 연결 거절
- 한쪽의 TCP가 존재하지 않은 포트로 연결 요청하는 경우, 다른쪽의 TCP는 요청 거부하기 위해 RST 비트를 설정한 세그먼트를 전송한다.
- 연결 중단
- 한 TCP는 비정상적인 상황의 경우에 설정되어 있는 연결을 중단할 수 있다.
- 이 경우 TCP는 연결 종료하기 위하여 RST 세그먼트를 전송한다.
- 휴지 연결의 종료
- 한쪽 TCP는 다른 편의 TCP가 오래 시간 동안 휴지 상태에 있다는 것을 확인한 후, 연결을 해제하기 위하여 RST 세그먼트를 전송한다.
5. 상태 천이 다이어그램

6. TCP 창
- TCP는 데이터 전송을 위해 각 방향에 대해 두 개의 창(송신 창과 수신 창)을 사용하며
- 양방향 통신을 위해서 네 개의 창이 필요하다.
6.1 송신 창
- TCP 창은 바이트의 번호를 나타낸다.

6.2 수신 창

7. 흐름 제어
- 생산자가 데이터를 생성하는 속도와 소비자가 데이터를 처리하는 속도와 균형을 맞추는 것이다.
7.1 창 열기와 닫기
- 연결 설정할 때 양쪽 끝에서 버퍼의 크기는 고정되지만, 흐름 제어를 수행하기 위해 TCP는 송신측과 수신 측으로 하여금 자신의 창의 크기를 조정하도록 한다.
7.2 창 축소
- 수신 창은 축소될 수 없다.
- 그렇지만 수신 측에서 창의 축소를 야기하는 rwnd값을 통보하는 경우 송신창은 축소될 수 있다.
- 창 폐쇄
- 수신 측에서 잠시 송신 측으로부터 데이터 수신하고 싶지 않을 때 발생한다.
8. 오류 제어
8.1 검사합
- 각 세그먼트에는 검사합 필드가 있으며, 이 필드는 세그먼트가 훼손되었는지를 검사하기 위해 사용한다.
- 만일 세그먼트의 확인된 검사합이 다르면, 목적지 TCP는 세그먼트가 손상된 것으로 간주하고 세그먼트를 폐기한다.
8.2 확인응답
- 데이터 세그먼트의 수신을 확인해 주기 위하여 확인 응답을 사용한다.
- 확인응답 유형
- 누적 확인응답 (ACK)
- 수신 측에서 세그먼트가 폐기되거나, 손실되거나, 중복 수신되었다는 것에 대한 어떠한 피드백을 제공해주지는 않는다.
- 선택적 확인응답 (SACK)
- 송신 측에 부가 정보를 알려주기 위해 사용된다.
- 순서에 어긋나게 들어온 데이터 블록과 중복 세그먼트 블록을 알려준다.
- 누적 확인응답 (ACK)
8.3 재전송
- RTO Retransmission TIme out 이후의 재전송
- 송신 TCP는 하나의 재전송 타임아웃 타이머를 구동한다.
- 타이머가 만료되어 타임 아웃이 발생하면, TCP는 버퍼 앞에 있는 세그먼트 전송하고 타이머를 재구동한다.
- 세 개의 중복 ACK 세그먼트 이후에 재전송
- 타임 아웃 기다리기보다 빨리 재전송하도록 함으로써 세 개의 중복 ACK 규칙을 따른다.
- 이러한 특징을 빠른 재전송이라고 한다.
8.4 순서가 어긋난 세그먼트
- 순서에 어긋나게 들어오는 세그먼트들을 버리지 않고, 일시적으로 세그먼트들 저장하며, 손실된 세그먼트가 도착하기 전까지 이 세그먼트들을 순서가 어긋난 세그먼트로 표시한다.
9. 혼잡 제어
- TCP의 혼잡 제어는 개방 루프와 폐 루프 메커니즘을 기반으로 한다.
9.1 혼잡 창
- 송신자는 수신자에 의해서 광고되는 창 크기와 혼잡 창 크기 정보 가지고 있으며, 창의 실제 크기는 두 정보 중에 최솟값이다.
- 실제 창의 크기 = 최솟값 (rwnd, cwnd)
9.2 혼잡 제어 원칙
- 혼잡을 처리하는 일반적인 원칙은 느린 시작, 혼잡 회피, 그리고 혼잡 감지라는 세 단계를 기반으로 한다.
- 느린 시작 단계에서 송신자는 매우 낮은 전송률로 시작하지만 임계치에 도달할 때까지 급격히 증가한다.
- 임계치에 도달하면 증가 속도를 감소시킨다.
- 마지막으로 혼잡이 감지되면, 혼잡이 감지된 정도에 따라서 느린 시작이나 혼잡 회피로 돌아간다.
10. TCP 타이머
10.1 재전송 타이머
- 한 세그먼트에 대한 확인 응답 기다리는 시간인 재전송 타임 아웃 RTO Retransmission TImeout 값으로 설정되는 타이머를 가지고 있다.
10.2 영속 타이머
- 창크기 0을 통보하는 경우 처리하기 위해 타이머가 필요하다.
- 수신 TCP가 창 크기 0으로 통보하였다고 가정하면, 송신 TCP는 수신 TCP로부터 0이아닌 창 크기 알리는 확인응답 수신전까지 전송 보류하고, 이러한 확인응답도 손실된 경우, 수신 TCP는 송신 TCP세그먼트를 기다릴 수 있다.
- 교착 상태가 발생한다.
- 이러한 교착 상태 해결 위해 각 연결마다 영속 타이머를 사용한다.
- 창 크기 0 가진 확인응답 수신하면, 송신 TCP는 영속 타이머를 구동한다.
10.3 킵얼라이브 타이머
- TCP 사이에 설정된 연결이 오랜 시간 동안 휴지 상태에 있는 경우 방지하기 위해 사용된다.
10.4 시간 대기 타이머
- 연결 종료 동안에 사용된다.
반응형