본문 바로가기

도서

그림으로 공부하는 IT 인프라 구조

📚 후기


저번에 후기 작성한 책도 '그림으로 배우는'이었는데 이번에는 그림으로 '공부하는' IT 인프라 구조 책이다. 이 책은 사실 학원 막 다니기 시작하고 얼마 안 돼서 산 책인데, 그때 한 번 대충 훑어서 읽고 다시 꺼내서 읽게 되었다. 그때는 읽으면서 알듯 말 듯하면서 몰랐다(?)

그래도 지금은 중간에 정처기도 따고 예전보단 아예 지식이 없는 건 아니어서 훨씬 읽을 만 해졌다. 크크크

지난번 책은 제목 그대로 주로 http와 네트워크에 좀 더 치중되어 있었지만 이 책은 뭔가 더 전체적인 부분을 굉장히 짜임새 있게 볼 수 있었다. 나처럼 비전공자들이 컴공 지식을 쌓고 싶을 때 어렵지 않게 읽을 수 있는 책으로 추천한다.  

 

📝 정리


아키텍쳐

집약형 아키텍쳐

 - 한대의 대형 컴퓨터만 있으면 되므로 구성이 간단하다.

- 대형 컴퓨터의 리소스 관리나 이중화에 의해 안정성이 높고 고성능이다.

- 대형 컴퓨터의 도입비용과 유지 비용이 크다

- 확장성에 한계가 있다.

 

분할형 아키텍쳐

- 낮은 비용으로 시스템을 구축할 수 있다.

- 서버 대수를 늘릴 수 있어서 확장성이 높다.

- 대수가 늘어나면 관리 구조가 복잡해진다.

- 한 대가 망가지면 영향 범위를 최소화하기 위한 구조를 검토해야 한다.

 

수직 분할형 아키텍쳐: 각 서버의 용도가 다르다.

 

1. 클라이언트- 서버형 아키텍쳐

- 클라이언트 측에서 많은 처리를 실행할 수 있어서 소수의 서버로 다수의 클라이언트를 처리해 줄 수 있다.

- 클라이언트 측의 소프트웨어 정기 업데이트가 필요하다.

- 서버 확장성에 한계가 발생할 수 있다.

 

2. 3계층형 아키텍쳐

프레젠테이션 계층 : 사용자 입력을 받고 웹 브라우저 화면을 표시한다.

애플리케이션 계층: 사용자 요청에 다라 업무를 처리한다.

데이터 계층: 애플리케이션의 요청에 따라 데이터 입출력을 한다.

   - 서버 부하 집중 개선

   - 클라이언트 단말의 정기 업데이트가 불필요

   - '처리 반환'에 의한 서버 부하 저감

   - 구조가 클라이언트 - 서버 구성보다 복잡하다.

 

수평 분할형 아키텍쳐: 용도가 같은 서버를 늘려나가는 방식

 

1. 단순 수평 분할형 아키텍쳐

분할한 시스템이 독립적으로 운영되므로 서로 영향을 주지 않는다.

데이터를 일원화해서 볼 수 있다.

애플리케이션 업데이트는 양쪽에 동시에 해주어야 한다.

처리량이 균등하게 분할돼 있지 않으면 서버별 처리량에 치우침이 생긴다.

 

2. 공유형 아키텍쳐

- 수평으로 서버를 늘리기 때문에 확장성이 향상된다.

- 분할한 시스템이 서로 다른 시스템의 데이터를 참조할 수 있다.

- 분할한 시스템 간 독립성이 낮아진다.

- 공유한 계층의 확장성이 낮아진다.

 

지리 분할형 아키텍쳐: 업무 연속성 및 시스템 가용성을 높이기 위한 방식으로 지리적으로 분할하는 아키텍쳐

 

스탠바이형 아키택쳐

액티브-스탠바이 구성으로 물리 서버를 최소 두 대를 준비하여 한 대가 고장 나면 가동 중인 소프트웨어를 다른 한대로 옮겨서 운영하는 방식이다. 이때 소프트웨어 재시작을 자동으로 하는 구조를 페일오버(failover)라고 한다. 하지만 보통 때는 페일오버 대상 서버가 놀고 있는 상태이기 때문에 리소스 측면에서 낭비가 발생한다. 

 

