Search
Duplicate

네트워크 통신하기

목차

1. 유니캐스트, 멀티캐스트, 브로드캐스트, 애니캐스트

네트워크에서 출발지 → 목적지로 데이터를 전송할 때 사용하는 통신 방식은 다음과 같다.

유니캐스트

1:1 통신
출발지와 목적지가 1:1로 통신
대부분의 통신은 유니캐스트 방식을 사용한다.

브로드캐스트

1:N통신
⇒ 동일 네트워크에 존재하는 모든 호스트가 목적지
⇒ 유니캐스트로 통신하기 전, 주로 상대방의 정확한 위치를 알기 위해 사용된다.
⇒ 기본 동작은 로컬 네트워크 내에서 모든 호스트에 패킷을 전달해야 할 떄 사용된다.

멀티캐스트

1:N(멀티캐스트 구독 호스트)통신
하나의 출발지에서 다수의 특정 목적지로 데이터 전송
IPTV와 같은 실시간 방송을 볼 때 이 멀티캐스트 통신 방식을 사용한다.
사내방송, 증권 시세 전송과 같이 단방향으로 다수에게 동시에 같은 내용을 전달해야 할 때 사용된다.

애니캐스트

⇒ 1:1 통신(목적지는 동일 그룹 내의 1개 호스트)
⇒ 다수의 동일 그룹 중 가장 가까운 호스트에서 응답
⇒ IPv4에서는 일부 기능 구현, IPv6은 모두 구현 가능
애니캐스트 게이트웨이의 성질을 이용해 가장 가까운 DNS서버를 찾을 떄 사용한다.
가장 가까운 게이트웨이를 찾는 애니캐스트 게이트웨이 기능에 사용한다.
최종 통신은 1:1로 유니캐스트와 동일하지만 통신 대상 후보자는 서로 다르다.
⇒ 유니캐스트는 출발지와 목적지가 모두 한 대씩이다.
⇒ 애니캐스트는 같은 목적지 주소를 가진 서버가 여러대여서 통신 가능한 다수의 후보군이 있다.

정리

현재 주로 사용되는 네트워크 주소체계는 IPv4 기반이다.
(일부 모바일 네트워크 및 대규모 데이터 센트 위주로 IPv6 기반이 사용되고 있다. )
IPv6에서는 브로드캐스트가 존재하지 않고 링크 로컬 멀티캐스트로 대체되어 사용된다.
4가지 통신 방식을 요약하면 다음과 같다.
타입통신대상범위IPv4IPv6예제유니캐스트1:1전체 네트워크OOHTTP브로드캐스트1:N(All)서브넷(로컬 네트워크)OXARP멀티캐스트1:N(Group)정의된 구간OO방송애니캐스트1:1전체 네트워크O6 to 4 DNS\begin{array}{|c|c|c|c|c|c|}\hline \text{타입}&\text{통신대상}&\text{범위}&\text{IPv4}&\text{IPv6}&\text{예제}\\\hline \text{유니캐스트}&\text{1:1}&\text{전체 네트워크}&\text{O}&\text{O}&\text{HTTP}\\\hline \text{브로드캐스트}&\text{1:N(All)}&\text{서브넷(로컬 네트워크)}&\text{O}&\text{X}&\text{ARP}\\\hline \text{멀티캐스트}&\text{1:N(Group)}&\text{정의된 구간}&\text{O}&\text{O}&\text{방송}\\\hline \text{애니캐스트}&\text{1:1}&\text{전체 네트워크}&\text{△}&\text{O}&\text{6 to 4 DNS}\\\hline \end{array}
통신 방식을 구분할 때 핵심은 실제 데이터를 전달하려는 출발지가 기준이 아니라 목적지 주소를 기준으로 구분한다는 점이다.

참고: BUM트래픽

B(Broadcast), U(Unknown Unicast), M(Multicast)를 지칭하는 단어로 서로 다른 종류의 트래픽이지만 네트워크에서 동작은 비슷하다. BUM 트래픽에 대한 이해가 중요한 이유는 유니캐스트지만 실제 겉으로 보이는 동작 방식은 브로드캐스트에 가깝기 때문이다.
(유니캐스트이기에 전달받는 모든 단말 NIC에서는 도착지 주소 확인 후 자신이 목적지가 아닐경우 패킷을 버린다. )
Unknown Unicast
: 목적지 주소는 명시되어 있지만 네트워크에서의 동작은 브로드캐스트와 같을 때를 가리킨다.
유니캐스트이기에 목적지는 명시되어있지만, 스위치가 목적지에 대한 주소를 학습하지 못한 상황(이런 상황을 스위치 입장에선 Unknown이라 한다.) 이기에 패킷을 모든 포트로 플러딩(전송)하는데 이런 유니캐스트를 Unknown Unicast라 한다.
네트워크 입장에서 네트워크 자원이 불필요하게 사용되기에 불필요한 BUM 트래픽이 많아질수록 네트워크 성능은 저하될 수 있다.
이더넷 환경에서는 ARP브로드캐스트를 먼저 보낸 뒤 통신을 시작하기에 BUM 트래픽이 많이 발생하지 않는다.

2. MAC 주소

MAC(Media Access Control)은 2계층(데이터 링크 계층)에서 통신을 위해 네트워크 인터페이스에 할당된 고유 식별자다. 이 MAC 주소는 이더넷과 와이파이를 포함한 대부분의 IEEE 802 네트워크 기술에서 2계층 주소로 사용되며 네트워크에 접속하는 모든 장비는 이러한 MAC주소가 있어야 하며 이 주소로 서로 통신하게 된다.

MAC 주소 체계

주소를 변경할수 없도록 하드웨어에 고정되어 있다.
제조업체마다 하나 이상의 주소풀을 주고 각 제조업체는 이 주소풀 안에서 자체적으로 MAC 주소를 할당한다.
⇒ 네트워크 장비 제조업체에서 주소풀을 할당하는 것을 제조사 코드(Vender Code)라 하며 국제기구인 IEEE에서 관리한다.
48비트의 16진수 12자리로 표현되며, 앞의 24비트와 뒤의 24비트로 나눠 구분한다.
⇒ 앞의 24비트가 IEEE가 제조사에 할당하는 제조사 코드이다.
⇒ 뒤의 24비트는 각 제조사에서 자체적으로 할당하는 부분이다.
네트워크 카드(혹은 장비)를 생산할 때 하드웨어적으로 정해져 나오기에 MAC주소를 BIA(Burned-In Address)라고도 부른다.

