본문 바로가기
데이터 통신

[데이터 통신과 네트워킹] TCP 서비스와 특징, 세그먼트, TCP 연결

by IT 정복가 2022. 9. 26.
728x90

전송 제어 프로토콜(Transmission control protocol:TCP)

TCP: 연결형, 신뢰성 있는 프로토콜

- TCP는 연결형 서비스를 제공하기 위하여 연결 설정, 데이터 전송, 연결 해제 단계를 명확하게 정의

- TCP는 신뢰성을 제공하기 위해 N복귀 프로토콜(GBN, Go-Back-N)과 선택적 반복 프로토콜(SR,Selective-Repeat)의 결합을 사용

- 이 목적을 달성하기 위해, TCP는 검사합(오류 검출을 위해), 분실 혹은 훼손된 패킷의 재전송, 누적 및 선택 확인응답, 그리고 타이머를 사용

- TCP는 인터넷에서 가장 많이 사용되는 전송층 프로토콜

 TCP 서비스

1. 프로세스-대-프로세스 통신

- TCP는 UDP처럼 포트 번호를 사용하여 프로세스 간 통신을 제공

2. 스트림 전달 서비스

- UDP와 달리 TCP는 스트림 중심 프로토콜

- 반면에 TCP에서 송신 프로세스는 바이트의 스트림(stream of byte)으로 데이터를 전달하고 수신 프로세스도 바이트의 스트림으로 데이터를 수신하도록 함

- TCP는 인터넷으로 데이터를 전달하는 가상의 "튜브(tube)"에 의해 2개의 프로세스가 연결되는 것처럼 보이는 환경을 제공

- 송신 프로세스는 바이트의 스트림을 생성하고 수신 프로세스는 그것을 소비

스트림 전송

3. 송신 및 수신 버퍼 

- 송신 및 수신 프로세스는 똑같은 속도로 데이터를 만들고 처리할 수 없기 때문에 TCP는 저장을 위해서 버퍼가 필요

- 각 방향을 위해 송신 및 수신 두 가지 버퍼가 있으며 이 버퍼들이 TCP에 의해 흐름 및 오류 제어 기법에서 사용

- 버퍼를 구현하는 한 방법은 1바이트 구역의 원형 배열을 사용하는 것.

송신 및 수신 버퍼

- 송신측에서 버퍼는 세 가지 형태의 부분을 가지고 있다.

- 흰색 부분은 송신 프로세스(생산자)에 의해 채워질 수 있는 비어 있는 위치들이고,

- 옅은 색 영역은 송신은 되었으나 아직 확인응답을 받지 못한 바이트를 가지고 있는 영역이며, 확인응답 메시지를 받을 때까지 버퍼에 이 데이터를 유지함


- 진한 색깔이 있는 영역은 전송 TCP에 의해 송신된 바이트들임

-
TCP는 이 색깔 영역의 단지 일부만을 전송할 수도 있는데, 이것은 수신측 프로세스의 느린 속도 때문일 수 있고 또는 네트워크의 혼잡 때문일 수도 있음

-
연한색 영역에 있는 바이트들이 확인응답을 받은 후에는 그 영역은 다시 재생이 되어서(흰색) 송신 프로세스에 의해 사용이 가능함

-
수신측에서 버퍼 동작은 더 간단하며, 원형 버퍼는 두 영역으로 구별(흰색과 색깔 영역)

-
흰색 영역은 네트워크로부터 수신된 바이트에 의해 채워질 비어 있는 위치들을 포함

-
색깔이 있는 부분은 수신 프로세스에 의해 소비가 될 수 있는 수신된 바이트를 보유.

-
한 바이트가 수신 프로세스에 의해 소비가 되었을 때 그 구역은 다시 재생되어 비어있는 위치의 영역으로 추가

4. 세그먼트

- TCP를 위한 서비스 제공자로서 네트워크층은 바이트 스트림이 아닌 패킷으로데이터를 전송

- 전송층에서 TCP는 세그먼트(segment)라고 하는 패킷으로 다수의 바이트를 묶어서 그룹화.