재해 대책형 아키텍쳐

특정 데이터센터(사이트)에 있는 상용 환경에 고장이 발생하면 다른 사이트에 있는 재해 대책 환경에서 업무처리를 재개하는 것이다.

 

클라우드형 아키텍쳐

사용자 쪽에서 보면 일반 서버처럼 작동하지만 서버가 가상화돼있어서 사용자는 어느 물리 서버에서 동작하고 있는지 모른다. 물리 서버를 구입하는 것에 비해 비용이 낮고 바로 사용할 수 있다는 장점이 있지만 보안 문제나 클라우드 서비스 제공자와의 네트워크 연장 문제 등이 있다. 

 

하드웨어 장비

서버는 랙(rack)이라는 것에 장착된다. 랙에는 서버 외에도 HDD가 가득 장착돼 있는 저장소나 인터넷 및 LAN을 연결하기 위한 스위치 등도 탑재돼있다. 서버와 PC는 물리적으로는 기본 구성이 같다. 전원이 이중화돼 있어서 장애에 강하거나 대용량 CPU나 메모리가 탑재돼 있는 정도가 PC와 다른 점이다.

 

CPU(Central Processing Unit)

서버 중심에 위치해서 연산처리를 담당한다. CPU는 명령을 받아서 연산을 실행하고 결과를 반환한다. 명령과 데이터는 기억장치나 입출력 장치를 통해 전달된다. 현재는 이 CPU를 '코어'라고 하며 코어는 각자가 독립된 처리를 할 수 있다. 명령은 운영체제(OS)라는 소프트웨어가 내린다.

 

메모리(memory)

명칭 그대로 기억 영역을 말한다. CPU 옆에 위치하며, CPU에 전달하는 내용이나 데이터를 저장하거나 처리 결과를 받는다. 메모리에 저장되는 정보는 영구성이 없다. 서버를 재시작하면 없어지는 정보임을 뜻한다. 메모리는 전기적인 처리 만으로 데이터를 저장하기 때문에 속도가 매우 빠르다. 그런데 CPU 자체도 메모리를 가지고 있다 이것은 레지스터나 1차(L1)/2차(L2) 캐시라고 불리며, CPU 내부에 존재한다. 메모리보다 더 빠르긴 하지만 용량이 메모리에 비해 매우 적다. 메모리는 미리 데이터를 CPU에 전달해서 처리 지연을 줄이는 '메모리 인터리빙(memory interleaving)이라는 기능이 있다.

 

하드 디스크 드라이브(HDD)

서버는 메모리에 비해 CPU에서 떨어진 곳으로 배치된다. 주로 장기 저장 목적의 데이터 저장 장소이다. 메모리는 전기가 흐르지 않으면 데이터가 사라지며, 디스크는 전기가 없어도 데이터가 사리지지 않는다. HDD는 자기 원반의 회전 구조 때문에 속도가 물리 법칙에 의해 좌우된다. 따라서 최근에는 반도체로 만들어진 전기가 없어도 데이터가 사라지지 않는 SSD가 주로 사용된다.

서버와 I/O시에는 HDD가 직접 데이터 교환을 하는 것이 아니라 캐시를 통해서 한다. 캐시에 저장해서  I/O를 한다면 고속으로 할 수 있다. 하지만 데이터를 잃을 가능 성이 있다. 이런 쓰기를 라이트백(write back)이라고 한다. 캐시와 디스크를 모두 읽어서 라이트 백과 비교하고 더 확실한 쪽에 쓰기 처리를 위해 액세서 하는 경우 라이트 스루(write through)라고 한다. 이 경우에는 캐시의 장점이 없다. 

 

I/O 제어

I/O 핸들러(IOH), I/O 컨트롤러(ICH)가 있다.  IOH는 CPU와 가까운 곳에 있어서 노스 브릿지라고 하며 ICH는 사우스 브릿지라고 한다. IOH는 이전에는 메모리 I/O가 주 역할이었지만, CPU에 그 역할이 옮겨가고 지금은 다른 고속 처리가 필요한 I/O를 제어하고 있다. ICH는 속도가 느려도 괜찮은 DVD나 USB 등의 I/O 제어를 담당하며 IOH 간의 데이터 전송 제어도 한다.

 

버스(bus)