참고 - 유일하지 않은 MAC주소

언제나 예외는 있듯이 MAC주소도 유일하지 않을수도 있다.
제조업체 측에서 뒤의 24비트의 UAA값을 실수(혹은 의도적으로) MAC주소가 중복될 수 있다.
이러한 MAC주소도 어짜피 동일 네트워크에서만 중복되지 않으면 동작하는데는 문제가 없다.
만약 다른 네트워크와 통신을 해야해서 라우터의 도움을 받아야 한다면 출발지와 목적지의 MAC주소가 변경되기에 네트워크를 넘어가면 기존 출발지와 도착지의 MAC주소를 유지하지 않는다.

MAC 주소 동작

NIC(Network Interface Card)는 MAC주소를 가지고 있다.
NIC는 전기 신호가 들어오면 2계층에서 데이터 형태(패킷)로 변환하여 내용을 구분한 뒤 도착지 MAC주소를 확인한다.
⇒ 만약 도착지 MAC주소가 자신이 갖고있는 MAC주소와 다를경우 패킷을 폐기한다.
⇒ MAC주소가 같거나 브로드캐스트, 멀티캐스트와 같은 그룹주소일 경우 처리해야 할 주소로 인지해 패킷 정보를 상위 계층으로 넘겨준다.
NIC는 목적지 MAC주소가 자신을 목적지로 한 패킷만 수용한다.
본인의 주소, 브로드캐스트 주소는 NIC가 자체적으로 패킷을 처리하는게 아니라 OS나 애플리케이션에서 처리해야 하기 때문에 시스템 부하가 작용한다.
브로드캐스트 스톰의 경우 브로드캐스트가 회선을 모두 채우게 되는데 네트워크에 연결된 모든 단말이 브로드 캐스트를 처리하느라 CPU사용량이 증가한다. (브로드캐스트 스톰은 4장 의 3.1 루프란?에서 나오는 내용)

참고: 무차별 모드(Promiscuous Mode)

NIC는 불필요한 패킷(자신의 MAC주소와 일치하지 않는 도착지 주소를 가진 패킷)을 폐기하기 때문에 디버그및 분석 용도나 모니터용도로 전체 패킷을 수집해야 할 경우 NIC가 정상동작을 하면 다른 목적지를 가진 패킷을 분석할 수 없다.
만일 다른 목적지를 가진 패킷도 분석및 수집이 필요하다면 무차별 모드로 NIC를 구성하면 된다.
무차별 모드는 자신의 MAC 주소와 상관없는 패킷이 들어와도 이를 분석할 수 있도록 메모리에 올려 처리할 수 있도록 한다.
이런 무차별 모드를 사용하는 가장 대표적인 사례로는 와이어샤크(Wireshark)가 있다.

3. IP 주소

OSI 7계층에서 주소를 갖는 계층은 물리적 주소인 MAC주소를 갖는 2계층과 IP주소를 사용하는 3계층이 있다. 대부분의 네트워크는 TCP/IP로 동작하기 때문에 IP주소 체계를 이해하는것은 중요하다.

특징

1.
사용자가 변경 가능한 논리 주소이다.
2.
주소에 레벨이 있으며 그룹을 의미하는 네트워크 주소와 호스트 주소로 나뉜다.

IP 주소 체계

⇒ IP주소및 IP클래스에 대한 상세한 내용은 위 북마크를 참조하도록 하자.
IP 주소는 우리가 흔히 아는 IPv4(32비트)와 IPv6(128비트)가 있다.
IPv4 주소를 표기할 때 우리는 다음과같이 표현을 한다.
IPv4 주소체계
각각 8-bit 크기의 4개 영역으로 나뉘는데 하나의 구분을 옥텟(Octet)이라 부른다.
이 옥텟은 dot(.) 으로 구분하며 10진수로 표기하기에 8-bit 옥텟은 0~255 값을 쓸 수 있다.

특징

네트워크 주소호스트 주소 두 부분으로 나뉜다.
네트워크 주소: 호스트들을 모은 네트워크를 지칭하는 주소로 해당 주소가 동일한 네트워크를 로컬 네트워크라 한다.
호스트 주소: 하나의 네트워크 내의 존재하는 호스트를 구분하기 위한 주소
네트워크 주소호스트 주소를 구분하는 경계점이 고정되어 있지 않다.
필요한 호스트IP 갯수에 따라 네트워크의 크기를 다르게 할당할 수 있는 클래스 개념을 도입했다.
클래스는 옥텟을 구분자로 사용하는데 이 구분자를 서브넷 마스크라 한다.
현재는 이런 클래스 기반을 잘 사용하지 않는다.
⇒ 더 세밀하게 분할및 할당하기위해 필요 네트워크 크기에 맞춰 1비트 단위로 네트워크를 상세히 분할하는 방법을 사용한다.

클래스풀

클래스 기반의 IP주소 체계를 클래스풀(Classful)이라 하는데, IP주소 체계 등장 초기에는 확장성과 비용절약등 좋은 방법이였다. 이 주소 체계에서는 네트워크 주소와 호스트 주소를 구분짓는 서브넷 마스크도 필요없었다. 맨 앞자리 숫자만봐도 클래스 구분이 가능했기에 주소 구분자를 사용할 수 있었다.

클래스리스 네트워크의 등장