- TCP는 각 세그먼트에 헤더를 붙이고(제어 목적으로) 전송을 위해 IP 계층으로 세그먼트를 전달한다.

- 세그먼트들은 IP 데이터그램으로 캡슐화되고 전송

- 세그먼트들은 순서가 바뀌거나 손실 또는 훼손된 상태로 수신될 수 있으며 재전송될 수 있음

- 수신 응용 프로세스는 이런 일을 전혀 알아차리지 못하며 TCP에 의해 진행

세그먼트가 만들어지는 과정

- 세그먼트는 동일한 크기일 필요가 없음.

- 위 그림은 하나의 세그먼트가 3바이트를 전달하고, 또 다른 세그먼트는 5바이트를 전달하는 것을 보여주지만, 실제로 세그먼트는 수천 바이트는 아니더라도 수백 바이트를 전달

5. 전이중 통신

- TCP는 전이중 서비스(full-duplex service)를 제공하여 데이터는 동시에 양방향으로 전달 가능

- 각 TCP는 송신 및 수신 버퍼를 가지고 있으며, 세그먼트는 양방향으로 이동

6. 다중화와 역다중화

- UDP와 마찬가지로, TCP는 송신기에서 다중화를, 수신기에서 역다중화를 수행

- 그러나 TCP가 연결지향 프로토콜이므로, 연결이 각 프로세스 쌍을 위해 설정되는 것이 필요

7. 신뢰성 있는 서비스

- TCP는 데이터의 안전하고 확실한 도착을 확인하기 위하여 확인응답 기법을 사용하여 신뢰성 있는 서비스를 제공

8. 연결형 서비스

- UDP와 달리 TCP 연결형 프로토콜

- A 사이트에 있는 프로세스가 B 사이트에 있는 다른 프로세스로부터 데이터를 송신하고 수신하기를 원한다면 다음의 과정이 발생
1) 2개의 TCP는 두 사이트 사이에 연결을 설정
2) 양 방향으로 데이터를 교환
3) 연결의 종료

- 이것은 물리적 연결이 아닌 가상적인 연결

- TCP 세그먼트는 IP 데이터그램으로 캡슐화되고, 순서가 뒤바뀌는 경우와 손실 또는 훼손되어서 전달될 수 있으며, 이런 경우에는 재전송됨

- 물리적인 연결이 없으며, 각 세그먼트는 목적지에 도달하기 위하여 서로 다른 경로를 사용할 수도 있지만, TCP는 다른 쪽을 위하여 바이트들을 순서대로 전달하는 책임이 있는 스트림형 환경을 제공

 TCP 특징

1. 번호 부여 시스템

- TCP 세그먼트 헤더에는 세그먼트 번호 값을 위한 영역이 없고, 대신에 순서 번호(sequence number)와 확인응답 번호(acknowledgement number) 라는 두 영역이 존재

- 이 두 영역은 세그먼트 번호가 아닌 바이트 번호를 참조

2. 바이트 번호

- TCP는 연결 상태에서 전송되는 모든 데이터 바이트에 번호를 부여하며, 번호지정은 각 방향에서 독립

- TCP가 프로세스로부터 데이터를 수신하여 송신 버퍼에 저장할 때 번호를 부여하지만, 번호 지정은 0에서 232-1 사이에서 임의로 만들어진 번호로 시작

- 예를 들어, 임의의 번호가 1,057이 되고 전송해야 할 전체 데이터가 6,000바이트라면 바이트들은 1,057에서 7,056까지 번호가 할당됨

- 바이트 번호 지정은 흐름 및 오류 제어에 사용

3. 순서 번호

- 바이트들에 번호가 매겨진 후, TCP는 전송되는 각 세그먼트에 순서 번호를 할당

- 각 방향에서의 순서 번호는 다음과 같이 정의
1. 첫 번째 세그먼트의 순서 번호는 임의 번호인 ISN (초기 순서 번호)임
2. 어떤 다른 세그먼트의 순서 번호는 이전 세그먼트의 순서 번호에 이전 세그먼트에 의해 전달된 바이트의 수(실수 혹은 허수)를 합한 것