서버 내부에 있는 컴포넌트 들을 서로 연결시키는 회선을 가리킨다.

 

대역

데이터 전송 능력을 의미한다. '한 번에 데이터를 보낼 수 있는 데이터의 폭(전송 폭)' '1초에 전송할 수 있는 횟수(전송 횟수)'로 결정된다.

 

3계층형 시스템

3계층형 시스템은 웹서버, AP서버, DB서버로 나누어져 있다.

 

프로레스와 스레드

프로세스가 및 스레드가 활동하려면 메모리 공간이 필요하다. 이것은 커널에 의해 메모리 상에 확보된다. 하나의 프로세스가 동작하고 있으면 내부에서는 메모리 공간을 점유하는 스레드 하나가 동작하고 있다. 각 프로세스가 독자 메모리 공간을 가지고 있으며 프로세스 시작 시에 전용 메모리 공간을 요청해야 한다. 각 스레드는 메모리 공간을 공유하고 있다. 스레드 시작 시에 신규 메모리 공간은 필요 없지만, 다른 스레드에 영향이 발생하면 영향을 받는다.  프로세스는 독자 메모리 공간을 가지기 때문에 생성 시 CPU 부하가 스레드와 비교해 높아진다. 때문에 멀티 프로세스 애플리케이션에서는 프로세스 생성 부담을 낮추기 위해 미리 프로세스를 시작시켜 둔다. 

 

OS 커널

OS에서 커널은 OS의 본질이다. 커널 자체가 OS의 인프라이며 커널의 역할에는 여러 가지가 있다.

1. 시스템 콜 인터페이스

2. 프로세스 관리

3. 메모리 관리

4. 네트워크 스택

5. 파일 시스템 관리

6. 장치 드라이버

 

인프라를 지탱하는 기본 이론

직렬/병렬

- 직렬 처리로 속도를 올리는 데는 한계가 있다.

- 병렬화를 통해 속도는 빨라지지 않지만, 단위 시간당 처리량을 늘릴 수 있다.

- 병렬 처리에서는 합류점, 직렬화 구간, 분기점이 병목 지점이 되기 쉽다.

- 병렬화 할 때는 일을 분담해서 처리를 한 후 다시 집약할 때 오버헤드가 걸린다. 그러므로 이 오버헤드를 감안하더라도 효과가 있을 경우에 병렬화를 한다.

 

동기/비동기

-동기: 의뢰 처리가 끝났는지 여부를 쉽게 확인할 수 있어서 구조가 간단하고 구현 난이도도 낮다. 하지만 의뢰한 처리가 끝나기까지 기다려야 하기 때문에 대기 시간을 활용할 수 없다.

-비동기: 의뢰한 처리가 진행되고 있는 동안 시간을 효율적으로 사용해서 병렬 처리를 할 수 있다. 하지만 의뢰한 처리가 끝났는지 확인하지 않으면 모르기 때문에 불필요한 확인 처리가 필요하고 구조가 복잡해서 구현 난도가 높다.

 

배타적 제어

복수의 처리가 공유자원(CPU, 메모리, 디스크 등)에 동시에 액세서(주로 갱신)하면 불일치가 발생할 수 있기 때문에 배타적으로 보호해 주어야 한다.

배타적 제어에서는 특정 처리가 공유 자원을 이용하고 있는 동안 다른 처리가 이용할 수 없게 해서 불일치가 발생하지 않도록 해야 한다.

하지만 배타적 제어 때문에 대기가 많이 발생하게 되면 병목현상이 일어난다.

 

상태 저장/비저장

상태 저장이란, 상대가 상태 전이를 의식해서 처리하며 과거 경위를 이해한 상태에서 응답을 준다. 상태 비저장은 매번 신규 요청이 생성되는 것을 의미한다. 전자의 장점은 자신이 상태를 이해하기 때문에 요청 내용을 최소화할 수 있다는 것이다. 후자의 장점은 요청과 그에 대한 응답 구조가 간단하다는 것이다.

 

가변 길이/고정길이

가변 길이는 공간을 유용하게 활용할 수 있지만 성능면에서는 불안정하다.

고정 길이는 쓸데없는 공간이 생기지만 성능 면에서는 안정적이다.

 

인프라를 지탱하는 응용 이론

캐시(Cache)

