Friday, August 7, 2009

TCP Sıra ve Onay Numaraları (Sequence Number & Acknowledgment Number) - 1

Bu yazımızda, TCP bağlantısı kurulması aşamasında ve TCP bağlantısı kurulduktan sonra, sıra ve onay numaralarının (sequence number & acknowledgment number) durumları incelenecektir.

Bir ağ üzerinde yer alan iki bilgisayar birbirleri arasında bilgi transferi yapacağı zaman aralarında bir TCP bağlantısı kurmaları gerekmektedir. Bu TCP bağlantısı, iki taraftan birisinin TCP bağlantı isteğini yapmasıyla başlar.

TCP bağlantılarında, karşılıklı gönderilen paketlerin hedefe ulaşıp, ulaşmadığını garanti etmek amacıyla sıra ve onay numaraları (sequence number & acknowledgment number) kullanılır.

TCP bağlantısını başlatan taraf, göndereceği TCP segmentinin başlığının (header) içerisindeki SYN bitinin değerini "1" yapar ve TCP bağlantısı için bir başlangıç sıra numarası (ISN = Initial Sequence Number) üretir. Bu sıra numarası , her işletim sisteminde farklı algoritmalarla, rastgele olacak şekilde üretilen bir sayıdır. Sıra ve onay numaralarının her birinin uzunluğu 32 bittir.

Yazımızda önce TCP 3 aşamalı el skışıma (TCP 3 way handshaking) aşamasından bahsedeceğiz:
Senaryomuzda A bilgisayarı, B sunucusuna bir HTTP isteği yapacaktır. Bilindiği gibi HTTP istekleri normalde TCP 80 numaralı portu kullanır. Bunun için A bilgisayarının, B sunucusuna 80 numaralı port üzerinden bir TCP bağlantısı başlatması gereklidir.

A bilgisayarı TCP başlığı içindeki SYN bayrağının değerini "1" yapar ve rastgele bir başlangıç sıra numarası (ISN = Initial Sequence Number) üretir. Yukarıda da belirtmiş olduğumuz gibi, ISN her işletim sisteminde farklı bir algoritmayla üretilmektedir. A bilgisayarı TCP bağlantısını başlattığı için ve B sunucusundan henüz herhangi bir cevap da almamış olduğu için göndereceği segmentin onay numarasının (acknowledgment number) değeri "0"dır (sıfır).
Yukarıdaki şekle göre A bilgisayarı, B sunucusuna bir TCP bağlantı isteği göndermektedir. Gönderilen bu TCP segmentinin sıra numarası 4227644578'dir ve TCP segmentinin başlığının içindeki SYN bayrağının değeri de "1"dir.

B sunucusu aldığı bu TCP segmentine, kendi ISN'sini (Initial Sequence Number) içeren bir başka TCP segmentiyle cevap verir. B sunucusunun gönderdiği bu TCP segmentinin başlığındaki SYN ve ACK bayraklarının değeri "1" olarak belirlenmiştir. Ayrıca bu segment, içerisinde A bilgisayarından almış olduğu paketin onay numarası da içermektedir.
Yukarıdaki şekle göre B sunucusu, A bilgisayarına bir cevap segmenti dönmüştür. Bu cevap segmentinin başlığında yer alan SYN ve ACK bayraklarının değeri "1"dir. Ayrıca B sunucusu kendi ISN'sini (Initial Sequence Number) de bu segmente eklemiştir. Yukarıdaki örnekte B sunucusunun ISN değeri 3363649303'tür. Bunun yanı sıra B sunucusu, A bilgisayarına bir önceki segmenti aldığına dair bir de onay numarası (acknowledgment number) gönderir. Bu değer bir önceki pakette yer alan sıra numarasının "1" fazlasıdır. Yani 4227644578 + 1 = 4227644579'dur. B sunucusu, A bilgisayarına şunu demektedir: "4227644578 numaralı segmenti aldım. Bundan sonra bana göndereceğin sıra numarası (sequence number) 42276644579 olsun.

Bunda sonraki aşamada A bilgisayarı, bağlantının kurulması için B sunucusuna son olarak bir segment daha gönderir. Bu segmentin başlığı içindeki ACK bayrağının değeri "1" olarak belirlenir. Ayrıca A bilgisayarı, B sunucusunun göndermiş olduğu segmenti aldığını da bir onay numarası (acknowledgment number) göndererek bildirir. Bu onay numarasının değeri almış olduğu TCP segmentinin içerisinde yer alan B sunucusuna ait olan sıra numarasının (sequence number) "bir" fazlasıdır.
Yukarıdaki şekle göre A bilgisayarı, B sunucuna cevap olarak göndermiş olduğu segmentin başlığındaki ACK bayrağının değerini "1" olarak belirlemiştir. Ayrıca bir önceki segmenti aldığına dair de B sunucusuna bir onay numarası (acknowledgment number) göndermiştir. Bu onay numarası bir önceki segmentte yer alan B sunucusuna ait olan sıra numarasından (sequence number) "bir" fazladır. Yani 3363649303 + 1 = 3363649304'tür. Burada A bilgisayarı şunu demektedir: "Sıra numarası 3363649303 olan segmenti aldım.Bundan sonra yollayacağın segmentin sıra numarası 3363649304 olsun."

Böylece A bilgisayarı ve B sunucusu arasında TCP bağlantısı kurulmuş olur. Bundan sonra her iki uç arasında veri akışı başlayacaktır. Bundan sonra veri akışının devam etmesi için ilk TCP segmentini A bilgisayarı gönderecektir. Bu ilk segmentin sıra numarası 42276644579 ve onay numarası da 3363649304 olacaktır.
Yukarıdaki şekilde A bilgisayarı, B sunucusuna şunu demektedir: "Senden gelen 3363649303 sıra numaralı segmenti aldım. Bundan sonra göndereceğin segmentin sıra numarası 3363649304 olsun."

Bundan sonra gelecek olan üç segment aşağıdaki gibi olacaktır:
Yukarıdaki şekilde B sunucusu, A bilgisayarına şunu demektedir: "Senden gelen 4227644579 sıra numaralı segmenti aldım. Bundan sonra göndereceğin segmentin sıra numarası 4227644580 olsun."

Yukarıdaki şekilde A bilgisayarı, B sunucusuna şunu demektedir: "Senden gelen 3363649304 sıra numaralı segmenti aldım. Bundan sonra göndereceğin segmentin sıra numarası 3363649305 olsun."

Yukarıdaki şekilde B sunucusu, A bilgisayarına şunu demektedir: "Senden gelen 4227644580 sıra numaralı segmenti aldım. Bundan sonra göndereceğin segmentin sıra numarası 4227644581 olsun."
Veri alışverişi, sıra ve onay numaraları bu şekilde artarak bağlantı bitene kadar devam eder.

ÖNEMLİ NOT: Bu örnekte dikkat edilirse sıra ve onay numaralarının birer birer arttığı görülür. Fakat gerçek hayattaki bir TCP bağlantısında bu numaralar birer birer artmazlar. Bu numaralar, segmentin içerdiği verinin büyüklüğüne bağlı olarak bir artış gösterirler. Bununla ilgili örneği de bir sonraki yazımızda anlatmayı planlıyoruz.

1 comment:

  1. çok açıklayıcı olmuş. teşekkür ederim.

    ReplyDelete