시간이 지남에 따라 클래스풀 기반 주소 체계로도 감당이 힘든 시기가 왔다. 이론적으로 IPv4에서사용가능한 IP의 개수는 대략 43억개지만 실제 사용가능한 IP 갯수는 훨씬 적을 것이고 그 숫자는 인구가 하나씩 가질수도 없는 숫자이다.
그래서 이런 문제를 해결하기 위해 3가지 보존, 전환 전략을 만들었는데 다음과 같다.
클래스 리스, CIDR(Classless Inter-Domain Routing)기반의 주소체계
: IPv4에서 주소 자체가 부족하다는 문제도 있지만, 그 외에도 상위 클래스(A Class)를 할당받은 조직에서 대부분 제대로 사용을 못하고 낭비되는 것도 문제다. 수천만 개의 IP를 사용할 수 있는 A클래스 를 할당받아도 그중 많아야 수만개 정도에서 끝나면 나머지는 다 낭비되며 다른 조직이나 기관에서 사용할수도 없다. 이러한 문제를 해결하기 위해 클래스라는 개념을 버리게되고 이를 클래스리스라 부른다. 현재 우리가 사용하는 주소 체계는 클래스 개념을 적용하지 않는 클래스리스 기반 주소체계이다. 클래스 리스 네트워크에서는 별도로 네트워크와 호스트 주소를 나누는 구분자가 필요한데 이를 서브넷 마스크(Subnet Mask)라 부른다. 이러한 서브넷 마스크는 IP주소와 네트워크 주소를 구분할 때 사용하며 다음과 같이 표시한다.
2진수 숫자 1: 네트워크 주소
2진수 숫자 0: 호스트 주소
이를 10진수로 사용하면 255.0.0.0, 255.255.0.0, 255.255.255.0와 같이 표현할 수 있다. 이해를 돕기위해 103.9.32.146이라는 가상의 주소로 예시를 들면 해당 주소가 255.255.255.0 서브넷 마스크를 사용하는 IP라면 서브넷 마스크와 곱연산을 통해 네트워크 주소와 호스트 주소를 알아낼 수 있다.
네트워크 주소 구하기
결과는 위 표와 같이 네트워크 주소는 103.9.32.0이 되고 호스트 주소는 0.0.0.146이 된다.
클래스리스 기반의 IP네트워크에서는 네트워크 표현에 있어 서브넷 마스크가 필수이다.
NAT와 사설 IP주소
IPv6

서브네팅

서브네팅에 대한 자세한 내용은 북마크를 참조하자. 해당 포스팅에서는 간략하게 다루도록 한다.
서브네팅은 부여된 클래스 기준을 무시한채로 새로운 네트워크-호스트 구분 기준을 사용자가 정해 원래 클래스풀 단위의 네트워크보다 더 쪼개 사용하는 것을 말한다.
이처럼 부여된 주소를 다시 잘라사용하는 것을 서브네팅이라 하며 현대 클래스리스 네트워크의 가장 큰 특징이기도 하다.
이 서브네팅이 어려운 이유는 옥텟 단위가 아닌 2진수의 1비트 단위로 네트워크를 분할하기 때문이다.
옥텟(Octet)이 아닌 2진수 자리 단위로 서브네팅을 한다.
그럼 이러한 서브네팅을 실무에서 언제 고민하고 해야하는 걸까?
네트워크 디자인 단계에서 네트워크 설계자가 계획하는 경우
이미 분할된 네트워크에서 사용자가 자신의 네트워크와 원격지 네트워크를 구분해야 하는 경우
즉, 네트워크 사용자 혹은 설계자 입장에 따라 고려할 요소와 범위가 달라지는데 다음과 같다.
네트워크 사용자 입장
⇒ 네트워크에서 사용할 수 있는 IP범위 파악
⇒ 기본 게이트웨이와 서브넷 마스크 설정이 제대로 되있는지 확인
⇒ 간단한 서브네팅 방법
0. previous IP 주소: 103.9.32.146 서브넷 : 255.255.255.192 1. 서브넷 마스크를 2진수로 변환한다. => 11111111.11111111.11111111.11000000 2. 현재 서브넷이 가질 수 있는 최대 IP 개수를 파악한다. => 끝이 11000000 이기에 6비트를 가질 수 있고 2^6 = 64개를 가질 수 있다. 3. 64의 배수로 나열해 기준이 되는 네트워크 주소를 파악한다. => 0 ~ 63, 64 ~ 127, 128 ~ 191, 192 ~ 255 => 각 네트워크의 마지막 주소는 브로드캐스트 주소가 된다. 4. 103.9.32.146에서 호스트 주소 146이 속한 네트워크를 선택한다. => 128 ~ 191 5. 필요한 주소를 정리한다. => 네트워크 주소: 103.9.32.128 (첫 번째 숫자) => 브로드캐스트 주소: 103.9.32.191 (마지막 숫자) => 유효 IP범위 : 103.9.32.129 ~ 103.9.32.190 (네트워크 주소와 브로드캐스트 주소 사이)
Plain Text
복사
네트워크 설계자 입장
⇒ 네트워크 설계 시 네트워크 내에 필요한 단말을 고려한 네트워크 범위 설계
⇒ 사용자와 반대로 서브넷 마스크가 지정되어 주어지는 것이 아닌 네트워크의 크기를 고민해 서브넷 마스크를 결정하고 설계에 반영해야 한다.
⇒ 설계자가 IP설계시 고려해야 할 부분은 다음과 같다.
→ 서브넷된 하나의 네트워크에 IP를 몇 개나 할당해야 하는가?(or PC는 몇 대나 있는가)
→ 서브넷된 네트워크가 몇 개나 필요한가?
⇒ 회사 네트워크 설계를 예로드는 예시
0. previous => 12곳의 지사가 있다. => 지사는 최대 12대의 IP가 필요한 PC와 복합기, IP 카메라가 운영될 것이다. => 현재 가진 네트워크는 103.9.32.0/24 네트워크이다. 1. 서브넷된 하나의 네트워크에 12개 IP를 할당해야 한다. 2. 네트워크는 2진수의 배로 커지기에(4, 8, 16, 32, 64, 128, 256) 2진수 단위로 네트워크 할당이 가능하다. => 12개의 IP를 수용할 수 있는 최소한의 네트워크는 16개이다. => 네트워크 &브로드캐스트 주소(2개)를 제외해야하기에 실제 사용가능한 IP는 14개 3. 16개짜리 네트워크 12개를 확보한다. 네트워크주소 / 브로드캐스트 주소/ 유효 IP범위 / 할당 103.9.32.0 / 103.9.32.15 / 103.9.32.1~14 / 네트워크 장비 주소 103.9.32.16 / 103.9.32.31 / 103.9.32.17~30 / 시리얼 구간(라우터 중간 네트워크 할당용) 103.9.32.32 / 103.9.32.47 / 103.9.32.33~46 / 1번 지사 ... ... 103.9.32.208/ 103.9.32.223 / 103.9.32.225~238/ 12번 지사 ... 103.9.32.240/ 103.9.32.254 / 103.9.32.241~253/ 추후 할당
Plain Text
복사