사용빈도가 높은 데이터를 고속으로 액세스 할 수 있는 위치에 두는 것이다.

데이터 재사용을 전제로 하며 일부 데이터를 데이터 출력 위치와 가까운 지점에 일시적으로 저장한다. 캐시의 데이터가 손실돼도 문제가 없는 읽기 전용 데이터에 적합하고, 참조 빈도가 높은 데이터에 적합하다. 하지만 데이터 갱신 빈도가 높거나 대량의 데이터에 액세스 하는 세스템에서 캐시에 데이터를 두는 것은 적합하지 않다.

 

끼어들기(interrupt)

급한일을 먼저 하도록 CPU에 알리는 중요한 역할이다.

입출력 장치가 CPU에게 통지하는 끼어들기를 하드웨어 끼어들기라고 한다. 끼어들기는 어떤 일이 발생하면 연락하는 '이벤트 주도'구조이다. 반면에 CPU가 정기적으로 폴링(polling)해서 입출력 장치의 상태를 확인하는 방법도 있지만 폴링 간격이 길면 I/O가 완료됐더라도 금방 알아차리지 못하고 반대로 간격이 너무 짧으면 CPU를 쓸데없이 많이 사용하게 된다.

 

폴링(polling)

폴링은 정기적으로 질의하는 것을 의미한다. 질의 방향이 단방향이고 질의는 일정 간격을 따라 정기적으로 발생한다. 반복(루프)만 하면 되기에 프로그래밍이 쉽고 상대가 응답하는지 확인할 수 있으며 모아서 일괄적으로 처리할 수 있다.

전처리와 후처리가 연계되지 않는 경우에 적합하며, 외부에서 정기적으로 상태를 확인해야 하는 경우 적합하다. 하지만 상태가 아닌 입력 내용에 따라 실행 내용을 변경하는 처리는 이벤트나 끼어들기를 사용하는 것이 적합하며, 처리 우선순위를 정해야 하는 처리도 적합하지 않다.

 

핑퐁(pingpong)

물건을 상자에 넣어서 나를 때 적절한 크기의 상자를 사용하면 쉽게 나를 수 있다는 얘기가 있다. 상자가 너무 작으면 상자를 한 번에 나를 수 있는 양이 적어져서 빠르게 운반하기가 어렵다. 상자가 너무 커도 쓸데없는 공간이 많아져 빠르게 운반할 수가 없다. 상자가 너무 작아서 짐을 운반하기 위해 몇 번이고 왕복해야 하는 상황을 '핑퐁'이라고 부르기로 한다. 큰 상자는 데이터를 빠르게 운반할 수 있으며(처리량 중시), 작은 상자는 소량의 데이터를 빠르게 운반할 수 있다.(지연시간 중시)

 

저널링(journaling)

트랜잭션이나 매일 갱신되는 데이터의 변경 이력을 남겨두는 것을 저널링이라고 한다. 데이터 자체가 아닌 처리(트랜잭션)를 기록하며, 데이터 일관성이나 일치성이 확보되면 필요 없어진다. 데이터 복구 시 롤백(rollback), 롤 포워드(rollforward)에 이용된다.

저널링의 장점은 시스템 장애 시 복구가 빠르며 데이터 복제보다도 적은 리소스를 소비해서 데이터를 보호할 수 있다. 만약 데이터 안전성보다 성능을 중시하다면, 저널링은 기록 처리 시 오버헤드가 발생하기 때문에 이 오버헤드를 줄일 방법을 검토해야 한다.

 

 - 롤백(rollback): 저널을 읽어서 실제 데이터 정보를 과거로 되돌리는 처리

 - 롤 포워드(rollfoward): 저널을 읽어서 실제 데이터 정보를 앞으로 진행시키는 처리

 

저널 데이터는 메모리의 버퍼에 일단 저장된다. 이 정보가 디스크에 기록되지 않으면 장애 시에 잃을 수 있다. 이 때문에 시스템 요건에 따라 버퍼의 디스크 기록 시점을 검토, 조정해야 한다. 하지만 기록 빈도가 많으면 오버헤드도 높아지기 때문에 절충해서 검토해야 한다.

