CoAp (Constrained Application Protocol – Kısıtlı Uygulama Protokolü)
Nesnelerin İnterneti ile birlikte düşük kapasiteli cihazların dünyamızdaki yeri daha da önemli hale gelecek. IT profesyonelleri ve bilgisayar bilimcileri var olan teknolojilerimizi bu düşük kapasiteli cihazlara uyarlamaya çalışmakta; mümkün olmadığı zaman da yenilerini geliştirmekteler. Bu teknolojilerden bir bölümü de hali hazırda kullanmakta olduğumuz uygulama katmanı protokolleridir. Düşük kapasiteli cihazlar için geliştirilmiş ve geliştirilmekte olan birçok protokol bulunmaktadır. Bu yazıda bu protokollerden CoAp’tan (Constrained Application Protocol – Kısıtlı Uygulama Protokolü) bahsedeceğiz.
CoAp (Constrained Application Protocol
CoAp (Constrained Application Protocol – Kısıtlı Uygulama Protokolü), IETF (Internet Engineering Task Force – İnternet Mühendisliği Görev Gücü) tarafından tasarlanmış bir uygulama katmanı protokolüdür. Adından da anlaşılabileceği gibi birincil amacı kısıtlı kaynaklara sahip cihazlar üzerinde ve kısıtlı bant genişliğine sahip ağlarda çalışmak olan CoAp, tasarımı basit tutmak için UDP üzerinde çalışır. CoAp, uygulama uç birimleri arasında etkileşimli bir istek/cevap modeli sunar; servisler ve kaynakların keşfi için yerleşik desteğe sahiptir; URI gibi anahtar web kavramlarını barındırır.
CoAP’ın etkileşim modeli HTTP’nin istemci/sunucu modeline benzer ancak CoAP makineden-makineye çalıştığı için CoAp hem istemci hem sunucu rollerini üstlenir. HTTP’den farklı olarak bu etkileşim UDP üzerinde asenkron olarak gerçekleştirilir. Bu süreç, opsiyonel olarak güvenilirliği desteklemek için mesaj katmanlarının mantıksal kullanımı ile gerçekleştirilebilir.
CoAP’ta temel 4 mesaj tipi vardır: Confirmable, Non-Confirmable, Acknowledgment ve Reset.
Confirmable mesajların karşılığında bir Acknowledment gönderilmesi gerekmektedir. Bu Acknowledment mesajları cevapla birlikte gönderilebileceği gibi ayrı olarak da gönderilebilir.
Non-Confirmanble mesajların karşılığında Acknowledment gönderilmesine gerek yoktur.
Acknowledment mesajlar Confirmable mesajlara karşılık olarak gönderilirler.
Reset mesajları, bir nedenden dolayı yerine getirilemeyen istek (Confirmable veya Non-Confirmable) karşılığında gönderilir. Ayrıca boş bir reset mesajı bir cihazın ulaşılabilir olup olmadığını anlamak için de kullanılabilir (bir bakıma ping gibi).
CoAp, 4 byte’lık sabit bir başlık kullanır. Her mesajda 16 bitlik bir Mesaj Kimliği (Message ID) bulunur. Bu da, saniyede 250 tane mesajı kimliklendirmek için yeterlidir.
Güvenilirlik, Confirmable mesajlar ile sağlanırlar. Bir Confirmable mesaj, bu mesaj için bir Acknowledgment mesajı alınana kadar bir zaman aşımı mekanizması kullanılarak yeniden gönderilir. Bir cihaz bir isteğin içeriğini yerine getiremeyeceği zaman Acknowledgment mesajı yerine Reset mesajı gönderir. Güvenilir olması gerekmeyen mesajlar Non-Confirmable olarak gönderilirler. Bu mesajların taşıdığı isteğin yerine getirilememesi halinde Reset mesajı gönderilebilir.
Metod kodu veya cevap kodu içeren CoAp istek/cevap semantiği CoAp mesajları üzerinde taşınır. Bir istek Confirmable veya Non-Confirmable mesaj üzerinde taşınabilir; eğer bir Confirmable mesaja verilebilecek cevap hazırsa, oluşturulan Acknowledmeng mesajı ile birlikte gönderilebilir. Bu cevap verme yöntemine “piggybacked“denmektedir. Bu cevap tipinde ayrı Acknowledgment ve ayrı cevap yoktur, ikisi birleştirilmiştir. Eğer sunucu, isteği anında cevaplayacak durumda değilse basitçe boş bir Acknowledgment üretir ve gönderir. Cevap hazırlandığı zaman yeni bir Confirmable mesaj oluşturulur ve cevap bu mesaj ile gönderilir. Bu cevap verme türüne “ayrılmış cevap” denir. Bu durumda istemci, kendisine Confirmable mesaj içerisinde gelen cevap karşılığında Acknowledgment göndermek zorundadır. Aksi taktirde sunucu sürekli olarak aynı cevabı gönderecektir. CoAP, cevapları isteklerle eşleştirmek için bir jeton (Token) kullanır. Jeton kavramı Mesaj Kimliğinden farklı bir kavramdır.
Eğer bir istek Non-Confirmable olarak gönderilmişse, cevap Non-Confirmable veya Confirmable olarak gönderilebilir.
CoAp, GET, PUT, POST, DELETE gibi temel http komutlarını http’dekine benzer şekilde kullanır. Ayrıca unicast iletişimin yanı sıra multicast iletişime de olanak tanır.
Versiyon (Ver): iki bit işaretsi tamsayıdır. CoAP’ın versiyon numarasını gösterir.
Type (T): iki bit işaretsi tamsayıdır. Mesaj tipini gösterir. Confirmable (0), Non-confirmable (1), Acknowledgement (2) ve Reset (3).
Jeton Uzunluğu (Token Length – TKL): 4 bitlik işaretsiz tamsayıdır. Değişken uzunluklu TOKEN alanının uzunluğunu gösterir.
Kod (Code): 8 bitlik işaretsi tamsayı. Bu alan bir isteği, başarılı bir cavabı, bir istemci hata cevabını, bir sunucu hata cevabını gösterebilir.
Mesaj Kimliği (Message ID): 16 bitlik işaretsiz tamsayı. Mesaj tekrarlarını tespit etmek için kullanılır. Ayrıca, mesaj tiplerini eşleştirmek için kullanılır.
Başlıktan sonra TOKEN değeri gelmektedir. TOKEN değeri istekleri ve cevapları ilişkilendirmek için kullanılır.
Başlık ve TOKEN alanlarından sonra OPTIONS alanı gelmektedir. Bir CoAp mesajı hiçbir opsiyon barındırmayacağı gibi birden fazla opsiyon da barındırabilir. OPTIONS alanını PAYLOAD alanından payload işaretçisi adı verilen 1 byte’lık alan ayırır.
Son olarak opsiyonel PAYLOAD alanı gelmektedir. Eğer bir payload varsa, bu payloaddan önce 8 tane bitten oluşan payload işaretçisi gelir. PAYLOAD alanı, payload işaretçisinden sonra UDP datagramının sonuna kadar uzatılabilir.
Bu yazıda kısaca CoAp protokolünü tanıtmaya çalıştık. Elbetteki bir protokolün detaylarının birkaç paragrafta anlatılması mümkün değil. CoAp ile ilgili en detaylı bilgi için IETF’nin RFC7252 numaralı ve “The Constrained Application Protocol (CoAP)” başlıklı dokümanına bakılabilir.