공인 IP와 사설 IP

공인아이피: 전 세계에서 유일해야 하는 식별자.
사설아이피: 개인적으로 구성되어 IP주소를 할당받지 않고 구축되어 사용되는 식별자
실제 인터넷에 접속하기 위해서는 공인 IP주소가 필요하다.
하지만, 공인 IP는 통신사업자로부터 할당받거나 IP할당기관에서 인터넷 독립기관 주소를 할당받은 후 독립 IP를 할당받아야 하기에 그 과정이 쉽지 않다.
그래서 인터넷에 접속하지 않거나 NAT(Network Address Translation, 네트워크 주소 변환)기술을 사용한다면 사설 IP주소를 사용할 수 있다.
이러한 사설 IP를 사용하면 인터넷에 직접 접속하진 못하지만 IP를 변환해주는 NAT장비를 통해 공인 IP로 변경한 뒤 인터넷 접속은 가능하다. 그래서 흔히 우리가 가정에서 사용하는 공유기들은 NAT장비 역할을 해준다.
그리고 사설 네트워크 구축시 주의점이 있는데, NAT을 사용해서 인터넷에 접속을 하더라도 다른 사용자에게 할당된 IP를 사설 네트워크 주소로 사용해서는 안된다. 그 이유는 내부 네트워크의 할당된 IP를 공식으로 사용하는 네트워크로 접속할 수 없기 때문이며 그 때문에 RFC에 명시된 어인터넷 어느 구간에서도 사용되지 않는 사설 IP대역을 사용할것을 추천한다.
다른 기관에서 사용하는 공인 IP를 회사 내부에서 사용하면 접속이 불가능하다.
⇒ C회사에서 A회사로 접속을 시도할 경우 C회사 서버는 A회사의 서버가 같은 네트워크에 존재한다고 판단해서 A회사 서버인 20.0.0.20과 통신하기위해 브로드캐스트한다. 실제로는 인터넷 구간을 거쳐서 원격지과 통신 시도를 서로 인식해야하지만, 같은 네트워크로 판단하기에 정상적인 통신이 불가능하다.

Bogon IP

IP주소 할당 최상위 기구(IANA)가 여러 목적으로 예약해서 공인 IP로 할당하지 않는 주소를 Bogon IP라 한다.
0.0.0.0/8: "This" 네트워크
127.0.0.0/8: 루프백(Loopback)주소
127.0.53.53 : 네임 콜리전 발생
169.254.0.0/16: 링크 로컬(Link Local)
172.16.0.0/12: 사설 네트워크
192.0.0.0/24: IETF 프로토콜 할당
192.0.2.0/24: 테스트용
10.0.0.0/8: 사설 네트워크
198.51.100.0/24: 테스트용
203.0.113.0/24: 테스트용
224.0.0.0/4: 멀티캐스트용
240.0.0.0/4:예약
255.255.255.255/32: 브로드캐스트
192.168.0.0/16: 사설 네트워크
100.64.0.0/10: 캐리어 그레이드 NAT(통신사업자에게 사설 IP주소를 할당하기위해 사용)
198.18.0.0/15: 네트워크 인터커넥트 디바이스 벤치마크 테스팅

4. TCP와 UDP

OSI 7계층 중 4계층에서 동작하는 프로토콜의 목적은 목적지 단말 안에서 동작하는 여러 애플리케이션 프로세스 중 통신해야 할 목적지 프로세스를 정확히 찾아가고 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 만들어내는데 있다.
TCP/IP 프로토콜 스택의 4계층에서 동작하는 TCP와 UDP 프로토콜에 대해서 이제 알아보도록 하자.

4계층 프로토콜(TCP, UDP)와 서비스 포트

데이터를 주고받는 인캡슐레이션과 디캡슐레이션 과정에서 각 계층별로 정의하는 헤더가 추가되고 여러 정보들이 들어간다. 그 중에서 우리가 기억해야할 중요한 두 가지정보는 다음과 같다.
각 계층에서 정의하는 정보와 프로토콜 지시자
각 계층에서정의하는 정보
⇒ 수신 측의 동일 계층에서 사용하기 위한 정보로 송신측에서 추가한 2계층 헤더의 MAC 주소 정보는 수신측의 2계층에서 확인/사용된다. 또한 송신측에서 추가한 3계층 IP주소는 수신 측 3계층에서 사용된다. 4계층에서는 시퀀스정보와 ACK 번호가 있다.
상위 프로토콜 지시자 정보
⇒ 디캡슐레이션 과정에서 상위 계층의 프로토콜이나 프로세스를 정확히 찾아가기 위한 목적으로 사용된다.
1.
2계층: 이더 타입(ex: 0x0800(IP))
2.
3계층: 프로토콜 번호(ex: 6(TCP))
3.
4계층: 포트 번호(ex: 80(HTTP), 443(HTTPS), 13959, ... )
출발지와 도착지를 구분하지 않아도 되는 2, 3계층과는 다르게 4계층 프로토콜 지시자인 포트번호는 출발지와 목적지를 구분해서 처리해야 한다.
TCP/IP 프로토콜 스택 4계층인 전송 계층은 TCP와 UDP가 담당을 하는데, 2, 3계층과는 다르게 목적지를 찾아가는게 아닌 애플리케이션에서 사용하는 프로세스를 정확히 찾아가야하고 패킷을 잘 쪼개서 보내고 잘 조립하는 것이다.
그리고 패킷을 분할/조립하기 위해 TCP 프로토콜에선느 시퀀스 번호ACK 번호를 사용한다.
참고: Well Known Port
HTTP TCP 80, HTTPS TCP 443, SMTP TCP 25와 같이 잘 알려진 포트를 Well Known 포트라 한다.
이러한 포트는 인터넷 주소 할당기구인 IANA(Internet Assigned Numbers Authority)에 등록되고 1023번 이하의 포트번호를 사용한다.

TCP

TCP는 4계층 프로토콜(TCP, UDP)과 서비스 포트 절에서 다룬 4계층의 특징을 대부분 포함하고 있다.