- 세그먼트가 데이터와 제어 정보를 조합해서 전달한다면 세그먼트는 순서 번호를 사용

- 만약 사용자 데이터를 운반하지 않는다면 논리적으로 순서 번호를 정의하지 않음(필드는 있지만 값은 유효하지 않음)

 - 제어 정보만을 운반한다고 할 때, 세그먼트는 수신자로부터 확인응답을 위해서 순서 번호를 필요로 하며, 연결 설정, 종료 또는 중단을 위해서 사용

- 이러한 각 세그먼트는 마치 1바이트를 전달하는 것처럼 순서 번호 1개를 소비하지만, 실질적인 데이터는 없음

4. 확인 응답 번호

- TCP에서 통신은 전이중이므로, 연결이 설정되면 양쪽에서 동시에 데이터를 송수신 가능

- 양측은 각각 대개 서로 다른 시작 바이트 번호로 바이트 번호를 부여하고, 각 방향의 순서 번호는 세그먼트에 의해 전달되는 첫 번째 바이트의 번호를 사용

- 또한, 수신한 바이트에 대해 확인하기 위하여 확인응답 번호를 사용하지만, 확인응답 번호는 상대방이 수신해야 하는 다음 바이트 번호를 정의

- 확인응답 번호는 누적되면, 이것은 각자가 안전하고 확실하게 수신한 마지막 바이트 번호를 취하여 거기에 1을 더한 후 확인응답 번호로 이 값을 통지

- 여기에서 누적(cumulative)이라는 용어는 한쪽에서 확인응답 번호로 5,643을 사용한다면 시작부터 5,642까지 모든 바이트를 수신했다는 것을 의미. 첫 번째 바이트 번호가 대개 0부터 시작하지 않기 때문에 5,642 바이트를 받았다는 것을 의미하지는 않음

 세그먼트

TCP에서는 패킷을 세그먼트라고 함

형식
- 세그먼트는 20~60바이트의 헤더와 응용 프로그램으로부터 온 데이터로 구성되고, 선택 항목이 없다면 20바이트, 선택항목이 있다면 60바이트까지

발신지 포트 주소
- 세그먼트를 송신하는 호스트에 있는 응용 프로그램의 포트 번호를 정의하는 16비트 필드
- 이것은 UDP 헤더에 있는 발신지 포트 번호와 동일한 기능

목적지 포트 주소
- 세그먼트를 수신하는 호스트에 있는 응용 프로그램의 포트 번호를 정의하는 16비트 필드
- 이것은 UDP 헤더에 있는 목적지 포트 번호와 동일한 기능

순서 번호
- 32비트 필드로 이 세그먼트에 포함된 첫 번째 데이터 바이트에 할당된 번호 정의
- TCP는 스트림 전송 프로토콜로 연결성을 확신하기 위해서 전송되는 각 바이트에는 번호가 부여
- 순서 번호는 이 데이터 순서의 어느 바이트가 세그먼트에서 첫 번째 바이트를 의미하는지를 목적지에 통보
- 연결을 설정하는 동안, 양측은 각각 초기 순서 번호(ISN, Initial Sequence Number)를 생성하기 위하여 랜덤 번호 생성기를 사용하며, 각 방향에서 보통 다른 번호가 생성

확인 응답 번호
- 32비트 필드는 세그먼트의 송신자가 다른 쪽으로부터 받기를 기대하는 바이트 번호를 정의
- 세그먼트 수신자가 상대방으로부터 바이트 번호 x를 성공적으로 수신하였다면 x + 1 이 확인응답 번호가 됨
- 확인응답과 데이터는 함께 전달이 가능

헤더 길이
- 4비트 필드는 TCP 헤더를 4바이트 단위의 개수로 나타낸 것
- 헤더의 길이는 20에서 60바이트가 될 수 있으며, 이에 따라 필드 값은 5(5 × 4 = 20)에서 15(15×4= 60) 사이의 값임

