IPv4 Başlık Bilgisi ve Detaylı İncelemesi
7 min read

IPv4 Başlık Bilgisi ve Detaylı İncelemesi

IPv4 Başlık Bilgisi ve Detaylı İncelemesi

IPv4 paketi; IP paket özelliklerini tanımlayan bir başlık bilgisi ve IP verisinden oluşur. IPv4 paketinin hangi içeriklerle oluşturulduğunu, bu içeriklerin bize neler anlattığını bu yazımızda detaylıca ve örnekleriyle birlikte inceleyeceğiz. Header checksum değeri nasıl hesaplanır, MTU değerine göre paketler nasıl parçalara ayrılır sorularının cevaplarını da örneklerle inceleyeceğiz.

764x208

Yukarıdaki görselde IPv4 paketinin başlık bilgisinde hangi bilgilerin yer aldığı resmedilmiştir. Bu tablo üzerinden tüm özellikleri aşağıda başlık başlık incelemeye başlıyoruz.

Version: Ip versiyonu bilgisini verir.

  • 0100 -> IPv4 ,
  • 0110 -> IPv6 olarak gösterilir.

Header Length: Headerda bulunan 32 bit kelimelerin sayısının belirtir.

  • Minimum değeri 5’tir ve minimum uzunluk 5×32 = 160 bits yani 20 byte’dır.
  • Maximum değeri 15’tir. Maximum header uzunluğu (15×32 = 480 bits ) 60 byte olabilir.

Type of Service (TOS): Differentiated Services Code Point (DSCP) olarak da bilinmektedir. QoS bilgilerini taşır.

  1. bit reserve edilmiştir ve her zaman sıfır olarak ayarlanır.
634x184

ECN (Expilicit congestion notification): Paketleri düşürmeden uçtan uca networkte tıkanıklık olup olmadığını bildirir. İsteğe bağlı çalışan bir özelliktir. Yalnızca temel ağ tarafından desteklendiğinde etkilidir.

Total Length: Datagram boyutunu (header + data) olarak tanımlar. Minimum değer 20 byte (20 byte header + 0 byte data ) , maximum değeri 65,535 byte’dır. Buradaki değer 8’in katı ve MTU’ya eşit ya da altında bir değer olmalıdır.

Identification: Orijinal datagram parçalarını benzersiz şekilde tanımlayan değer.

Flags: Fragmentleri kontrol etmek ve ya tanımlamak için kullanılır.

  • Bit 0 -> reserved, 0 olmak zorunda
  • Bit 1 -> Don’t Fragment (DF) genelde ayarlanmaz default değer 0’dır
  • Bit 2 -> More Fragment (MF)

Don’t Fragment (DF): Datagramın iletim sırasında ara cihazlar tarafından MTU değerlerine göre bölünüp bölünemeyeceğini belirtir.

  • DF -> 0 ise datagram parçalara ayırılabilir
  • DF -> 1 ise datagram parçalara ayrılmaz

Datagram için DF 1 olarak ayarlanmışsa ve MTU değerinden daha büyük bir veri miktarıyla aktarma yapılmaya çalışılırsa iletim gerçekleşmez. ICMP destination unreachable mesajı oluşturulur ve gönderene bu mesaj iletilir.

More Fragment (MF): Alıcıya gelen datagramın tek parça ya da daha büyük bir datagramın parçası olduğunu belirtir.

  • MF -> 0 datagram kümedeki son parçadır ya da tek parçadır.
  • MF -> 1 datagramın devam parçalarının geleceğini belirtir.

MF ve DF değerlerini daha iyi anlamak amacıyla aşağıdaki gibi bir topolojide Sunucudan PC’ye 1500 byte’lik bir datagramın ağdaki davranışını inceleyelim.

581x121

Sunucu ve ilk router arasında MTU değerleri 9000 ‘dir. Datagramımız bu değerin altında olduğu için bölünmez ve DF -> 0 MF -> 0 değerlerini alır. (1500 = 1480 Data + 20 Header)

  1. routerda MTU değeri 1080 olduğu için datagram 2’ye parçalanır.
  2. İlk paketin boyutu 1080 (1060 data + 20 header) DF -> 0 MF-> 1
  3. İkinci paketin boyutu 440 (420 data + 20 header) DF - > 0 MF -> 0

netsh interface ipv4 show subinterfaces komutu ile kendi bilgisayarınızın arayüzlerindeki MTU boyutunu öğrenebilirsiniz.

Atılan paketin parçalanmadan iletilmesini istersek DF değerini 1 olarak ayarlamamız gerektiğini söylemiştik. Komut satırından aşağıdaki gibi ping attığımızda datagramın parçalanmadan karşıya gitmesini istediğimiz için paket iletimi gerçekleşmeyecektir.

ping 8.8.8.8 -f -l 5000
554x384

Fragment Offset: Ip datagramının parçalarını numaralandırır. Bu sayede hedef bilgisayar parçalanmış datagramı doğru sırayla birleştirebilir. İlk parçanın offset değeri her zaman 0’dır. Bir datagramın alabileceği max offset değeri (213-1)x8 = 65.528‘dir

Örnek üzerinde inceleyecek olursak: 1440 byte’lık bir paketin MTU boyutu 576 olan bir router üzerinden geçerkenki parçalanma işlemi şu şekilde gerçekleşir.

Paket -> 1440 = 1420 Data + 20 Header

Total Length alanı için 576 8’e tam bölünemediğinden 576’dan küçük 8’e bölünebilen en büyük değer olan 572 kullanılır.

MTU -> 572 = 552 Data + 20 Header
1420 = 552 + 552 + 316 olarak 3’e bölünür.