특징

신뢰할 수 있다.
⇒ 신뢰할 수 없는 공용망에서도 정보유실 없는 통신을 보장하기위해 안전한 세션 연결 및 데이터 분할과 패킷 전송여부를 확인하는 기능이 있다.
패킷에 번호(Sequence Number)를 부여해서 전송 상태를 확인한다.
잘 전송되었는지에 대한 응답(Acknowledge Number)한다.
한번에 어느 크기로 보내야 수신자가 잘 처리할 수 있는지 전송 크기(Window Size)를 고려해 통신한다.
네트워크 상태를 크게 고려하지 않고 쉽고 안전하게 네트워크 사용이 가능하다.

패킷 순서, 응답 번호

시퀀스 번호와 ACK 번호의 기본 동작 방식
분할된 패킷을 잘 분할하고 수신 측이 잘 조합하도록 패킷에 순서와 응답 번호를 분여한다.
시퀀스 번호: 패킷에 순서를 부여하는 것
ACK 번호: 응답 번호를 부여하는 것
두 번호(시퀀스, ACK) 를 이용해 패킷의 순서가 바뀌거나 중간에 손실된 패킷을 파악할 수 있다.
보내는 측에서 패킷에 번호를 부여하면 받는 측은 이 번호의 순서가 맞는지 확인 후 다음 번호의 패킷을 요청한다. 이 숫자를 ACK 번호라 한다.
송신측에서 ACK 번호를 수신받으면 확인 후 다음 패킷에 번호를 부여해 송신한다.
패킷 순서및 ACK 번호의 기본 동작방식을 좀 더 자세히 살펴보면 다음과 같다.
1.
출발지에서 시퀀스 번호를 0으로 보낸다(SEQ=0)
2.
수신측에선 0번 패킷을 잘 받았기에 응답 번호(ACK)에 1을 적어 응답한다. 이때 수신측에서는 자신이 처음 보내는 패킷이기에 자신의 패킷에 시퀀스 번호 0을 보여한다.
3.
송신측은 수신측에서 보낸 ACK번호로 받은 1번 ( 1번 패킷)을 시퀀스 번호로 작성하고 ACK번호는 상대방의 0번 시퀀스를 잘 받았다는 의미로 시퀀스 번호를 1로 부여해 다시 송신한다.

윈도 사이즈와 슬라이딩 윈도

윈도 사이즈: 한 번에 받을 수 있는 데이터의 크기
슬라이딩 윈도: 네트워크 상황에 따라 윈도 사이즈를 조절하는 것
TCP 통신은 신뢰할 수 있다는 장점이 있지만 매번 패킷의 전송 상태를 확인하려는 과정에서 비용소비가 큰 편이다. 매번 작은 패킷을 하나 보내고 응답을 받아야 다음 패킷을 보낼 수 있다면 시간은 더 오래 걸릴수밖에 없다.
그래서 데이터를 보낼 때 패킷을 하나만 보내는게 아닌 많은 패킷을 한 번에 보낸 뒤 하나의 응답을 받을 수 있는데 최대한 많은 패킷을 보내는게 효율적이지만, 네트워크 환경에 따라 패킷이 유실될 때 덩어리가 클 수록 피해가 크기에 적절한 송신양을 결정해야 한다.
여기서 한 번에 데이터를 받을 수 있는 크기를 윈도 사이즈라 하고 네트워크 상황에따라 윈도 사이즈를 조절하는 것을 슬라이딩 윈도라 한다.
TCP 헤더에서 윈도사이즈로 표현할 수 있는 최대 크기는 2162^{16}이다. 이는 64k만큼 윈도사이즈를 가질 수 있다는 의미지만 현대에와서 이 사이즈는 너무 부족하다.
그래서 이를 해결하기 위해 TCP 헤더 사이즈를 늘리지 않고 뒤의 숫자를 무시하는 방법으로 윈도 사이즈를 증가시켜 통신한다. 이런 방식을 사용하면 기존 숫자의 10배, 100배로 윈도 사이즈가 커진다.
만약 TCP에서 패킷 유실이 발생한다면?
윈도 사이즈를 절반으로 낮추고 정상적인 통신이 되는 경우 서서히 원래 사이즈로 늘린다. 그래서 네트워크 경합이 발생해서 패킷 유실이 생기면 작아진 윈도 사이즈로 인해 회선을 제대로 사용하지 못하는 경우가 생길 수 있는데, 이를 해결하기 위해 회선 속도 증가, 버퍼가 큰 네트워크 장비 사용 아니면 TCP 최적화 솔루션을 통해 문제를 해결(혹은 최소화)할 수 있다.

3방향 핸드셰이크