창크기
- 이 필드는 상대방이 반드시 유지해야 하는 바이트 단위의 창 크기
- 이 필드의 길이는 16비트이고 따라서 창의 최대 크기가 65,536바이트
- 이 값은 보통 수신창 (rwnd)로 언급이 되고 수신자에 의해서 결정. 이 경우 송신자는 수신자의 지시를 따라야 함

긴급 지시자
- 이 필드는 16비트로 긴급 플래그 값이 설정되었을 때만 유효하며 세그먼트가 긴급 데이터를 포함하고 있을 때 사용
- 세그먼트의 데이터 부분에서 마지막 긴급 바이트의 번호를 구하기 위하여 순서 번호에 이 번호가 더해짐

옵션들
-TCP 헤더는 40 바이트까지 옵션 정보를 가질 수 있음

제어

- 이 필드는 그림에서 보는 것처럼 6개의 다른 제어 비트 또는 플래그 비트를 정의. 1개 또는 그 이상의 비트가 한 번에 설정

- 이 비트들이 TCP에서 흐름 제어, 연결 설정과 종료, 연결 중지 그리고 데이터 전송 모드를 가능하게 함

제어필드

검사합

- TCP를 위한 검사합의 계산은 UDP와 동일한 절차임

- UDP 데이터그램에 있는 검사합의 사용은 선택사항이지만 TCP를 위한 검사합은 필수사항임

- 동일한 목적을 수행하는 동일한 의사헤더가 세그먼트에 부가되며, TCP 의사헤더를 위한 프로토콜 필드 값은 6

TCP 데이터그램에 추가된 의사헤더


◆ TCP 연결

TCP 연결

- TCP는 연결형 전송 프로토콜로서 발신지와 목적지 사이에 가상 경로를 설정

- 한 메시지에 속하는 모든 세그먼트는 이 가상 경로를 통해서 전송

- 전체 메시지를 위하여 단일 가상 경로를 사용하는 것은 훼손되거나 손실된 프레임의 재전송 뿐만 아니라 확인응답 프로세스를 가능하게 함

- TCP 연결은 물리적이지 않고 가상적이며 TCP는 네트워크 상위층에서 동작

- TCP는 세그먼트들을 수신자에게 전달하기 위하여 IP 서비스를 사용하지만 연결 자체를 제어함


- 세그먼트가 손실되고 손상되었다면 재전송됨

- TCP와 달리 IP는 이 재전송을 알지 못하고, 만약 세그먼트가 순서에 벗어나 도착한다면 TCP는 잃어버린 세그먼트가 도착할 때까지 세그먼트를 유지함

- IP는 이러한 재순서화도 알지 못함

- TCP에서 연결형 전송연결 설정, 데이터 전송연결 종료의 3개의 단계를 필요로 함

1. 연결 설정

1) TCP는 전이중 모드로 데이터를 전송
- 2개의 시스템에 있는 2개의 TCP가 연결될 때 동시에 서로 다른 세그먼트를 송신할 수 있음
- 이것은 양쪽이 각각 통신을 초기화해야 하고, 데이터를 전송하기 전에 다른 쪽으로부터 승인을 얻어야 한다는 것을 의미

2) 세-방행 핸드셰이크
- TCP에서 연결 설정은 세 방향 핸드셰이크로 불림
- 예로 전송 프로토콜로 TCP를 사용하여 클라이언트(client)라고 불리는 한 응용 프로그램이 서버(server)라고 불리는 또 다른 응용 프로그램과 연결을 만들려고 가정하면, 이 과정은 서버와 함께 시작
- 서버 프로그램은 연결을 받아들일 준비가 되어 있다고 자신의 TCP에게 알리고, 이런 요청을 수동 개방이라고 함
- 비록 서버 TCP는 모든 컴퓨터로부터도 연결을 받아들일 준비가 되어 있지만 스스로 연결 자체를 만들 수는 없음
- 클라이언트 프로그램은 능동 개방 요청. 개방된 서버와 연결을 원하는 클라이언트는 그 특정한 서버에게 연결이 필요하다는 것을 자신의 TCP에게 알림

