정보공간_1

[7기 대구 유용수] IO Completion Port 1장.TCP/IP의 구조 본문

IT 놀이터/Elite Member Tech & Talk

[7기 대구 유용수] IO Completion Port 1장.TCP/IP의 구조

알 수 없는 사용자 2015. 3. 11. 21:03

 요즘의 대부분의 응용 어플리케이션들을 보면 단일 로컬 어플리케이션으로만 만들어진 경우는 거의 없습니다. 아주 작은 부분에서도 DB와 서버가 적용되어 이제 네트워크프로그래밍은 우리들에게 아주 가까이 그리고 아주 많은분야에 분포 되어있습니다.

 저는 소켓 프로그래밍이란 주제로 블로깅을 하며, 먼저 이런 개발을 하기위해 사전 정보로 알아두어야 할 TCP/IP 프로토콜의 구조에 대해서 살펴보겠습니다.

 먼저 그 전에, 우리는 데이터 통신이라는 개념을 알고 넘어가야 합니다. 다들 네트워크 수업할때 OSI 7계층(Open Systems Interconnection)에 대해서 들어보셨을텐데요, 간단히 다시한번 집고 넘어갈께요.

 그림에 보시는게 바로 OSI 7계층입니다. 아래부터(하드웨어 및 커널레벨) 부터 점점 올라가서 어플리케이션 레벨까지 나뉘어져 있으며 각 레벨에 대한 간략한 설명입니다. 보통 학부수준에서 하는 네트워크 개발은 사실 너무 큰개념의 네트워크 개발이라기 보단 어플리케이션 단의 윈도우 소켓 API를 활용한 윈속 또는 소켓프로그래밍(Java및 웹소켓 포함)이라고 부르는게 맞습니다. 그에 따른 계층은 최상위 어플리케이션 계층이 될 것입니다.

 이제 이런 OSI 7계층을 TCP/IP에서는 간소화 시켰는데요, TCP/IP 4계층을 한번 살펴보겠습니다.


이렇게 7개의 계층에서 4개의 계층으로 축소 될 수 있는 것은, TCP/IP라는 프로토콜이 가진 전송계층의 TCP/IP헤더 덕분인데요 이 다음부터는 TCP/IP의 개념과 패킷헤더에 대해서 알아 보겠습니다.


그렇다면 TCP/IP는 과면 무었일까요?

 TCP/IP란 지역네트워크(LAN) 혹은 광역 네트워크 (WAN)에서 원활한 통신을 가능 하도록 하기 위한 통신규약(protocol)입니다. 여기서 IP란? PC간 데이터 패킷을 전송하기 위한 주소(우편번호같은)이며 이는 Internet Protocol의 줄임말입니다. 보통은 숫자로된 IP Address를 사람이 식별하기 쉽게 가독성을 높인 DNS(Domain Name Service)를 통해 변화해서 사용합니다. 그리고 다음 TCP란? 서버와 클라이언트간 데이터를 신뢰성 있게 전달하기 위해 만들어진 통신규약이며, Transmissin Contorl Protocol의 줄임말입니다. TCP는 연결 지향형이며, 데이터 패킷의 순서를 재조립하는 필터 역할을 수행합니다. 보통 TCP/IP라 부름은, 각각 2개의 프로토콜이지만 통상 IP프로토콜 위에 TCP프로토콜이 놓이게 되므로 IP분의 TCP라고 표현합니다.

- 위키피디아 -

TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)로 이루어져 있다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.(unreliable datagram service) TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 IP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 TCP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.

 위 내용은 위키에서 TCP/IP를 정의한 나용입니다. 간단하게 특정 회선의 주소를 지칭하는IP 위에 올리는 송/수신시 데이터 순서를 재정렬할 수 있게 해주는 필터 정도로 해석할 수 있겠습니다. 그렇다면 이러한 필터링은 어떠한 방법으로 이루어 질까요? 가장 먼저 연결지향을 위한 연결을 하게 되는데요 이 과정을 바로 three way handshake 라고 부릅니다.

지금 보시는 그림이 three way handshake를 표현한 그림입니다.

이 과정은 데이타가 전송되기 전에, 먼저 Client는 Server 에 "서버 잘있습니까?" 라고 메시지를 보내고, Server 는 다시 Client 에게 "서버 준비되어 있으니, 데이타 보내시요" 라는 메시지를 보내고 Client는 다시 서버에게 "네, 그럼 지금부터 데이타를 보내겠습니다" 라고 서로 의 존재를 확인하는 절차를 수행한후, 정식 데이타를 교환하기 위한 통신선로를 개설하게 된다. 통신선로를 하나 만들기 위해서는 3번의 데이타 전송이 일어나게되는 과정입니다. 이러한 과정은 accept()connect()에서 이루어 지게 됩니다.