TCP는 데이터 유실없고 순서가 있는 안전한 프로토콜이라고 한다.
그럼 어떻게 이런 안전한 통신이 가능한걸까?
TCP에서는 본격적인 통신을 하기 전 사전 연결작업을 진행한다.
수신자가 아직 데이터를 받을 수 있는 준비가 안되있는데, 일방적으로 데이터를 송신하게 되면 해당 데이터는 처리가 불가능하기에 폐기될 수밖에 없다.
TCP 프로토콜은 이러한 상황을 방지하기 위해 본격적인 통신 전 데이터를 주고받을 준비가 되있는지 미리 확인하는 작업을 거친다. TCP에서는 3번의 패킷을 주고 받으면서 통신을 서로 준비하는데 이를 3방향 핸드셰이크라 부른다.
3방향 핸드셰이크
TCP에서는 이런 3방향 핸드셰이크를 진행 상황에 따라 상태(State)정보를 부르는 이름이 다르다.
LISTEN: 서버에서 서비스를 제공하기 위해 클라이언트 접속을 받아들일 수 있는 상태
SYN-SENT: 클라이언트에서 SYN 패킷을 보내는 상태
SYN-RECEIVE: 클라이언트의 SYN 패킷을 받은 서버의 상태
ESTABLISHED
클라이언트일 경우 : 서버로부터 SYN, ACK 응답반은 상태
서버일 경우: 클라이언트로부터 ACK 응답반은 상태
3방향 핸드셰이크( 위 그림)을 순서대로 살펴보면, 우선 서버는 서비스를 제공하기 위해 클라이언트의 접속을 받아들일 수 있는 LISTEN 상태로 대기한다. 클라이언트에서는 통신을 시도할 때 SYN 패킷을 보내며 이 상태를 SYN-SENT라 하는데 서버에서는 클라이언트의 SYN 패킷을 받으면 SYN-RECEIVE 상태로 변경되고 클라이언트로 SYN, ACK을 응답한다. 클라이언트는 이 응답(SYN, ACK)을 받으면 ESTABLISHED 상태로 변경되고 이에 대한 응답(ACK)을 다시 서버로 보낸다. 서버에서도 이 응답을 받고 ESTABLISHED상태로 변경되며 클라이언트와 서버 양 측이 모두 ESTABLISHED 상태가 되었다는 것은 연결이 성공적으로 완료되었음을 의미한다.
기존 통신과 새로운 통신의 구분
어떤 패킷이 새로운 연결 시도이고 기존 통신에 대한 응답인지 구분하기 위해서 헤더에 플래그(Flag)값을 넣어 통신을 한다. 헤더 정보는 다음과 같으며 6개의 Flag Bit가 통신의 성질을 나타낸다.
UGR
: 긴급 데이터인 경우, 1로 표시해 보낸다.
ACK
: ACK 번호가 유효할 경우 1로 표시해 보낸다. 초기 SYN이 아닌 모든 패킷은 기존 메세지에 대한 응답이기에 ACK 플래그가 1로 표기된다.
PSH
:서버측에서 전송할 데이터가 없거나 데이터를 버퍼링 없이 응용 프로그램으로 즉시 전달 할 것을 지시할 때 사용된다.
RST
:연결 종료 시 1로 표시된다. 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용된다.
SYN
: 연결 시작 용도로 사용한다. 연결이 시작될 때 SYN 플래그에 1로 표시해 보낸다.
FIN
: 연결 종료 시 1로 표시된다. 데이터 전송을 마친 후 정상적으로 양방향 종료 시 사용된다.
3방향 핸드셰이크 과정
1.
통신 최초 시도시 송신자는 플래그에 있는 SYN 필드를 1로 표기하고 시퀀스 번호를 적어 보낸다.
2.
SYN 패킷을 받은 수신자는 SYN, ACK 비트를 플래그에 1로 표기해 응답한다. 수신자가 보내는 첫 패킷이기에 SYN은 1이고 기존 송신자의 응답이기도 하기 때문에 ACK 비트도 함께 1로 표기한다. 이때 ACK 번호는 송신자가 보낸 시퀀스 번호에 1을 추가한 값을 넣어 응답한다. (시퀀스 번호로 10을 받았으니 ACK 번호는 10+ 1인 11을 보내면 된다.)
3.
수신자의 응답(SYN, ACK)을 받은 송신자는 연결을 확립하기 위해 다시 응답을 보낸다. 이때는 기존 메세지의 응답이기에 ACK 필드만 1로 표기된다. 수신자가 시퀀스 번호를 20으로 보냈기 때문에 송신자의 ACK 번호는 20+1인 21이 된다.

UDP

UDP는 TCP와는 다르게 4계층 프로콜이 가져야 할 특징이 거의 없다.
지금까지 소개했던 4계층의 여러 안전 장치 기능들이 UDP에는 없다. 그래서 UDP 헤더도 TCP 헤더와 비교하면 몹시 심플하며 내용이 거의 없다.
UDP 헤더 구조
TCP 헤더에 있던 내용들(시퀀스 번호, ACK 번호, 플래그 윈도 사이즈 등)이 모두 존재 하지 않는다.
이처럼 UDP는 신뢰성을 가지기 위해 필요한 정보가 없는 프로토콜이기에 제한된 용도로만 사용된다.

UDP의 용도

음성 데이터나 실시간 스트리밍
: 실시간성이 보장되야하는 시간에 민감한 프로토콜이나 애플리케이션을 사용하는 경우 UDP 프로토콜이 사용된다.
단방향으로 다수의 단말과 통신하며 응답을 받기 어려운 환경 : EX: 사내 방송, 증권 시세 데이터 전송
즉, 신뢰성보다는 일부 데이터가 유실되더라도 시간에 맞춰서 계속 전송하는것이 중요한 시스템에서 UDP를 사용하게 된다. UDP에서는 일부 데이터가 유실되더라도 그대로 데이터를 처리해버린다.

특징

UDP는 TCP와 다르게 3방향 핸드셰이크처럼 사전에 연결을 확립하는 과정이 없다. 대신 UDP의 첫 데이터는 리소스 확보를 위해 인터럽트(Interrupt)를 거는 용도로 사용되고 유실된다.
UDP 프로토콜을 사용하는 앱 대부분은 이런 상황을 인지하고 동작한다.
연결 확립은 TCP 프로토콜을 이용하고 앱끼리 모든 준비를 마친 후 실제 데이터만 UDP를 이용하는 경우가 대부분이다.

TCP와 UDP의 특징 비교

TCPUDP연결 지향(Connection Oriented)비연결형(Connectionless)오류 제어 수행함오류 제어 수행 안 함흐름 제어 수행함흐름 제어 수행 안 함유니캐스트유니캐스트, 멀티캐스트, 브로드캐스트전이중(Full Duplex)반이중(Half Duplex)데이터 전송실시간 트래픽 전송\begin{array}{|c|c|}\hline \text{TCP}&\text{UDP}\\\hline \text{연결 지향(Connection Oriented)}&\text{비연결형(Connectionless)}\\\hline \text{오류 제어 수행함}&\text{오류 제어 수행 안 함}\\\hline \text{흐름 제어 수행함}&\text{흐름 제어 수행 안 함}\\\hline \text{유니캐스트}&\text{유니캐스트, 멀티캐스트, 브로드캐스트}\\\hline \text{전이중(Full Duplex)}&\text{반이중(Half Duplex)}\\\hline \text{데이터 전송}&\text{실시간 트래픽 전송}\\\hline \end{array}

5. ARP

개요

