CS - Network

Published
Last updated
Last updated October 25, 2024
 

7 Layers

TCP

IPv4

Address

  • IPv4 주소는 32bit로 2^32 = 42억개 정도 존재
  • 표현법
    • Binary: 10000000 00000001 00000000 00000001
    • Dotted decimal: 128.1.0.1

Classful addressing

  • class A: 시작주소가 0, 범위: 0.0.0.0 ~ 127.255.255.255
  • class B: 시작주소가 10, 범위: 128.0.0.0 ~ 191.255.255.255
  • class C: 시작주소가 110, 범위: 192.0.0.0 ~ 223.255.255.255
  • class D: 시작주소가 1110, 범위: 224.0.0.0 ~ 239.255.255.255
  • class E: 시작주소가 1111, 범위: 240.0.0.0 ~ 255.255.255.255
 
notion image
  • Netid and hostid
    • 한 네트워크에서 하나의 netid를 공유하고, 내부에서 hostid를 분배하는 방식
    • 네트워크를 담당하는 라우터로 외부에서 찾아갈 때 netid만 보고 찾아가면 된다
 
  • Network mask: mask와 주소를 AND 하면 net id만이 남는다
    • Mask for class A: 1111 1111 0000 0000 0000 0000 0000 0000: 255.0.0.0
    • Mask for class B: 1111 1111 1111 1111 0000 0000 0000 0000: 255.255.0.0
    • Mask for class C: 1111 1111 1111 1111 1111 1111 0000 0000: 255.255.255.0
 
  • Subnet
    • Class B 기준으로도 hostid 65536개를 스위치가 분배하거나, ARP packet broadcast시 65536개를 보내기는 부담스럽다
    • 그렇기에 네트워크 안의 네트워크를 두는 것, 보안과 성능에서의 이점이 있다
notion image
notion image
  • Supernet
    • Subnet의 반대 느낌으로, 10만개의 ip가 필요할 때 B class를 사용하는 것 보다, C class 2개를 합쳐서 사용하는 것
    • 연속적인 대역의 IP를 엮어야 한다
 
  • Classful network의 단점
    • 보완책을 사용하더라도 IP대역별로의 크기가 너무 크다

Classless addressing

  • Prefix and suffix
    • iPv4 주소 32비트중 prefix가 n bits면 suffix는 32-n bits
    • n이 크면 prefix가 커지고, suffix가 작아져, 블록 크기가 작아진다
  • Slash notation: prefix length를 표기
    • 예시: 0.0.0.0/16
  • Mask: prefix length만큼을 1로 체워 mask를 생성
    • 12.34.56.78/9의 mask → 255.128.0.0

Special addresses

  • Loopback(127.x.y.z): 자기 자신을 가리키는 주소, 네트워크 구성시 사용
  • All-zero(0.0.0.0): DHCP에 요청할 때 source에 넣는 주소, 즉 IP 미부여 상태
  • Limited broadcast(255.255.255.255): 현재 네트워크에서 broadcast. router에서 외부로 나가는건 막는다
  • Directed broadcast(x.y.z.255): 외부에서 한 네트워크에 있는 모든 디바이스로 보낼 때 사용
  • Addresses for private networks(사설망 주소)
    • 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 169.254.0.0/16

NAT

notion image

Datagram

