개발.ZIP/보안.ZIP

[#9] TCP/IP 이론과 보안_TCP/IP_방식의_전송_계층

NURGET 2021. 12. 30. 13:46

TCP/IP 방식의 응용 계층에는 포트 번호를 이용해 식별해야 할 만큼 무수한 프로토콜이 있다. 전송 계층에는 응용 계층과 달리 2개의 프로토콜만이 있다 바로 UDP와 TCP이다. 

 

이 전 포스팅에서 얘기한 것처럼, UDP 방식과 TCP 방식은 단편화와 버퍼링 유무에 따라 구분한다. UDP 방식에 따라 응용 계층에서 페이로드를 생성하면 전송 계층에서는 페이로드 앞에 출발지 포트 번호와 목적지 포트 번호가 담긴 헤더를 붙인 뒤 네트워크 계층으로 전송 과정을 넘긴다. UDP 방식은 일반적으로 512바이트 미만의 페이로드를 대상으로 오직 전송 과정에만 초점을 두고 개발했기 때문에 실시간을 요구하는 환경에 적합한 구조다. 단편화와 버터링 처리 과정을 생략한 만큼 지연 발생이 없다.

 

TCP 방식에는 버퍼링과 단편화 과정이 있기 때문에 UDP 방식보다 처리 과정이 복잡하다. TCP 속성에 따라 응용 계층에서 1,024바이트 크기의 페이로드를 생성했다고 가정하자. 생성한 페이로드가 TCP 속성인 만큼 UDP 방식과 달리, 전송 전 3단계 연결 설정을 수행해야 한다. 이를 수행하기 위해 1,024바이트 크기의 TCP 페이로드를 응용 계층 버퍼에 임시로 저장하고 전송 계층에서 SYN 신호를 담은 세그먼트 1개를 생성한다. SYN 세그먼트는 네트워크 계층과 데이터 링크 계층을 차례로 통과하면서 각각의 헤더를 붙인 뒤 물리 계층에서 비트 단위로 변환해 목적지로 나간다.

 

표 9-1

SYN 신호가 담긴 세그먼트 헤더 IP 패킷 헤더 이더넷 프레임 헤더

 

수신 측 호스트는 해당 SYN 신호를 전송 계층까지 끌어올린 뒤, 전송 계층에서 ACK · SYN 신호를 담은 세그먼트 1개를 생성해 출발지로 보낸다.

 

표 9-2

ACK · SYN 신호가 담긴 세그먼트 헤더 IP 패킷 헤더 이더넷 프레임 헤더

 

그러면 송신 측 호스트에서도 해당 ACK · SYN 신호를 전송 계층까지 끌어올린 뒤 ACK 신호를 담은 세그먼트 1개를 생성해 목적지로 보낸다. 이로써 전송 전 3단계 연결 설정을 완성한다.

 

표 9-3

ACK 신호가 담긴 세그먼트 헤더 IP 패킷 헤더 이더넷 프레임 헤더

 

3단계 연결 설정을 통해 수신 측과 연결을 확립하면 비로소 운영체제는 응용 계층 버퍼에 저장했던 TCP 페이로드를 전송 계층으로 넘긴다. 전송 계층은 응용 계층에서 넘어온 TCP 페이로드를 대상으로 단편화를 수행한다. 단편화란 #6에서 설명한 바와 같이, 전송 효율성과 데이터 기밀성 등을 위해 TCP 페이로드를 여러 개로 분할하는 기법이다. 1,024바이트 크기의 TCP 페이로드를 2개로 단편화했다고 생각하자.

 

단편화가 끝나면 이제 조각난 512바이트 크기의 페이로드 앞에 출발지 포트 번호와 목적지 포트 번호 등이 담긴 헤더가 각각 붙으면서 2개의 세그먼트를 생성한다. 다시 말해 UDP 방식에는 단편화 과정이 없기 때문에 1개의 페이로드에서 1개의 데이터그램을 생성하지만 TCP 방식에는 단편화 과정이 있기 때문에 1개의 페이로드에서 여러 개의 세그먼트를 생성한다. 지금처럼 1개의 페이로드를 2개로 단편화했다면 2개의 세그먼트가 생기고, 4개로 단편화했다면 4개의 세그먼트가 생긴다. 물론 각 세그먼트는 다음 계층인 네트워크 계층으로 넘어가 각각의 패킷을 생성한다. 이게 데이터그램 전송 단위와 세그먼트 전송 단위의 차이점이다.

 

전송은 무조건 응용 계층에서 시작한다는 생각을 버리자. 주어진 상황에 따라 응용 계층에서 시작하는 경우도 있고 전송 전 3단계 연결 설정처럼 전송 계층에서 시작하는 경우도 있다. 경우에 따라서는 네트워크 계층에서 시작하는 경우도 있다. 물론 응용 계층에서 시작한 전송은 상대방의 응용 계층에서 끝나고 전송 계층에서 시작한 전송은 상대방의 전송 계층에서 끝난다.

 

UDP 헤더의 세부 항목과 TCP 헤더의 세부 항목을 차례대로 확인해보자.

 

 

UDP 헤더의 크기는 8바이트로 고정이다.

 

출발지 포트 번호 항목과 목적지 포트 번호 항목은 16비트 크기를 이룬다. 응용 계층에 속하는 프로토콜의 종류가 65,536개인 이유다.

 

포트 번호 항목 다음에 나오는 길이 항목에는 UDP 페이로드와 UDP 헤더를 더한 데이터그램 크기 정보가 담긴다. 길이 항목 다음에 나오는 오류 검사(Checksum) 항목은 기본적으로 비활성 상태다.

 

이처럼 8바이트 크기의 UDP 헤더는 출발지 · 목적지 포트 번호 항목과 길이 항목, 그리고 오류 검사 항목으로 이뤄졌다. 생각보다 무척 단순하다고 느꼈을 듯하다 버퍼링과 단편화 기능이 없기 때문이다.

 

반면, TCP 방식은 UDP 방식과 달리 버퍼링과 단편화 기능을 수행하기 때문에 아래 그림 9-2와 같이 헤더 구조가 상대적으로 복잡하다.

 

UDP 헤더는 8바이트로 고정적이지만, TCP 헤더는 가변적이다. 일반적으로 TCP 헤더는 20바이트 크기를 사용하지만 경우에 따라 TCP 추가(TCP options) 항목을 이용해 21바이트 이상으로 사용할 수도 있다. UDP 헤더와 마찬가지로 TCP 헤더 역시 출발지 · 목적지 포트 번호 항목은 16비트 크기다.

 

일련번호(sequence number) 항목과 확인 번호(acknowledg- ment number) 항목은 3단계 연결 설정 등과 관련이 있다. 송신자는 전송 전 3단계 연결 설정을 수행하기 위해 표 9-1과 같은 SYN 신호를 생성한다. 이때 일련번호는 1000이라고 가정한다(운영체제가 임의로 할당한다). 수신자가 송신자에게 ACK · SYN 신호로 응답할 때 일련번호와 확인 번호는 각각 2000과 1001이다. 확인 번호가 1001인 이유는 송신자의 SYN 신호 일련번호 1000에 대한 응답이면서 그 다음에 해당 일련번호로 전송하는 의미이기 때문이다. 동시에 수신자도 송신자에게 임의의 일련번호 2000을 보낸다. 송신자가 수신자로부터 받은 ACK · SYN 신호에 대해 ACK 신호로 다시 응답할 때 일련번호와 확인 번호는 각각 1001과 2001이다. 확인 번호가 2001인 이유는 수신자의 ACK · SYN 신호 일련번호 2000에 대한 응답이기 때문이다. 아래 표 9-4와 같이 정리할 수 있다.

 

표 9-4

구분 일련번호 확인 번호 전송 주체
SYN 1000 NULL 송신자
ACK · SYN 2000 1001 수신자
ACK 1001 2001 송신자

 

표 9-4처럼 운영체제는 전송 전 3단계 연결 설정이나 전송 후 3단계 연결 종료 등을 수행할 때 송신자와 수신자 사이에 주고받는 세그먼트의 연속성을 보장하기 위해 일련번호와 확인 번호를 이용한다. 또한 일련번호와 확인 번호는 수신 측에서 단편화한 세그먼트 단위를 순서대로 재조립할 때도 중요한 정보다.

 

일련번호 항목과 확인 번호 항목 다음에 나오는 오프셋 항목에는 헤더의 길이를 담는다. 헤더의 크기가 가변적이기 때문에 헤더의 크기를 담는 항목이 필요하다. 일반적으로 20이라고 나온다.

 

오프셋 항목 다음에 나오는 항목은 플래그(Flag) 항목이다. 플래그 항목에는 전송 전 3단계 연결 설정이나 전송 후 3단계 연결 종료 등에서 사용하는 SYN 신호나 FIN 신호 같은 일종의 제어 정보를 저장한다. SYN 신호를 전송할 경우에는 SYN 플래그를 설정하고 SYN 신호에 대한 응답을 전송할 경우에는 ACK 플래그와 SYN 플래그를 동시에 설정한다. 이처럼 플래그 항목에는 TCP 방식이 수행하는 일련의 제어 정보를 담는다. 제어 플래그 항목에서 사용하는 종류는 표 9-5와 같다.

 

표 9-5

구분 의미
CWR(Congestion Window Reduced) 혼잡 윈도우 크기 감소 신호
ECN(Explicit Congestion Notification) 혼잡 발생 신호
URG(Urgent) 긴급 데이터 신호
ACK(Acknowledgment) 확인 응답 신호
PSH(Push) TCP 페이로드를 포함한다는 신호
RST(Reset) 상대방과 연결을 강제로 종료하기 위한 신호
SYN(Synchronize) 상대방과 동기화를 확립하기 위한 개시 신호
FIN(Finish) 상대방과 동기화를 해제하기 위한 종료 신호

 

표 9-5와 같이 총 8개의 플래그가 있다. 8개의 플래그를 순서대로 기억해보자.

 

플래그 항목이 제어 기능과 관련이 있다면 그 다음에 나오는 윈도우 항목은 흐름 제어 기능과 관련이 있다. 또한 플래그 항목과 윈도우 항목은 밀접한 관계가 있다. 예를 들어 송신자가 수신자에게 1번부터 20번까지 해당하는 크기의 데이터를 전송하면 해당 데이터를 자신의 버퍼에 저장한다. 송신한 데이터를 버퍼에 저장하는 이유는 전송 중 오류를 대비하기 위해서다. 수신자가 해당 데이터 전부를 정상적으로 수신하면 수신자는 윈도우 항목에 21이라는 숫자를 담아 ACK 플래그로 응답한다. 1번부터 20번까지 해당하는 크기의 데이터를 정상 수신했으니 다음에는 21번째부터 시작하는 데이터를 보내라는 의미다. 그럼 송신자는 버퍼에 저장했던 1번부터 20번까지의 데이터를 삭제한 뒤 21번부터 60번까지에 해당하는 크기의 데이터를 전송하고 다시 해당 데이터를 자신의 버퍼에 저장한다. 이때 혼잡과 부하 등으로 수신자가 21번부터 40번에 해당하는 크기의 데이터만 수신했다면, 윈도우 항목에 41번을 담아 ACK · CWR 플래그로 응답을 보낸다. CWR 플래그는 표 9-5와 같이 송신자에게 전송 데이터를 줄여서 보내라는 의미다. ACK · CWR 플래그를 수신한 송신자는 전송 직후 자신의 버퍼에 저장했던 데이터 중 41번부터 60번까지에 해당하는 데이터를 재전송한다. 이처럼 송신자는 수신자의 확인 응답에 따라 전송할 정보의 양을 조절하는데, 이를 혼잡 윈도우(Congestion window)라고 하며, 송신자가 전송할 수 있는 동적인 정보의 양을 슬라이딩 윈도우(Sliding window)라고 한다. 또한 윈도우 항목에서 최대로 수용할 수 있는 크기는 5,840바이트로 알려져 있다.

 

긴급 포인터(urgent pointer) 항목은 플래그 항목에서 URG 항목이 나타날 때 0에서 1로 설정이 바뀌면서 동작한다. 작업을 긴급하게 중지하기 위해 CTRL + C 키를 누를 때 발생한다.

 

여기까지가 TCP 헤더에 담긴 주요한 항목에 대한 내용이었다. 확실히 UDP 헤더에 비해 복잡하다.