본문 바로가기
학교 수업/컴퓨터 네트워크

Network layer :: 3-2. IP address, IPv4, fragment

by Godgil 2020. 6. 17.

자, CIDR, DHCP를 하면서 IP주소의 형태를 배웠고, 어떻게 할당되는지도 배웠어.

 

그럼 이 IP주소는 어떻게 생겼을까?에 대한걸 하려고 해.

 

IP의 버전이 두개가 있는데 하나는 IPv4, IPv6가 있어

IPv4의 주소 부족 문제를 해결하기 위해서 나온게 IPv6거든 일단 이정도로만 알아두고

 

지금은 IPv4를 배워볼거야.

우리가 평상시 사용하는 198.21.2.2같은  주소형식, 이게 바로 IPv4야.

 

IP는 Internet Protocol이야. 그러니까 인터넷을 이해하려면 꼭 알아야 한다는거지.

 

네트워크 레이어의 역할이 뭘까? 

바로 transport layer에서 만든 segment들을 source(출발지)에서 destination(목적지)까지 배달을 책임지는 역할을 해 줘 배달의민족 같은거지.

 

목적지까지 잘 가야하니까 경로를 설정하는 알고리즘들이 네트워크 레이어에 있는거야.

그러면 어떤 정보들이 필요할까?

 

그걸 알아보기 위해서 IP datagram의 형식을 살펴볼거야.

트랜스포트 레이어에서 온 세그먼트를 네트워크 레이어에서 처리하면 데이터그램이 되는거라고 했었어.

 

1. ver, 버전: 이 패킷이 어떤 프로토콜 버전인가에 해당하는 정보야. 맨 앞에 오는 이유는 단순히 버전이 되게 중요하기 떄문인거지. 이 버전 정보가 뒤에 따라 오는 정보들을 해석하는 기준이 될테니까.

 

2. head.len, 헤더 길이 : 헤더의 길이인데, IP 데이터그램은 기본적으로 20바이트야. 근데 이걸 왜 명시 해 놓냐면, 밑에 나오겠지만 IP 데이터그램에는 옵션이있어, 개발자들이 필요에 따라 정의하는 옵션이 있어서 헤더의 길이가 몇 바이튼지 명시 해줘야해. 하지만 아무옵션이 없는 기본 IP 헤더는 20바이트다. 라는거

 

3. type of service, 서비스의 타입 : 이건 말 그대로 네트워크 레이어의 서비스야. 그냥 가지고 가는 segment가 얼마나 중요한 정보인지 마킹하는 역할이야.

 

4. length전체에 대한 길이 : 말 그대로지? 헤더와 세그먼트들 전체를 포함한 길이야.(크기)

 

5. 16-bit identifier, 16비트 식별자 : 흔히 얘기하는 ID야 그냥. 보통 어떤 flow가 흘러올 때, 동일하게 날아오는건지 아닌지 표현해 주는거지

 

6. flag : flow에 대해서 플래그 비트를 세운거야

 

7. fragment offset : IP datagram도 크기가 너무 커지게 되면 한번에 못 전송할 수도 있거든, 그걸 대비해서 쪼갤 수 있는데, 그 때 사용해

 

8. Time to live : 네트워크에서 데이터그램이 살아 있을 수 있는 시간이야. 라우터를 지날 때 마다 1씩 감소하고 0이되면 바로 없어져, 왜 있냐면 라우터들이 막 알고리즘이 잘못되어서 계속 루트를 반복할 수도 있거든, 그러면 패킷이 계속 남아있으면 안된단말이지. 그래서 필요해

 

9. upper layer : 데이터가 어느 형식인지. TCP인지 UDP인지 정보를 주는거야

 

10 checksum : 데이터가 깨졌나 안깨졌나에 대한 부분인데, 특징은 헤더부분에서만 적용을 해. 헤더부분이 손상되었는지 아닌지를 판단하는거야

 

11. option : 옵션에는 뭐 타임스태프가 있을 수도 있고, 지나온 루트를 기록할 수도 있고 그런가야.

 

12. 32비트의 출발지 IP주소

13. 32비트의 목적지 IP주소

14. 보내려는 패킷(데이터) 

 

 

 

이런식으로 구성되어있어.

자 그래서, 옵션이 없다면 이게 패킷에 붙어서 20바이트가 추가 될거야.

근데 TCP세그먼트를 전송한다면? TCP에도 헤더가 붙었단말이지.

원래 데이터를 TCP헤더를 붙이고 IP를 통해 보내면

원본 데이터에 + 40바이트가 되는거야 ( TCP 20 , IP 20)

 

 

 

자, 여기서 중요한 기능이 뭐냐면, fragment야. 쪼개는거라고 그랬지?

이게 뭐냐면

 

인터넷은 network of network야. 막 여러 네트워크들이 그물형태로 연결되어 있는거니까.

 

근데, 이렇게 막 다른 네트워크들이 연결되어 있는건데, 이 네트워크들은 각각 MTU가 달라.

MTU는, 한번에 전송할 수 있는 최대 크기를 말해. 

 

그러니까, 이렇게 상이한 네트워크들에도 데이터를 잘 전달 할 수 있게끔 하겠다 하는게 IP의 목표거든.

 

이런 의미에서 만들어진게 fragmentation과 reassembly야. 간단히 말해서, 쪼개고 재조합하겠다는거지.

 

그림으로 보면 좀 더 이해가 쉬울거야.

 

자 그럼 만약에, 4000byte의 데이터를 보내려 해, 근데 MTU가 1500byte야.

이런 상황에서 fragmentation을 하는거야.

 

"아아, 그러면 1500짜리 두개, 1000짜리 하나, 이렇게 3부분으로 나눠서 보내겠구나?"

라고 생각 할 수 있어.

위의 문장에서 수치상으로 딱 한 부분이 틀렸어. 어디가 틀렸을까?

 

맞아, 바로 1000짜리가 틀렸어.

왜냐면, MTU는 링크레이어에서의 개념이거든

이말인 즉슨, MTU는 IP헤더의 크기까지 포함한다는 말이야.

 

그러니까 쪼갠 데이터에도 각각 IP헤더를 달아줘야해.

그래서 위의 그림에 보면 3개로 나눠졌을때, 파란색 IP헤더가 각각 다 붙은거야

 

그럼 얼마가 되어야할까?

 

첫번째 데이터그램 1500Byte(1480 + IPHeader 20)

두번째 데이터그램 1500Byte(1480 + IPHeader 20)

세번째 데이터그램 1040Byte(1020 + IPHeader 20)

 

이렇게 총 4040Byte로 만들어져.

이렇게 나눠지는거야.

계산 해 보면 1480 + 1480 + 1020 = 3980

여기에 IP헤더 하나를 붙이면 4000으로 원레 데이터그램의 크기가 나오지?

 

그래서 fragmentation을 하게 되면 데이터그램의 크기가 증가하게 되는 효과가 나는거야.

 

 

"어라? 그러면 fragmentation(단편화)가 된 조각들 중에는 TCP 헤더가 안붙어있는곳도 있겠네?"

맞아. 중간에 단편화가 진행되면서 tcp헤더 없이 데이터에 ip헤더만 붙은 데이터그램이 존재 할 수 있는거야.

 

 

댓글