저널은 트랜잭션 단위로 일치성을 보증하기 때문에 트랜잭션 도중에 장애가 발생하면 종료되지 않은 트랜잭션은 파괴된다. 하나의 트랜잭션 단위가 크면 트랜잭션 도중에 장애가 발생할 가능성이 높다. 따라서 트랜잭션이 길어지지 않도록 설계해야 한다.

 

Copy-On-Write(COW):  '기록할 때 복사'라는 의미이다. 저널링처럼 증감 정보를 작성하지 않고 파일 갱신은 모두 '신규영역'에서 한다. 그리고 이것이 모두 완료된 시점에 파일이 참조할 위치를 이전 영역에서 신규 영역으로 순식간에 교체하는 방식이다. 이 방식의 장점은 데이터 변경 중에 장애가 발생해도 갱신이 진행됐다는 것을 다른 사람이 알 수 없다는 것이다. 즉, 순식간에 'All or Nothing(모두 처리하거나 아니면 아무 처리도 발생하지 않음)' 변경을 진행한다. 단 원 데이터가 그대로 남아 있는 상태에서 신규 데이터를 기록하기 때문에 데이터 영역이 최대 두 배가 필요하다는 단점이 있다.

 

복제(replicaton)

복제는 복사본을 만드는 것을 의미한다. 복사본이 있으면 원래 데이터가 없어져도 다른 것으로 대체할 수 있다(데이터 보호). 또한, 복사본을 활용해서 부하를 분산할 수도 있다. 데이터 손실을 허용하지 않고 장애 시 복구 속도가 빨라야 하는 시스템과 데이터 참조와 갱신 부분이 나뉘어 있으며 참조가 많은 시스템에 적합하다. 하지만 데이터 갱신이 많은 시스템에 적용하면 복제 대상 데이터가 많아지기 때문에 오버헤드가 높아진다. 또한, 경합 위험을 줄이기 위해 갱신은 한 곳에서 하는 것이 바람직하다. 이 때문에 갱신 처리의 부하분산에는 적합하지 않다.

 

마스터-슬레이브(master-slave)

명령하는 쪽과 명령을 받는 쪽의 관계이다. 이 구조에서는 한 명이 관리자가 돼서 다른 모든 것을 제어하게 된다. 반대로, 상호 관리라는 의미에서는 피어 투 피어(peer-to-peer) 관계도 성립한다. 관리자가 한 명이기 때문에 구현이 쉽고 슬레이브 간 처리를 동기화할 필요가 없어 통신량이 줄어든다. 하지만 마스터가 없어지면 관리를 할 수 없고(작업 인계 구조가 필요) 마스터의 부하가 높아진다.

 

압축

디지털 데이터 압축의 기본은 '중복 패턴 인식'과 그것을 '변경'하는 것이다. 디지털 데이터는 이진수라는 공통 단위로 표현되기 때문에 그것이 이미지이든 문자열이든 동일한 방법으로 압축할 수 있다. 중복 패턴을 이용하기 때문에 같은 패턴이 많을수록 압축률이 높아진다(파일크기가 작아진다.). 

 - 가역 압축: '이미 알고 있는 정보'를 제거하는 압축 방식

 - 비가역 압축: '자신에게 필요 없는 정보'를 제거하는 압축 방식

크기를 작게 해서 데이터 처리나 교환 시 오버헤드를 줄일 수 있다는 장점이 있지만, 압축/해제 처리로 인해 리소스 부하가 높아지거나 처리 시간이 증가한다는 단점도 있다.

 

오류 체크/오류 수정

 -패리티 비트: 패리티 비트는 오류 검출할 때 자주 사용되는 방법으로, 단지 그것이 틀렸다는 것을 알면 된다는 이론에 기초한다. 추가 비트를 부여하는 방법으로, 비트에서 반드시 1이라는 수가 짝수 개 또는 홀수 개가 되도록 1비트만 추가한다. 추가 데이터를 부여해야 하므로 데이터 양이 증가하며, 오류 여부를 알기 위한 계산이 필요해서 처리에 오버헤드가 발생한다.

 

오류 체크는 디지털 데이터의 오류를 스스로 확인하고, 파손되었을 때 이를 감지하는 것을 의미한다. 오류 수정은 자동으로 복구하는 것을 가리킨다. 장점은 상위 계층에서의 오류 관리 없이 데이터 일치성을 일정 수준 보장할 수 있다는 것이고 단점으로는 체크 기능에 의한 리소스 부하 상승, 알고리즘의 복잡화 등을 들 수 있다.

 