ARP(Address Resolution Protocol)은 상대방의 MAC 주소를 알아내기 위해 사용되는 프로토콜이다.
이 ARP라는 프로토콜이 어디서 왜 상요되는지 알기 위해선 우선 OSI 7 계층 중 2, 3계층에 대해서 알 필요가 있다.
2, 3계층은 각각 주소를 가지고 있어서 통신할 때 목적지를 찾아 갈 수 있게 해준다.
여기서 2계층의 MAC주소는 하드웨어 생산업체에서 임의적으로 할당한 주소이다. 그러기에 하드웨어인 NIC(Network Interface Card)에 종속되있다. 그리고 3계층 IP주소는 우리가 직접 할당하거나 DHCP를 이용해 자동으로 할당받는데 실제 통신에서는 IP주소 기반으로 통신을 하게된다.
MAC주소는 상대방의 주소를 자동으로 알아내 통신하게 되는데 이 때 상대방의 MAC 주소를 자동으로 알아내기 위해 사용되는 프로토콜이 바로 ARP

그럼 이 ARP란 어떻게 생겼을까?

ARP 프로토콜 필드(ARP 헤더 + ARP 데이터)
위 표는 ARP 프로토콜 포맷이다. 보시다시피 2계층과 3계층 정보가 모두 포함되어있는데, 아까도 말했지만 IP 주소 체계와 MAC 주소 체계는 연관성이 없다. 그렇기 때문에 이 두 개의 주소 체계를 연계시켜주기 위한 메커니즘이 ARP이고 그렇기에 위 표와 같이 ARP 프로토콜 필드에는 2계층과 3계층 정보를 같이 포함하는 것이다.
최초로 통신을 시도할 때는 패킷을 바로 캡슐화(Encapsulation)할 수 없다.
어째서일까? 그 이유는 호스트에서 출발지와 목적지 IP주소는 미리 파악이 가능하지만 상대방의 MAC주소를 알 수 없기 때문인데, 상대방의 MAC 주소를 알아내기 위해서는 ARP 브로드캐스트 를 이용해서 네트워크 전체에 상대방의 MAC 주소를 물어봐서 알아내야 한다.
ARP 브로드캐스트를 받은 목적지는 ARP 프로토콜로 자신의 MAC 주소를 응답하는데, 이 작업이 완료되면 이제 부족했던 정보인 목적지의 MAC 주소도 알아냈기에 패킷은 정상적으로 인캡슐레이션되어 상대방에게 전달 될 수 있다.

목적지 MAC 주소를 매번 ARP 브로드캐스트를 통해 알아내야 할까?

최초 통신시 목적지IP를 알아도 목적지 MAC주소를 모르기에 ARP 브로드캐스트를 이용해서 네트워크 전체에 물어봐야한다고 했는데, 이렇게 매 번 물어보는 것은 비용낭비가 있다.
그래서 IP주소와 MAC 주소를 1:1로 대응하여 테이블로 저장해두는데 이를 ARP Table이라 한다.
다음은 윈도우 명령 프롬프트(CMD)에 arp -a 라는 명령을 입력한 경우인데 자신의 컴퓨터의 ARP Table이 나오는것을 확인할 수 있다.
ARP Table
성능을 위해서는 ARP 테이블이 한 번 생성되면 오래 유지될수록 좋다.
논리 주소는 언제든지 바뀔 수 있기 때문에 일정 시간 이상 통신이 없으면 이 테이블은 삭제된다.
네트워크 장비에서 ARP 작업은 CPU에서 직접수행하기에 짧은 시간에 많은 ARP요청이 들어오면 네트워크 장비에는 큰 부하가 걸린다. 이를 해결하기 위해 다음과 같은 방법들을 사용한다.
⇒ ARP 테이블 저장 기간을 일반 PC보다 길게 설정
⇒ 많은 ARP 요청이 들어오면 필터링하거나 천천히 처리한다.
⇒ ARP 테이블을 수동으로만 갱신하도록 설정해 운영한다.
이외에도 DNS캐시나 라우팅 캐시와 같이 다양한 계층에서 네트워크의 성능을 높이기 위한 캐시 테이블을 가지고 있다.

ARP 동작

ARP 프로토콜 필드는 여러가지가 있는데, 이 중에서도 중요한 필드는 다음과 같다.
송신자 하드웨어 MAC 주소
송신자 IP 프로토콜 주소
대상자 MAC 주소
대상자 IP 프로토콜 주소
이러한 4가지 필드를 이용해 ARP가 어떻게 동작하는지 예제를 통해 알아보자.
1.
서버 A → 서버 B로 최초 통신 시도
⇒ 목적지 MAC 주소를 모르기에 패킷을 완성할 수 없다.
⇒ 서버 A는 서버 B의 MAC 주소(1.1.1.2 IP의 MAC 주소)를 알아내기 위해 ARP 요청을 브로드캐스트 해야 한다.
2.
서버 A → 서버 B로 ARP 브로드 캐스트
⇒ 2계층 MAC 주소는 출발지를 자신의 MAC으로, 도착지는 브로드캐스트(FF-FF-FF-FF-FF-FF)
⇒ ARP 프로토콜 필드의 전송자 MAC과 IP 주소에는 자신의 주소로 채운다.
⇒ 대상자 IP 주소는 1.1.1.2로 대상자 MAC 주소는 00-00-00-00-00-00으로 채워 보낸다.
3.
브로드캐스트를 받은 서버에서는 IP 비교후 자신의 MAC 주소 반환
2-Step 에서 브로드캐스트로 전송했기에 ARP 패킷은 같은 네트워크내의 모든 단말에 보내졌다. 모든 단말은 각자 ARP 프로토콜을 확인한 뒤 대상자 IP가 자신의 IP와 비교해서 일치하지 않으면 폐기한다. 만약 일치한다면 받은 ARP 프로토콜 필드를 통해 목적지 정보(IP, MAC)도 알 수 있기 때문에 이를 이요해 ARP 프로토콜을 보내는데 모든 값이 채워져 있기 때문에 유니캐스트로 전송된다.
4.
ARP 캐시 테이블 갱신 및 서버 A → 서버 B 패킷 송신
⇒ 서버 A는 서버 B로부터 ARP 응답을 받아 자신의 ARP 캐시 테이블을 갱신한다.
→ 이 ARP 캐시 테이블은 정해진 시간동안 서버 B와 통신이 없을때까지 유지되며 시간 내에 통신이 다시 이뤄지면 시간은 다시 초기화된다.
⇒ ARP 캐시 테이블 갱신 후에는 상대방의 MAC 주소를 알고 있으니 도착지 MAC 주소 필드도 완성해서 인캡슐레이션해서 정상적으로 패킷을 보낼 수 있다.