notion image
  • VER(4b): 버전
    • 예시: IPv4(?), IPv6(?)
  • HLEN(4b): 헤더의 길이
    • 4비트로 16까지 표현가능한데 20~60을 표현해야 하니 *4를 해 0~64를 표현하게 만든다
  • Service Type(8b): 우선순위, codepoint등의 정보. 앞의 6bits만 사용
    • Totel Length(16b): 헤더와 데이터를 포함한 datagram의 전체 길이
      • 16비트로 최대 65535바이트까지 표현 가능
    💡
    1바이트 데이터를 보낼때 IP헤더 40 + TCP헤더 40 으로 총 41bits의 패킷이 만들어지는데, 프레임을 만들기 위해 body는 최소 46바이트보다 커야한다. 이때 5바이트의 패딩이 붙는데, 패딩이 있음을 인지하고 버려주기 위해 헤더의 total length에 41바이트임을 써줘야 한다
     
    • Identification(16b): 패킷 번호
    • Flags(3b): 패킷의 분할 관련한 정보. 뒤의 2비트만 사용한다
      • 2번 비트(D): 해당 패킷은 분할하지 말라는 뜻
      • 3번 비트(M): 해당 패킷 뒤에 분할된 패킷이 더 있다는 뜻. 0이 나올때까지 받은후 합친다
    • Fragmentation offset(13b): fragmentation 시작 바이트
      • *8을 적용 → 최대 2^16표현 가능
     
    • Time to Live(8b): 남은 hop count
      • 라우터를 거칠 때 마다 -1이 되어 0이 되면 소멸시킨다
    • Protocol(8b): ICMP(1), IGMP(2), TCP(6), UDP(17), OSPF(89)등의 프로토콜 번호
      • ICMP, IGMP, OSPF는 같은 네트워크 레이어의 프로토콜이지만 IP header를 포함해서 전송된다
    • Header Checksum(16b): 헤더만의 체크섬
     
    • Source IP Address(32b): 32bit IPv4 주소
    • Destination IP Address(32b): 32bit IPv4 주소

    Fragmentation

    • MTU: 네트워크 전송시의 frame 최대 길이. Physical network마다 허용 가능 크기가 다르다

    Options

    • Type: 옵션 번호
      • Copy(1b): 패킷이 분할될 때 옵션을 복사할 것인지
        • 0: first fragment만 복사
        • 1: 모든 fragment에 복사
      • Class(2b): 옵션의 종류에 따른 클래스
        • 00: datagram class
        • 10: Debugging and management
      • Number(5b):
    • Length(1B): 옵션의 길이
    • Value: 옵션에서 저장할 데이터가 있을 경우 사용
     
    • Single byte option
      • No operation option(0000_0000): 옵션 앞이나 뒤에 붙어 줄맞춤
      • End-of-option option(0000_0001): option의 마지막에 쓰여 종료를 나타냄
    • Multiple byte option
      • Record-route option(0000_0111): 거쳐온 라우터들의 주소를 알 수 있는 옵션
        • notion image
        • Length에는 3 + 4*n이 들어간다
        • Pointer는 처음에 1로 시작해서 보내고, 라우터가 수신받으면 포인터가 가리키는곳에 자신의 주소를 적고 포인터를 증가시켜서 보낸다
        • 아래의 IP목록에는 수신받은 라우터가 자신의 주소(나가는 방향의 IP)를 적어준다
      • Strict-source-route option(1000_1001): 거쳐갈 라우터를 미리 정해줄 수 있는 옵션
        • notion image
      • Loose-source-route option(1000_0011): Strict-source-route option과 비슷하지만 flexible해서 순서가 바뀌거나 중간에 다른곳을 거쳐와도 된다
      • Time-stamp option(0100_0100): 거쳐온 라우터들의 시간을 적어준다
        • notion image

    IP Package

    notion image
    • Reassembly module
      • 패킷 재조합은 마지막 도착해서 진행한다
      • ID별로 linked list로 저장
      • Packet lost시 복구가 힘듦 → 무조건 크게 보내는 것이 만사가 아님
    • Processing module: TTL 하나 빼고 0일시 버린다
    • Fragmentation module

    Delivery and Forwarding

    • Delivery:

    Forwarding

    • Forwarding: routing table을 보고 next hop으로 packet을 전달하는 것
    • Forwarding based on destination address - packet forwarding techniques
      • Next-hop method: routing table에 목적지까지 가는 모든 주소를 적어두는 것이 아닌, 목적지로 가는 next hop만 적어두는 것. 모두 최단으로 보낸다는 가정하에 최단 경로로 갈 수 있다
      • Network-specific method: 목적지가 아닌 목적지가 포함된 네트워크를 destination으로 저장하는 것. 이때 목적지 네트워크로 가는 next hop만 기록하면 된다
      • Host-specific method: 모든 목적지가 network-specific으로 저장되는 것은 아니고, 일반 주소를 적어줄 수도 있다
      • Default routing: 나가는 경로가 몇 개 없을 때 일부 예외만 적어주고 나머지는 모두 default router로 가게 적어줄 수 있다
    • Forwarding module
      • Simplified forwarding module in classful address without subnetting
        • Class별로 routing table이 존재
        • Routing table entry: Network address | Next-hop address | Interface
        • 패킷을 받으면 주소로 class 파악 & net id 파악 → 해당 class중 net id 같은 것 탐색 → 없으면 default router로 보내기
      • Simplified forwarding module in classful address with subnetting
        • Subnet mask를 통해 어떤 서브넷에 속하는지 파악
      • Simplified forwarding module in classless address
        • Routing table entry: Mask(/n) | Network address | Next-hop address | Interface
        • Class가 없으니 routing table 하나로 관리한다
      • Address aggregation: 다른 네트워크라도, 네트워크들로 가는 경로가 같은 라우터로 같다면, 해당 네트워크들을 묶어서 기록 가능하다
      • Longest mask matching: 모순되는 규칙이 있으면 longest mask를 먼저 따르기. 즉 세부적인 규칙을 가장 먼저 따르기
        • 4개를 묶을때 하나만 예외가 있다면, 4개를 분리하는것보다 일단 묶고 하나를 예외처리하는것이 이득이니

    MPLS(Multiprotocol label switching)

    notion image
    • MPLS: IP주소가 아닌 레이블을 이용하여 패킷을 라우팅하는 방식
    • MPLS header: MAC주소 헤더와 IP주소 헤더 사이에 위치
      • 네트워크 계층(3)과 데이터 링크 계층(2) 사이의 2.5에서 작동?
    • Classful에서는 한번에 목적지를 찾지만 classless에서는 라우팅 테이블 탐색에 시간이 걸린다
    • MPLS forwarding table
      • 주변 라우터에게 ~로 가려면 자신에게 out label에 적힌 값을 알려주라고 알려준다
      • out label값을 바탕으로 바로 out interface를 찾는 방식
      • R4에서 A로 가는 예시처럼 같은 목적지에 대해 차선책 존재 가능

    ARP(Address Resolution Protocol)

    • ARP는 IP 주소(logical 주소)에서 MAC 주소(physical 주소)를 얻는(address mapping) 프로토콜이다
    notion image
    • 한 네트워크 안에서 IP 주소만을 알 때, MAC 주소를 얻기 위해 broadcast를 보낸다
    • ~

    ARP Packet

    notion image
    • Hardware Type(2B): 하드웨어의 유형을 지정. 이더넷의 경우 값은 1
    • Protocol Type(2B): 프로토콜의 유형을 지정. IPv4의 경우 값은 0x0800
    • Hardware Address Length(1B): 하드웨어 주소의 길이를 지정. 이더넷 MAC 주소의 경우 6
    • Protocol Address Length(1B): 프로토콜 주소의 길이를 지정. IPv4 주소의 경우 4
    • Operation Code(2B): ARP 요청(1) 또는 ARP 응답(2)을 지정
      • 1
      • 2
      • 3
      • 4
    • Sender Hardware Address(6B): 송신자의 MAC 주소
    • Sender Protocol Address(4B): 송신자의 IP 주소
    • Target Hardware Address(6B): 목표의 MAC 주소. ARP 요청의 경우 모르니 0
    • Target Protocol Address(4B): 목표의 IP 주소

    ARP request

    notion image

    ARP Components

    notion image
    • Cache table: IP - MAC 맵핑을 저장하는 테이블
      • State: FREE, PENDING, RESOLVED
      • Queue: 큐 번호, 포인터?
      • Attempt: 시도 횟수. ex) 5가 넘으면 FREE
      • Time-Out: 마지막 사용 시간. ex) 900으로 시작해 0이되면 FREE
      • Protocol Address: IP 주소
      • Hardware Address: MAC 주소
     
    • Output module
      • 패킷을 전송
        • table에 존재, RESOLVED →보내기
        • table에 존재, PENDING → 큐에 패킷넣고, ARP response 기다리기
        • table에 미존재 → 테이블에 추가하고 PENDING, ATTEMPTS = 1, 패킷을 큐에 삽입, ARP request 전송
    • Input module
      • ARP 패킷이 올때 까지 대기
        • table에 존재, RESOLVED → lifetime 업데이트
        • table에 존재, PENDING → 큐 비우고 보내주기
        • table에 미존재 → table에 추가
      • 그리고 packet이 request면 추가적으로 ARP reply 해주기
    • Cache-control module
      • 타이머 순환 기다리고, 시간되면 테이블 업데이트
        • FREE → 패스
        • PENDING →
          • attempts가 maximum이상이면 FREE로 바꾸기, 큐 제거
          • maximum 아래면 다시 ARP request 보내기
        • RESOLVED → time-out 60 감소
          • time-out이 0이하면 FREE로 변경, 큐 삭제

    ICMPv4

    인터넷은 중앙통제 방식이 아니기에, 패킷이 사라지면 어디 망에서 사라졌는지 알 수 없다. 이를 보완하기 위해 나온 것이 ICMP이다.
    네트워크를 가다 오류가 발생하면 오류 상황을 source에게 보내준다.
    notion image
    • ICMP encapsulation
      • ICMP datagram? frame data의 구조
      • IP header
      • ICMP message
        • ICMP header
        • 기존 datagram의 IP header
        • TCP header 상위 8바이트(src port(2), dest port(2), sequence number(4))

    Messages

    notion image
    notion image

    Error-reporting messages

    notion image
    • Destination-unreachable format
      • Code 0:
      • Code 1:
      • Code 2
      • Code 3
     
    notion image
    • Source-quench format
     
    notion image
    • Time-exceeded message format
     
    notion image
    • Parameter-problem message format
     

    Query messages

    notion image
    • Redirection message format
     
     
    notion image
    • Echo-request and echo-reply message
     
     
    notion image
    • Timestamp-request and timestamp-reply message format

    Unicast Routing Protocol

    • AS(Autonomous System): 네트워크가 묶이는 단위
    • Interdomain: AS 내부에서의 경로 설정
      • 최단경로로 경로를 설정
      • Distance vector routing(RIP), Link state routing(OSPF)
    • Intradomain: AS끼리의 라우팅
      • 비용, 보안장비에 따른 속도저하, 혼잡등을 고려해서 경로 설정
      • Path vector routing(BGP)

    Distance Vector Routing(RIP)

    • 벨만-포드 알고리즘을 이용해 최단거리를 알아낸다
    notion image
    • 최초에는 자기 자신과 주변 direct 연결상태만 가지고 시작
    • 경로를 계속 서로 공유하며 더 좋은 경로를 전달받으면 업데이트
    notion image
    • 전달받은 테이블을 바탕으로 기존 테이블과, 해당 테이블을 가진 노드까지의 거리 + 해당 테이블 값을 비교해 작은값으로 업데이트
    • 이때 가는 정보가 없으면 무한대로 적혀있지만, 실제로는 존재한다는 것을 알지도 못한다
    • Cost가 커지는 경우에는 수정해서 이웃에 전달해도 최소값이 아니니 무시되는 문제가 있음
    • 그래서 받는 입장에서 next table에서 오는 정보들은 더 큰값이여도 최신으로 업데이트
     
    notion image
    • Two-node instability
      • 주기적으로 라우팅 정보를 주고 받는데, 일정 시간동안 응답이 없어도 끊어버림(무한대)
      • 위의 상황에서 X로의 연결이 끊겨 A는 무한대로 설정이 되었는데, 이를 B에 알려주기 전에 B가 먼저 A에 전파한 경우 문제가 된다
      • 여기서 루프가 발생하는데, 특정 숫자(16) 이상은 무한대로 간주하면 된다
      • Split horizon: B가 A로는 다시 안보내면 된다, 그러나 다시 안보내주는 이유가 의도된것지 오류인지 A입장에서는 모름
      • Split horizon & poison recurse: 보내는 주지만, 무한대로 보내주기
    • Three-node instability
      • 해당 상황에서는 split horizon & poison recurse도 의미가 없다
      • 네트워크 장비에서 loop detect로 최대한 막지만 이것도 100%는 아님

    Link State Routing(OSPF)

    • 모든 정보를 받아 Dijkstra 등으로 합치는 방법
    • Distance vector와의 차이점
      • Neighbor에게만 보내지 않고, 네트워크의 모두에게 보낸다
      • 모두에게 정확한 정보를 보낸다
    • 계산 과정
    notion image
    • Confirmed list: 최적 경로로 확정
    • Tentative list: 고려 해볼 경로들

    HTTP