7 LayersTCPIPv4AddressClassful addressingClassless addressingSpecial addressesNATDatagramFragmentationOptionsIP PackageDelivery and ForwardingForwardingMPLS(Multiprotocol label switching)ARP(Address Resolution Protocol)ARP PacketARP requestARP ComponentsICMPv4MessagesError-reporting messagesQuery messagesUnicast Routing ProtocolDistance Vector Routing(RIP)Link State Routing(OSPF)HTTP
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
- 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개를 보내기는 부담스럽다
- 그렇기에 네트워크 안의 네트워크를 두는 것, 보안과 성능에서의 이점이 있다
- 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
Datagram
- 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): 거쳐온 라우터들의 주소를 알 수 있는 옵션
- Length에는 3 + 4*n이 들어간다
- Pointer는 처음에 1로 시작해서 보내고, 라우터가 수신받으면 포인터가 가리키는곳에 자신의 주소를 적고 포인터를 증가시켜서 보낸다
- 아래의 IP목록에는 수신받은 라우터가 자신의 주소(나가는 방향의 IP)를 적어준다
- Strict-source-route option(1000_1001): 거쳐갈 라우터를 미리 정해줄 수 있는 옵션
- Loose-source-route option(1000_0011): Strict-source-route option과 비슷하지만 flexible해서 순서가 바뀌거나 중간에 다른곳을 거쳐와도 된다
- Time-stamp option(0100_0100): 거쳐온 라우터들의 시간을 적어준다
IP Package
- 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)
- 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) 프로토콜이다
- 한 네트워크 안에서 IP 주소만을 알 때, MAC 주소를 얻기 위해 broadcast를 보낸다
- ~
ARP Packet
- 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
ARP Components
- 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에게 보내준다.
- 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
Error-reporting messages
- Destination-unreachable format
- Code 0:
- Code 1:
- Code 2
- Code 3
- Source-quench format
- Time-exceeded message format
- Parameter-problem message format
Query messages
- Redirection message format
- Echo-request and echo-reply message
- 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)
- 벨만-포드 알고리즘을 이용해 최단거리를 알아낸다
- 최초에는 자기 자신과 주변 direct 연결상태만 가지고 시작
- 경로를 계속 서로 공유하며 더 좋은 경로를 전달받으면 업데이트
- 전달받은 테이블을 바탕으로 기존 테이블과, 해당 테이블을 가진 노드까지의 거리 + 해당 테이블 값을 비교해 작은값으로 업데이트
- 이때 가는 정보가 없으면 무한대로 적혀있지만, 실제로는 존재한다는 것을 알지도 못한다
- Cost가 커지는 경우에는 수정해서 이웃에 전달해도 최소값이 아니니 무시되는 문제가 있음
- 그래서 받는 입장에서 next table에서 오는 정보들은 더 큰값이여도 최신으로 업데이트
- 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에게만 보내지 않고, 네트워크의 모두에게 보낸다
- 모두에게 정확한 정보를 보낸다
- 계산 과정
- Confirmed list: 최적 경로로 확정
- Tentative list: 고려 해볼 경로들