1.Parça:

  • Identification alanı bir id ile doldurulur.
  • Reserved bit ve DF değeri set edilmez (0) , MF değeri verinin devamı geleceği için 1 olarak atanır. (001)
  • İlk parça olduğu için Fragment offset değeri : 0 0000 0000 00000 olarak atanır.
  • Total Length alanı için 572 kullanılır. 0000 0010 0011 1100
  • 552 byte veri gönderilir, geriye 868 byte veri kalır.

2.Parça:

  • Identification alanı aynı id ile doldurulur
  • Reserved bit ve DF değeri set edilmez (0) , MF değeri verinin devamı geleceği için 1 olarak atanır. (001)
  • Fragment offset ilk paketteki gönderilen boyuta göre hesaplanır.
  • 552/8 = 69 olduğundan 69 olarak tanımlanır: 0 0000 0100 0101
  • Total Length alanı için 572 kullanılır. 0000 0010 0011 1100
  • 552 byte veri gönderilir geriye 316 byte veri kalır.

3.Parça:

  • Identification alanı aynı id ile doldurulur
  • Reserved bit ve DF değeri set edilmez (0) , MF değeri verinin devamı gelmeyeceği için 0 olarak atanır. (000)
  • Fragment offset önceki paketlerdeki gönderilen boyuta göre hesaplanır.
  • 1104/8 = 138 olduğundan 138 olarak tanımlanır: 0 0000 1000 1010
  • Total Length alanı için 336 kullanılır. 0000 0001 0101 0000
  • 316 byte data da gönderilerek işlem tamamlanır.
ParçaIdentificationFlagsFragment OffsetTotal Length
112340010572
2123400169572
31234000138336

Time to Live (TTL): Datagramın internet sisteminde kalmasına izin verilen max süredir.0 – 255 arasında değerler alabilir. 0 değerini aldığında paket imha edilir. Zaman, saniye cinsinden ölçülür. Ancak bir datagram geçtiği modüller üzerinde bir saniyeden daha kısa bir sürede işlense bile TTL değeri en az 1 düşürülür.

Protocol: Kullanılan protokol burada belirtilir. Bazı protokoller aşağıdaki gibidir.

0x011ICMP
0x022IGMP
0x066TCP
0x088EGP
0x099IGP
0x1117UDP
0x1B27RDP
0x2941IPv6
0X5888EIGRP
0X5989OSPF
0X67103PIM

Header Checksum: Hata kontrolü için ayrılmış 16 bitlik alandır. Paket iletimi yapılan her modülde bu değer hesaplanıp karşılaştırılır. Hata varsa paket yok edilir.

Bir IPv4 bilgisini ele alalım ve header checksum değerini hesaplayalım. Bunun için wireshark üzerinden herhangi bir paketi inceleyebiliriz.

604x449

Paket45 00 00 28 35 4a 40 00 35 06 f4 1b 5d 5e fd 48 c0 a8 01 1b

  • 4 -> version değeridir. 0010 -> yani IPv4 paketi olduğunu belirtir.
  • 5 -> Header length . 0101 -> 5×32=160 bits=20 Byte uzunluğunda olduğunu gösterir.
  • 00 -> TOS değerleridir. 0000 00 -> DSCP default değerlerinde
  • 00 -> ECN default değerlerde yani TOS normal operasyon değerleriyle çalışıyor.
  • 0028 -> 0000 0000 0010 1000 Total Length = 40 byte
  • 354a -> 0011 0101 0100 1010 Identification = 13642
  • 4000 -> 0100 0000 0000 0000 flags ve fragment offset0 …. …. …. …. Reserved bit = 0 (unset) .1.. …. …. …. DF = 1 (set) ..0. …. …. …. MF = 0 ...0 0000 0000 0000 Fragment offset = 0 Veri parçalara ayrılamaz ve bu veriden sonra veri gelmeyecek.
  • 35 -> 0011 0101 -> TTL değeri 53
  • 06 -> 0000 0110 -> Protocol TCP
  • f4 1b -> header checksum, hesaplamadan sonra bulmamız gereken değer burası
  • 5d 5e fd 48 -> source ip
  • c0 a8 01 1b -> destination ip

NOT: Header chucksum değeri hesaplarken tüm 16 bitlik değerler sırasıyla toplanır.

45 00 -> 0100 0101 0000 0000
00 28 -> 0000 0000 0010 1000
0100 0101 0010 1000 -> ilk toplam
35 4a -> 0011 0101 0100 1010
0111 1010 0111 0010 -> ikinci toplam
40 00 -> 0100 0000 0000 0000
1011 1010 0111 0010 -> üçüncü toplam
35 06 -> 0011 0101 0000 0000
1110 1111 0111 1000 -> dördüncü toplam
5d 5e -> 0101 1101 0101 1110
10100 1100 1101 0110 -> 5. toplam soldaki artık değer taşınıp toplanır
1
0100 1100 1101 0111 -> 5. toplam değeri olarak burası kullanılır
fd 48 -> 1111 1101 0100 1000
10100 1010 0001 1111 -> 6. toplam (artık değer var)
1
0100 1010 0010 0000 -> 6. toplam
c0a8 -> 1100 0000 1010 1000
10000 1010 1100 1000 -> 7. toplam (artık değer var)
1
0000 1010 1100 1001 -> 7. Toplam
011b -> 0000 0001 0001 1011
0000 1011 1110 0100 -> tüm değerlerin toplamı. 1’s complement değeri alınır.
1111 0100 0001 1011 -> f41b bu değer checksum değeri ile karşılaştırılarak doğrulama yapılır.