시스템을 연결하는 네트워크 구조

네트워크 계층 구조에서 각 층은 상호 간에 어떤 일을 하는지는 알고 있지만, 구체적으로 어떤 방식으로 처리하고 있는지는 알지 못한다. 즉, 은폐화돼 있다.  또한, 계층 구조이기 때문에 계층 간에 서로 영향을 주지 않고 독립적으로 동작할 수 있다. 상호 간에 내부 처리를 은폐하고 있기 때문에 인터페이스만 바꾸지 않으면 각 계층이 내부적인 처리를 마음대로 바꾸어도 문제없다.

 

OSI 7 계층 모델

OSI 통신 기능을 7개의 계층으로 나눈 것이다.  OSI는 현재 사용되고 있지 않지만, 이 계층 구조 개념은 다양한 분야에서 공통적으로 참조할 수 있는 '참조 모델'로 현재도 사용되고 있다.

 

   물리 계층: 전기적인 접속

   데이터 링크 계층: 직접 접속돼 있는 기기간 처리

   네트워크 계층: 네트워크 통신 경로 선택

   전송 계층: 네트워크의 통신 관리

   세션 계층: 통신 시작과 종료 순서

   프레젠테이션 계층: 데이터 표현 방법

   애플리케이션 계층: 애플리케이션 관리

 

프로토콜

컴퓨터가 서로 소통하기 위해 정한 규약, 같은 계층 간의 약속이다.

 

TCP/IP 프로토콜

명칭 그대로 TCP와 IP의 두 가지 프로토콜을 주축으로 한 프로토콜 집합이다. 주축이라고 하지만 TCP를 반드시 사용해야 하는 것은 아니며, IP는 통신 상대 지정 시에 IP 주소를 이용하기 때문에 반드시 필요하다고 할 수 있다.

TCP/IP 4 계층 모델 등으로 불리며, OSI 7 계층의 1~2 계층을 모아서 링크 계층, 5~7 계층을 모아서 애플리케이션으로 취급하기도 한다.

 

[레이어 7] 애플리케이션 계층의 프로토콜 HTTP

애플리케이션 계층 프로토콜은 자신은 통신을 하는 것이 아니라 통신 자체는 모두 OS, 즉 TCP/IP에 맡긴다. 클라이언트와 웹서버는 HTTP를 통해서 요청과 응답을 주고받는다. HTTP가 그 하위 계층인 IP나 유선을 통해 명령을 보내거나 통신 제어를 하지는 않는다. 이 때문에 HTTP 요청은 여러 가지 명령만으로 구성돼서 매우 간단한 구조이다.

 

[레이어 4] 전송 계층 프로토콜 TCP

소켓에 기록된 애플리케이션 데이터는 커널 내에서 통신 대상에게 전달하기 위한 준비를 시작한다.  TCP(Transmission Control Protocol)는 명칭 그대로 전송을 제어하는 프로토콜로, 신뢰도가 높은 데이터 전송을 가리킨다.

TCP는 애플리케이션이 보낸 데이터를 그 형태 그대로 상대방에게 확실하게 전달하는 것이다. TCP가 담당하는 것은 어디까지나 서버가 송신할 때와 서버가 수신한 후 애플리케이션에게 전달할 때로, 상대 서버까지 전송하는 부분은 하위 계층인 IP에 모두 위임한다.

 

주요 기능

 - 포트 번호를 이용해서 데이터 전송

 - 연결 생성

 - 데이터 보증과 재전송 제어

 - 흐름 제어와 폭주 제어

 

TCP는 세그먼트(segment)라고 하는 단위로 데이터를 관리하고 있다. 이 때문에 애플리케이션 데이터에 TCP헤더를 붙여서 TCP 세그먼트를 작성한다. 헤더에는 도착지점 포트 번호를 포함해서 TCP기능을 표현하기 위한 수많은 정보가 기록된다. 하나의 TCP 세그먼트로 전송할 수 있는 최대 데이터 크기를 MSS(Maximum Segment Size)라고 한다. 최종적으로 링크 계층을 사용해서 데이터를 전송하기 때문에 MSS는 링크 계층에서 전송할 수 있는 최대 크기에 의존하며, 환경이나 설정에 따라 달라진다. 링크 계층에서 전송할 수 있는 최대 데이터 크기를 MTU(Maximum Transfer Unit)이라고 한다.

 