3) SYN 플러딩 공격
- TCP에 있어 연결 설정 절차는 SYN 플러딩 공격이라고 하는 심각한 보안상 문제에 영향 받기 쉬움
- 악의적인 공격자가 데이터그램에 있는 발신지 IP 주소를 위조하여 서로 다른 클라이언트로부터 SYN 세그먼트가 들어오는 것처럼 가정하고 대량의 SYN 세그먼트들을 서버에게 송신할 때 발생
- 클라이언트가 능동적 개방을 유발하고 있다고 가정한 서버는 통신 테이블을 생성하거나 타이머를 설정하는 것과 같은 필요한 자원을 할당함
- 그런 다음 TCP 서버는 SYN + ACK 세그먼트들을 위조된 클라이언트에게 송신하며 이들은 모두 손실이 되며 이 시간 동안에 많은 자원이 사용되지 않고 점유되어 낭비됨
- 만약 이 짧은 시간에 SYN 세그먼트들이 많다면 서버는 결국 자원이 모두 고갈되고 무너지게 될 수도 있음
- 이 SYN 플러딩 공격은 공격자가 많은 서비스 요청을 가진 시스템을 독점하여 시스템을 붕괴하고 모든 요청에 대하여 서비스를 거부하는 서비스 거부 공격으로 알려진 보안 공격 형태에 속함

세-방향 핸드셰이크


2. 데이터 전송

데이터 전송

1) 연결이 설정되면 양방향 데이터 전송이 수행
- 클라이언트와 서버는 양방향으로 데이터와 승인 정보를 보내게 됨
- 확인응답과 동일한 방향으로 이동하는 데이터가 동일한 세그먼트에 전달
- 승인은 데이터와 함께 전달
- 클라이언트가 다시 한 세그먼트를 보냄
- 첫번째 3개의 세그먼트는 데이터와 확인응답 모두를 전달하고, 마지막 세그먼트는 전송할 데이터가 더 이상 없기 때문에 확인응답만을 전달
- 클라이언트에 의해 보내진 데이터 세그먼트는, 서버 TCP가 데이터가 수신되자마자 서버 프로세스에게 데이터를 전달하는 것을 알도록 PSH(push) 플래그가 설정
- 서버로부터 온 세그먼트는 밀어넣기 플래그를 설정하지 않음

2) 데이터 밀어넣기
- 송신 TCP는 창이 채워지는 것을 기다려서는 안 된다는 것을 의미
- 송신 TCP는 세그먼트를 생성해야 하고 즉시 전송해야만 함
- 송신 TCP는 밀어넣기 비트(PSH)를 설정하여, 가능한 빨리 수신 응용 프로그램에게 전달해야만 하는 데이터를 이 세그먼트가 포함하고 있으며, 데이터가더 들어오기를 기다려서는 안 된다는 것을 수신 TCP에게 알림
- 밀어넣기 동작이 응용 프로그램에 의해 요청될 수 있기는 하지만, 오늘날 대부분의 구현은 그러한 요청을 무시하며, TCP에서 이 동작은 옵션임