이러한 정보교환을 위해서 TCP에서는 데이터를 가지고 있어야 할 텐데, 그것을 위해 존재하는 것이 바로 TCP 헤더입니다.

TCP헤더는 이러한 구조로 이루어져 있습니다. 그럼 순서대로 헤더에 어떤 데이터를 담고 있는지 알아보겠습니다.

 헤더의 첫번째 값에는 포트번호가 들어갑니다 시작부터 16Bit까지는 송신자의 포트를 담고, 다음 16Bit는 수신자의 포트를 담아 해당 IP의 해당 포트로 주소를 찾아갑니다.

다음은 시퀀스넘버라고 불리는 값입니다. 해당 값은 얼마만큼의 흐른이 진행되었는지를 가리키며, 이는 곧 무분별하게 수신된 패킷의 순서를 재조립하는데 사용됩니다.

옥텟(octet):8개의 비트가 하나로 모인 단위

Ack넘버에 예상숫자를 보내어 예상된숫자와, 현재 숫자가 같은지로 분기를 판별합니다.

(위쪽에 Three way handshake그림 참조)

 다음 데이터는 비트순서에 따라서 여러가지 값으로 나뉘어져 있는데요, 첫번째부터 차례대로 한번 알아보겠습니다.

- Data offset : TCP헤더의 크기값이며, 실제 데이터상 세그먼트 시작위치 Offset입니다.

- Reserved : 미래에 사용될 예비 필드

- 전송 상황에 따른 Flag필드들(Control Bits Flag)

  • NS : ECN-nonce 은폐보호
    CWR 송신측 flag, 혼잡제어 매커니즘에 대한 응답 알림
    ECE : ECN-Echo if(SYN == 1) TCP상대가명시적 혼잡통지 가능 의미
               if(SYN == 0) IP
    헤더셋에 혼잡경험 패킷이 정상 전송으로의 수신을 알림
    URG : Urgent pointer 필드 값이 유효함을 나타냄
    ACK : Acknowledgment 필드 값이 유효함을 나타냄, Three way handshaking이후 
            
    전송되는 모든 패킷은 이 플래그가 설정
    PSH : 푸시기능수신 어플리케이션에 버퍼링된 데이터를 푸시 해줄지 여부 확인 역할
    RST : 커넥션 리셋
    SYN : 동기화 시퀀스 번호최초 Three way handshake에서 설정된다
    FIN : 남은 송신측 데이터 없음 표현

 이런 플래그들은 송/수신시 상황에따라서 TCP/IP헤더에 추가되는 플래그 입니다.

(예: three way handshake그림에서 스퀀스넘버를 전송할때 이 SYN플래그가 설정됩니다.)

 윈도우 사이즈는 OS나 어떠한 창을 나타내는 단어가아닌, 버퍼 = Window라고 이해하는게 편할 것 같습니다. 데이터를 받을 수 있는 크기를 나타냅니다.

이 부분에는 데이터의 에러확인과, 앞서 설명한 Control Bit flag에 URG가 설정되었다면(급하게 먼저 확인해야 할 데이터가 있다는 설정) 먼저 확인해야 할 긴급 데이터의 포인터를 가르키게 됩니다.

 마지막 옵션 데이터입니다. 해당 필드는 DataOffset필드에 의해서 크기가 결정되며, 해당 필드를 세부적으로 확인해 보면 다음과 같습니다.

- 옵션 종류

 이렇게 TCP/IP의 의미와 헤더에 대해서 알아보았습니다. TCP/IP헤더는 개발자가 TCP/IP프로토콜을 설정했을때, 모든 패킷 송/수신시에 내부적으로 해당 헤더가 함께 삽입되어 전송되어, 커널모드에서 헤더를 확인하고, 유저모드에서 어플리케이션레벨의 응용버퍼를 사용하는 것 입니다. 이러한 내용들을 인지하고 소켓 프로그래밍을 하여, 최소한의 비용으로 최대한의 효과를 낼수 있길 기원합니다.
 다음은 윈도우 소켓프로그래밍에 대해서 알아보겠습니다. 감사합니다.

관련 문서 : TCP/IP 위키피디아
            Joinc: TCP 자세히보기