TCP에서는 포트 번호를 사용해서 어떤 애플리케이션에 데이터를 전달할지 판단한다.

 

TCP는 연결형 프로토콜로, 연결이라 불리는 가상 경로(버추얼 서킷)를 생성한다. 서버 측 소켓은 자신이 지정한 포트번호에 통신이 오는지를 기다렸다가 받는다. 이 상태를 포트를 리슨(listen)하고 있다고 한다. 

 

통신을 시작하고 싶은 클라이언트는 커널에게 통신 개시를 의뢰한다. 이 커널은 가상 경로를 생성하기 위해 상대방과 대화를 시작한다. 먼저, 통신 상대인 서버 측 OS에게 가상 경로를 열도록 의뢰한다. 서버 측에서는 리슨 하고 있는 포트 번호로 통신 요구가 온다. 서버는 문제가 없으면 열어도 된다는 응답을 한다. 클라이언트 측도 확인했다는 메시지를 보내며, 이때 처음으로 통신용 가상 경로가 열린다. 이 세 번의 대화를 TCP/IP의 3-way handshaking이라고 한다.

 

연결이 생성된 후에야 데이터 송수신이 시작된다. 수신 측에 TCP세그먼트가 도착하면, 수신 측은 송신 측에 데이터가 도착했음을 알린다. 이때 반환하는 것을 ACK라고 하며, TCP헤더에 ACK 관련 정보를 넣은 TCP세그먼트를 반환한다. 송신 측은 ACK가 돌아오는 것을 보고 전송한 세그먼트가 무사히 도착했다는 것을 알 수 있다. ACK가 오지 않으면 전송한 TCP세그먼트가 어떤 이유로 사라졌을 가능성이 있다. 이러한 방식으로 데이터 보증을 한다.

 

다음은 데이터 순서 보증구조이다. 각 TCP 세그먼트에 시퀀스 번호라고 하는 숫자를 붙여 구현한다. 시퀀스 번호도 TCP 헤더에 기록되며, 해당 TCP 세그먼트가 가지고 있는 데이터가 전송 데이터 전체 중 몇 바이트째부터 시작하는 부분인지를 가리키고 있다. 수신 측인 이 시퀀스 번호를 사용해서 원래 순서대로 데이터를 조립한다. 이러한 순차적 조합을 위해 수신 측은 ACK를 반환할 때 다음에 필요한 TCP 세그먼트의 시퀀스 번호도 ACK번호로 전달한다. 

 

ACK가 오지 않으면 재전송한다고 말했지만, 어느 시점에 재전송을 하는 것 일까? 첫 번째는 타임아웃이다. 일정 시간 내에 ACK가 돌아오지 않으면 재전송한다. 두 번째는 송신 측에 같은 ACK가 계속 돌아오지만, 한번 받은 ACK 번호와 같은 것이 중복돼서 도착한 경우 그 번호에 해당하는 TCP세그먼트가 도착하지 않았다고 간주하고 재전송한다. 이것을 중복 ACK라고 한다.  1회 중복 ACK로 바로 재전송하지 않고 3회까지 기다리는 것은 가끔 해당 세그먼트만 경로 도중에 지연돼서 도착 순서가 바뀔 수 있기 때문이다.

 

하지만 이렇게 데이터를 보내고 ACK를 기다리는 처리를 반복하다 보면 동기 통신이기 때문에 시간이 오래 걸린다. 따라서 TCP는 어느 정도의 세그먼트 수라면 ACK를 기다리지 않고 전송하는 윈도라는 개념을 가지고 있다. ACK를 기다리지 않고 전송 가능한 데이터 크기를 윈도 크기라고 한다. 수신 측의 수신 윈도와 송신 측의 폭주(송신)윈도우가 있으며 기본적으로는 수신 측이 폭주 윈도우 크기를 조정해서 폭주 윈도우와 수신 윈도우 중 작은 쪽을 송신 윈도로 채택하며, 이 범위 내에서는 ACK를 기다리지 않고 전송한다. 

 

[레이어 3] 네트워크 계층의 프로토콜 IP