3) 긴급 데이터
- TCP는 스트림 중심 프로토콜이므로, 데이터들은 응용 프로그램으로부터 TCP에게 바이트들의 스트림으로 전달됨
- 각 데이터 바이트는 스트림에서 해당 위치를 갖게 되지만, 응용 프로그램이 긴급(urgent) 바이트를 송신할 필요가 발생하는 경우, 이것은 한 부분의 데이터가 수신 응용 프로그램에 의해 특별한 방법으로 처리되기를 송신 응용 프로그램이 원한다는 것을 의미함
- 해결 방법은 URG 비트를 설정한 세그먼트를 전송하는 것
- 송신 응용 프로그램은 송신 TCP에게 데이터 부분이 긴급하다는 것을 알리며, 송신 TCP는 세그먼트를 생성하고 세그먼트의 시작 부분에 긴급 데이터를 삽입
- 나머지 세그먼트는 버퍼로부터 정상적인 데이터를 포함
- 헤더에 있는 긴급 지시자 필드(urgent Pointer field)는 긴급 데이터의 종료 지점과 정상 데이터의 시작 지점을 정의
- 예로써, 만약 세그먼트 순서 번호가 15,000이고 긴급 포인터의 값이 200이라면, 긴급 데이터의 첫 번째 바이트는 15,000이고 마지막 바이트는 15,200바이트이며, 세그먼트의 나머지 바이트(만약 존재한다면)는 긴급하지 않음
- TCP의 긴급 데이터는 우선 순위 서비스나 순서에 벗어난 대역 데이터 서비스가 아니고 송신측의 응용 프로그램이 수신측에서 응용 프로그램에 의해 특별한 처리가 필요한 바이트 스트림의 일부 영역을 표시하는 서비스임
- 수신 TCP는 바이트를 (긴급 혹은 비긴급) 응용 프로그램에 순서대로 전달하고 응용 프로그램에 긴급 데이터의 시작과 끝에 대해 통보함
- 긴급 데이터를 어떻게 처리할 것인지는 응용 프로그램의 결정임

3. 연결 종료

1) 세-방향 핸드쉐이킹
- 연결 종료를 위하여 세 방향 핸드셰이킹을 사용
1. 정상적인 상황에서 클라이언트 TCP는 클라이언트 프로세스로부터 종료 명령을 수신한 후에 FIN 플래그가 설정된 첫 번째 FIN 세그먼트를 전송
2. FIN 세그먼트를 수신한 후에 서버 TCP는 상황에 대한 처리를 알리고, 동시에 다른 방향으로는 연결 종료를 알리기 위하여 두 번째 세그먼트(FIN+ACK)를 송신
3. 클라이언트 TCP는 TCP 서버로부터 FIN 세그먼트 수신에 대하여 확인으로 마지막 세그먼트인 ACK 세그먼트를 전송

2) 절반 폐쇄

- TCP에서 데이터를 받고 있는 중이라도 한쪽 끝은 데이터 전송을 중단할 수 있으며 이를 절반 폐쇄(half-close)라고 함
- 어느 쪽도 절반-폐쇄를 내보낼 수 있지만 보통은 클라이언트에서 시작
- 좋은 예가 정렬
- 클라이언트가 서버에게 정렬할 데이터를 전송할 때 서버는 정렬을 하기 전에 모든 데이터를 받을 필요가 있으며, 이것은 클라이언트가 모든 데이터를 전송한 후에 나가는 방향의 연결을 종료할 수 있다는 것을 의미함
- 그러나 클라이언트는 들어오는 방향은 정렬된 데이터를 수신하기 위하여 개방 상대로 있어야만 하고, 서버는 데이터를 수신한 후에 정렬할 시간을 여전히 필요로 하고, 나가는 방향은 개방 상태로 있어야 함
- 클라이언트는 FIN 세그먼트를 전송함으로써 연결을 절반-폐쇄함
- 서버는 ACK 세그먼트를 송신함으로써 절반-폐쇄를 받아들임
- 클라이언트에서 서버로 데이터의 전송은 멈추지만, 서버는 여전히 데이터를 송신할 수 있음
- 서버가 처리된 모든 데이터를 보냈을 때, 클라이언트로부터 ACK에 의해 확인응답되는 FIN 세그먼트를 전송
- 연결에 대한 절반-폐쇄 후에 데이터는 서버에서 클라이언트로 이동할 수 있고 확인응답은 클라이언트로부터 서버로 이동할 수 있음
- 그러나, 클라이언트는 더 이상 어떠한 데이터도 서버로 전송할 수 없음

세-방향 핸드쉐이킹을 사용한 연결 종료
절반-연결 폐쇄


모든 내용은 '데이터 통신과 네트워킹 6판' 책을 공부하여 작성 하였습니다.

728x90