GARP (Gratuious ARP)

ARP 프로토콜 필드를 그대로 사용하지만 내용을 변경해 다른 목적과 용도로 사용하는 프로토콜
대상자 IP 필드에 자신의 IP 주소를 채워서 ARP 요청을 보낸다.
자신의 IP와 MAC 주소를 알릴 목적으로 사용된다.
로컬 네트워크에 자신의 주소 정보를 알릴 목적이기에 목적지 MAC주소는 브로드캐스트 MAC 주소를 사용한다.
GARP를 사용해 동일 네트워크에 자신의 주소 정보를 알리는 이유는 다음과 같다.
1.
IP 주소 충돌 감지
: 내가 할당 받은 IP를 다른 사람이 사용하고 있을 수 있는데, 이를 확인해서 충돌을 예방하기위해 사용한다.
2.
상대방(동일 서브넷 상의 다른)의 ARP 테이블 갱신
: 위 두 대의 데이터베이스 서버가 하나의 가상 IP주소로 서비스가 된다고 할 때 한 대만 동작하고 한 대는 액티브-스탠바이(Active-Standby)로 동작한다. 평시에 좌측처럼 마스터 장비가 좌측 데이터베이스 서버에서 동작을 하다가 DB-A가 동작을 멈추면 DB-B 장비가 액티브로 동작해서 1.1IP 주소에 대한 ARP 요청에 응답한다.
그리고 여기서 DB-B에서 GARP 패킷을 네트워크에 보내 액티브 장비가 변경되었음을 알려줌으로써 이후 로컬 네트워크의 단말들이 ARP 테이블에는 1.1번은 BB-BB-BB MAC주소로 갱신되어 통신된다.
3.
HA(고가용성) 용도의 클러스터링, VRRP, HSRP
: 실제 MAC 주소를 사용하지 않고 가상 MAC을 사용하는 클러스터링이나 VRRP, HSRP와 같은 FHRP(First Hop Redundancy Protocol)에서도 GARP가 사용된다. 주로 네트워크에 있는 스위치 장비의 MAC 테이블 갱신이 목적이다.
클러스터링 중간에 있는 스위치의 MAC 테이블은 마스터가 변경되었을 때 가상 MAC 주소의 위치를 적절히 찾아가도록 업데이트 해야 하기에 마스터가 변경되는 시점에 MAC 테이블 갱신이 필요하다.
그래서 슬레이브가 마스터로 역할이 변경되면 GARP를 전송하고 GARP를 통해 MAC주소에 대한 포트정보를 새로 변경해 MAC 테이블을 갱신한다.
가상 MAC 주소를 사용하는 클러스터링, FHRP 솔루션 동작 방식

참고: VRRP, HSRP

VRRP(Virtual Router Redundancy Protocol), HSRP(Hot Standby Router Protocol)는 FHRP의 일종이다.
디폴트 게이트웨이에 장애 발생시 해당 네트워크에 속한 단말이 외부 네트워크로 통신할 수 없는 문제를 해결하기 위해 개발되었다.
PC는 디폴트 게이트웨이의 상태를 알 수 없기에 두 대의 디폴트 게이트웨이 라우터가 한 대처럼 동작하며 한 대에 문제가 생기더라도 다른 한 대에서 서비스를 지속할 수 있도록 FHRP를 사용해야 한다.

RARP(Reverse ARP)

말 그대로 반대로 동작하는 ARP이다.
필드에 들어가는 내용이 다르고 원래 목적과 반대로 사용한다.
IP주소가 정해져 있지 않은 단말이 IP할당을 요청할 때 사용한다.
현재 제한된 기능으로 인해 BOOTP와 DHCP로 대체되어 사용되지 않는다.

6. 서브넷과 게이트웨이

원격지 네트워크와의 통신에 사용하는 장비를 게이트웨이라 부른다.

게이트웨이가 뭐야?

원격 네트워크 통신에서 네트워크를 넘어 전달되지 못하는 브로드캐스트의 성질때문에 장비의 도움이 필요하며 이 장비를 게이트웨이(Gateway)라 한다.
게이트웨이에 대한 정보를 PC나 네트워크 장비에 설정하는 항목이 기본 게이트웨이 이다.

용도

ARP 브로드 캐스트는 원격지 네트워크로 보낼 수 없다.
기본 게이트웨이는 3계층 장비가 수행하며 여러 네트워크와 연결되어 적절한 경로를 지정해주는 역할을 한다.
출발지와 목적지 네트워크가 동일한 LAN 내에서 통신하는 것인지 다른 네트워크 간의 통신인지에 따라 통신 방식이 달라지기에 먼저 목적지의 범위를 서브넷 마스크를 이용해 확인해야 한다.
⇒ 서브넷 마스크와 자신의 IP를 주소를 AND 연산해 나오는 값이 네트워크 주소를 확인할 수 있다.
원격지 통신은 ARP 가 라우터를 넘어가지 못하는 브로드캐스트이기에 게이트웨이라는 장비를 사용해야 한다.

2계층 통신 VS 3계층 통신

3계층 통신: 원격지 네트워크 통신
:원격지 네트워크와 통신해야 할 경우 라우터와 같은 3계층 장비의 도움이 필요하기 때문에 해당 패킷을 전송하는 네트워크 장비에서 3계층 정보까지 확인해야 하며 이를 3L 통신이라 부른다.
도착지 MAC주소와 IP주소가 다르다. 도착지 IP주소는 실제 도착지이고 도착지 MAC 주소는 디폴트 게이트웨이의 MAC 주소가 사용된다.
2계층 통신: 로컬 네트워크 통신
: 로컬 네트워크에서 직접 통신할 경우 라우터와 같은 3계층 장비없이도 통신이 가능하다. 그래서 2계층까지만 정보를 확인 후 ARP 요청을 보낼 때 직접 브로드캐스트를 이용하기에 이를 L2 통신이라 부른다.

다음 챕터로

이전 챕터로