Internet Protocol의 약자이다. 지정한 대상 서버까지 전달받은 데이터를 전해 주는 역할을 한다. 하지만 IP에서는 반드시 전달된다는 것을 보장하지는 않는다. 

 

주요 기능

 - IP주소를 이용해서 최종 목적지에 데이터 전송

 - 라우팅(routing)

 

IP 계층에서는 최종 목적지가 적힌 IP 헤더를 TCP 세그먼트에 추가해서 IP 패킷을 생성한다. 헤더에는 목적지 IP주소 외에 저장하고 있는 데이터 길이, 프로토콜 종류, 헤더 체크섬 등이 기록된다. IP에서는 최종 목적지 서버까지 복수의 네트워크를 경유해서 데이터를 전송한다. 이때 이용되는 것이 대상 서버를 나타내는 IP 주소다.  IP 주소 중 호스트부의 비트가 모드 0인 것을 네트워크 주소, 모두 1인 것을 브로드캐스트 주소라고 한다. 브로드캐스트 주소로 보낸 패킷은 네트워크의 모든 호스트에 전달된다.

 

라우팅

IP 패킷을 받은 라우터는 해당 IP 패킷의 헤더에서 목적지를 확인해서 어디로 보내야 할지를 확인한다. 이때 사용되는 것이 라우팅 테이블(경로표)이라는 것이다. 서버나 라우터는 자신이 알고 있는 목적지 정보를 라우팅 테이블이라 하는 형태로 목록화한다. 라우팅 테이블은 사람이 직접 입력한 경로 정보나 자신의 서버에 설정된 IP주소로 파악할 수 있는 정보 등 다양한 정보를 이용해서 구성된다. 외부와 접속하는 네트워크는 보통 기본 게이트웨이라는 라우터가 설치돼있다. 

 

네트워크에서 패킷이 계속 순회하게 되는 경우를 방지하기 위해 IP 헤더는 TTL(Time To Live)이라는 생존시간 정보를 가지고 있다. 라우터를 하나 경유할 때마다 라우터가 IP 헤더 TTL을 1씩 줄여서 전송한다. TTL이 언젠가 줄어서 0이 되면 패킷 생존 시간이 끝나기 때문에 라우터가 패킷을 파괴한다.

 

[레이어 2] 이더넷

IP 패킷이 만들어지면 계속해서 링크 계층의 처리가 시작된다. 링크 계층에서 사용되는 대표적인 프로토콜은 이더넷(ethernet)이다. 이더넷은 유선 랜에서 사용되는 링크 계층 프로토콜이다. 동일 네트워크 내의 네트워크 장비까지 전달받은 데이터를 운반하는 역할을 한다.

IP는 IP 주소를 사용해서 여러 네트워크를 거쳐 데이터를 전송할 수 있지만, 이더넷은 동일 네트워크 내, 즉 자신이 포함된 링크 내에서만 데이터를 전송할 수 있다. 이때 사용되는 주소가 MAC(맥) 주소다.

 

MAC 주소는 네트워크 통신을 하는 하드웨어에 할당된 주소로, 원칙적으로는 세상에 있는 모든 장비가 고유한 물리 주소를 가지고 있다. MAC 주소는 48비트로 표현한다. 

 

이더넷 헤더에는 MAC 주소를 목적지로 기입한다. 단, 여기 적히는 것은 동일 링크 내에 있는 장비의 MAC 주소이다. IP 주소에 라우팅 테이블이 있었던 것처럼 ARP테이블(MAC 테이블)이라 불리는 표가 있다. IP 주소와 MAC 주소의 대응 관계를 기록한 표다. 

 

이더넷 등 해당 링크 층에서 하나의 프레임으로 전송할 수 있는 최대 크기를 MTU(Maximum Transfer Unit)라고 한다.  TCP의 MSS는 링크 계층의 크기에 따라 변동된다고 했는데, 바로 MTU의 크기에 의해 변동되는 것이다. MTU에서 IP 및 TCP 헤더 크기를 뺀 것이 TCP의 MSS다.

 

VLAN(Virtual LAN)

VLAN은 물리 구성에 의존하지 않고 가상적인 네트워크를 나누는 구조다. 가상적으로 나눈 네트워크는 VLAN ID라 불리는 숫자로 관리한다.