← rfc/
╔══════════════════════════════════════════════════════════════════════════╗
RFC 713 · mail

Jack Haverty (JFH@MIT-DMS)

Yazar
Jack Haverty (JFH@MIT-DMS)
Kurum
Tarih
Nisan 1976
Durum
Network Working Group Yorum Talebi
Kanal
mail/

Yorum Talebi: 713

Jack Haverty (JFH@MIT-DMS)
NIC #34739
Nisan 1976

I. ÖZET

Ana bilgisayarlar arasında veri aktarımı için mesaj sunucuları tarafından kullanılmak üzere bir mekanizma tanımlanmıştır. MSDTP olarak adlandırılan bu mekanizma, sürecin iki öğe kümesi arasındaki bir dönüşüm modeli üzerinden tanımlanır: 'dizgeler' ve 'tamsayılar' gibi soyut varlıklar ile bu tür verileri bayt akışı olarak temsil etmek için kullanılan biçimler.

Genel bir veri aktarım mekanizmasının önerilen bir organizasyonu açıklanmakta ve MSDTP'nin bu ortamda nasıl kullanılacağı sunulmaktadır.

II. KAYNAKLAR

Black, Edward H., "The DMS Message Composer", MIT Project MAC, Programming Technology Division Document SYS.16.02.

Burchfiel, Jerry D., Leavitt, Elsie M., Shapiro, Sonya ve Strollo, Theodore R., derleyiciler, "Tenex Users' Guide", Bolt Beranek and Newman, Cambridge, Mass., Mayıs 1971, Ocak 1975 revizyonu, TENEX alt sistemleri hakkında açıklayıcı bölümler: MAILER, s. 116–117; MAILSTAT, s. 118–119; READMAIL, s. 137; ve SNDMSG, s. 165–170.

Haverty, Jack, "Communications System Overview", MIT Project MAC, Programming Technology Division Document SYS.16.00.

Haverty, Jack, "Communications System Daemon Manual", MIT Project MAC, Programming Technology Division Document SYS.16.01.

ISI Information Automation Project, "Military Message Processing System Design," İç Proje Dokümantasyonu (Baskısı Tükenmiş), Ocak 1975.

Message Services Committee, "Interim Report," 28 Ocak 1975.

Mooers, Charlotte D., "Mailsys Message System: Manual For Users", Bolt Beranek and Newman, Cambridge, Mass., Haziran 1975 (taslak).

Myer, Theodore H., "Notes On The BBN Mail System", Bolt Beranek and Newman, 8 Kasım 1974.

Myer, Theodore H., ve Henderson, D. Austin, "Message Transmission Protocol", Network Working Group RFC 680, NIC 32116, 30 Nisan 1975.

Postel, Jon, "The PCPB8 Format", NSW Proposal, 5 Haziran 1975.

Tugender, R., ve D. R. Oestreicher, "Basic Functional Capabilities for a Military Message Processing Service," ISI-RR-74-23, Mayıs 1975.

Vezza, Al, "Message Services Committee Minority Report," Ocak 1975.

III. GENEL BAKIŞ

Bu belge, sekiz bitlik bayt odaklı bir ağ bağlantısı üzerinden iletişim kuran mesaj sunucularının veri yapıları ve bunlarla ilişkili veri türü bilgilerini taşımak için kullanması amacıyla geliştirilen bir mekanizmayı açıklar. Benzer olmayan ana bilgisayarlar arasında veri yapıları aktarımı gereksinimi olan diğer projelere de faydalı olabileceği umuduyla burada sunulmaktadır.

PRIMITIVE ITEMS olarak adlandırılan soyut varlıklardan oluşan bir küme listelenmiştir. Bunların, tamsayılar, dizgeler ve diziler gibi genel kullanım açısından geleneksel veri türlerini içermesi amaçlanmıştır.

Ele alınan soyut veri varlıkları kümesini genişletmek için bir mekanizma tanımlanmıştır. Bu mekanizma, biçimi ve anlamı ilgili uygulama programları tarafından bilinen, ancak ortak kodlama olanakları kullanılarak iletilebilen uygulamaya özgü verilerin tanıtılmasına izin verir. Buna örnek olarak 'file specification' ya da 'date' adlı bir veri yapısı verilebilir. Bu mekanizma kullanılarak tanımlanan soyut veri varlıkları SEMANTIC ITEMS olarak adlandırılacaktır; çünkü bunlar genellikle ilgili uygulamada anlamsal içerik taşıyan verileri taşımak için kullanılır.

Semantic ve primitive öğeler topluca ITEMS olarak adlandırılır.

Protokol daha sonra, öğeleri bir makineden diğerine taşımak için kullanılan bayt akışının biçiminin tanımlanmasını içerir. Bu kodlamalar OBJECTS terimleriyle açıklanır; OBJECTS iletilen fiziksel bayt akışlarıdır.

Protokolü tamamlamak için, her nesne tanımlanırken nesneler ile öğeler arasındaki dönüşüm kuralları sunulur.

Bir öğe, bir nesneye dönüştürülerek iletilir; bu nesne bağlantı üzerinden alıcıya doğru bir bayt akışı olarak gönderilir ve alıcı tarafında tekrar bir öğe olarak yeniden oluşturulur. Bu nedenle protokol mekanizması basit bir çevirmen olarak görülebilir. Programcıların bildiği soyut varlıklar kümesini (items), bayt akışı biçimindeki varlıklar kümesini (objects) ve bu kümeler arasındaki dönüşüm kurallarını listeler. MSDTP uygulayan bir site tipik olarak nesneler ile yerel sistemde kullanılan çeşitli öğe temsilleri arasında dönüşüm yapan bir olanak sağlar. MSDTP kullanan uygulamalar etkileşimlerini öğeler kullanarak tanımlar; bu öğelerin farklı makinelerde hangi gerçek biçimlerde temsil edildiğini dikkate almazlar. Bu yaklaşım, programların bir karakter dizgesi gibi daha yüksek düzey kavramları, sahip olabileceği çok sayıdaki temsil biçimini düşünmek zorunda kalmadan işlemesine olanak tanır. Bu tür ayrıntılar MSDTP tarafından ele alınır.

Son olarak, programlar arasında iletişim için genel bir veri aktarım mekanizması tartışılır ve burada tanımlanan belirli bayt odaklı protokolün bu ortamda nasıl kullanılacağı açıklanır.

Sunulan terminoloji, tanıtıldığı şekilde büyük harflerle yazılarak tanımlanır ve vurgulanır.

IV. PRIMITIVE VERİ ÖĞELERİ

Primitive veri öğeleri, tamsayılar ve dizgeler gibi çeşitli geleneksel ve iyi bilinen türleri içerir. Primitive veri öğeleri, başına "p-" karakter çifti eklenmiş anımsatıcı adlar kullanılarak sunulacaktır; bu, adlandırılan nesnenin primitive olduğunu hatırlatmak içindir.

Bu öğeler çeşitli bilgisayar sistemlerinde programcılarının tercih ettiği herhangi bir biçimde temsil edilebilir.

IV.1 — Primitive Öğeler Kümesi

Tanımlanan primitive öğeler kümesi p-INT, p-STRING, p-STRUC, p-BITS, p-CHAR, p-BOOL, p-EMPTY ve p-XTRA öğelerini içerir.

Protokol öncelikle mesaj hizmetlerinde kullanılmak üzere geliştirildiğinden, gerekli görülmediği için p-FLOAT gibi öğeler dahil edilmemiştir. Gerektiğinde ek öğeler kolayca eklenebilir.

Bir p-INT, tamsayı sayılarını temsil etmenin geleneksel görevini yerine getirir. Bir p-BITS (BIT Stream) öğesi bir bit akışını temsil eder. Olası iki p-BOOL (BOOLean) öğesi, TRUE ve FALSE mantıksal değerlerini temsil etmek için kullanılır. Tek p-EMPTY öğesi, örneğin bir mesajın belirli bir alanının boş olduğunu belirtmek için kullanılır. 'Veri yok' anlamını temsil eden bir yer tutucu olarak sağlanır ve EMPTY olarak görünür.

p-STRUC (STRUCture) öğesi, öğelerin sırasını koruyarak bir öğe koleksiyonunu tek bir değer olarak gruplamak için kullanılır; örneğin p-INT'lerden oluşan bir p-STRUC.

Bir p-CHAR tek bir karakterdir. Ancak karakter verisinin en yaygın biçimi p-STRING olacaktır. Bir p-STRING, yalnızca p-CHAR içeren bir p-STRUC için eş anlamlı olarak düşünülmelidir. Bu kavram genellik ve tutarlılık açısından önemlidir; özellikle yapılarda izin verilen işlemlerin tanımlarını düşünürken, örneğin öğe alt dizilerini çıkarma gibi işlemlerde.

Tek bir bayt içinde iletilebilen dört p-XTRA öğesi, yalnızca adıyla temsil edilebilen ve sık kullanılan bir veri olduğunda üst düzey protokollerin kullanımı için sağlanmıştır. Buna örnek olarak iki sunucu arasındaki bir onay mesajı verilebilir. Bu tür verileri temsil etmek için p-XTRA kullanılması, bunların tek bir bayt içinde işlenmesine olanak tanır. Dört olası p-XTRA öğesi vardır: XTRA0, XTRA1, XTRA2 ve XTRA3. Bunlara kullanıcı protokolleri tarafından istenilen anlamlar atanabilir.

IV.2 — Yazdırma Kuralları

Primitive öğelerin tartışılmasını kolaylaştırmak amacıyla aşağıdaki yazdırma kuralları tanıtılmıştır.

Primitive veri öğesinin belirli bir örneği sunulduğunda, o veri türü için geleneksel bir gösterim kullanılacaktır. Örneğin p-INT öğeleri rakam dizileri olarak gösterilir, örneğin 100; p-STRING öğeleri çift tırnak içine alınmış karakter dizileri olarak gösterilir, örneğin "ABCDEF".

Yukarıda gösterildiği gibi iki olası p-BOOL öğesi TRUE veya FALSE olarak gösterilir. p-EMPTY nesnesi EMPTY olarak görünür. Bir bit akışı, yani p-BITS, yıldız işaretleri arasına alınmış 1 ve 0'lardan oluşan bir akış olarak görünür; örneğin 100101001. Bir p-CHAR, tek tırnak içine alınmış karakter olarak sunulur; örneğin 'A'.

p-STRUC öğeleri, elemanlarının temsilleri parantez içine alınarak yazdırılır; örneğin (1 2 3 4) veya ( "XYZ" "ABC" 1 2 ) ya da ((1 2 3) "A" "B"). p-STRING öğelerinin aslında yalnızca özel bir ad ve yazdırma biçimi verilmiş p-STRUC sınıfı olduğu unutulmamalıdır; bu nedenle "ABC" ve ('A' 'B' 'C') öğeleri aynıdır ve ikinci biçim kullanılmamalıdır.

Genel bir p-STRUC sunmak için, örneğin bir içeriğin biçimini belirtirken, öğeler anımsatıcı bir ad ile gösterilir ve isteğe bağlı olarak ardından iki nokta ve o veri için izin verilen değer türleri gelir. Bir bileşen için birden fazla öğe türü mümkün olduğunda, izin verilen türler dikey çizgi karakteriyle ayrılır. Örneğin p-INT|p-STRING, tek bir öğeyi temsil eder ve bu öğe ya p-INT ya da p-STRING olabilir.

Ardışık öğeleri temsil etmek için Kleene yıldızı kuralı kullanılır. p-INT[*] belirtimi herhangi sayıda p-INT anlamına gelir. Benzer şekilde p-INT[3,5] 3 ile 5 arasında p-INT ifade eder; p-INT[*,5] en fazla 5, p-INT[5,*] ise en az 5 p-INT belirtir.

Örneğin adlar ve sayılar taşıyan bir p-STRUC şu şekilde belirtilebilir:

(name:p-STRING number:p-INT)

Genel olarak öğeleri tartışırken belirli bir veri değeri kastedilmiyorsa, ad ve tür gösterimi kullanılabilir; örneğin sayısal değere sahip bir 'offset' hakkında konuşurken offset:p-INT.

V. SEMANTIC ITEM MEKANİZMASI

Semantic item mekanizması, program tasarımcılarının çeşitli uygulamaya özgü veri öğelerini kullanmasına olanak sağlayan bir yöntem sunar.

Bu mekanizma, veri türü bilgisini ve belirli semantic öğenin gerçek bileşenlerini taşımak için özel etiketli bir yapı kullanılarak uygulanır. Tartışma amacıyla böyle özel bir p-STRUC, p-EDT (Extended Data Type) olarak adlandırılacaktır.

p-EDT öğeleri aktarılırken, bir p-EDT olduklarına dair kimlikleri korunur; böylece bir uygulama programı basit bir p-STRUC yerine karşılık gelen semantic öğeyi alır. Diğer tüm açılardan bir p-EDT, bir p-STRUC ile aynıdır.

V.1 — p-EDT Biçimi

Tipik bir p-EDT aşağıda verilmiştir. Normal bir p-STRUC gibi yazdırılır. p-EDT öğeleri kullanıcıya sunulurken semantic öğelere dönüştürüldüğünden, bir p-EDT bu protokol tanımı dışında kullanılmayacaktır.

(type:p-INT|p-STRING version:p-INT com1:any com2:any ...)

İlk eleman olan type, genellikle bir p-INT değeridir ve belirli semantic öğe türünü tanımlamak için kullanılır. Türlere sayısal kodlar kontrollü bir şekilde atanır. Tür alternatif olarak bir p-STRING ile de belirtilebilir; bu, daha sonra kod atanması olasılığı bulunan yeni veri türlerinin geliştirilmesine olanak tanır. Her türün eşdeğer bir p-STRING adı vardır. Bunlar type elemanları olarak birbirinin yerine kullanılabilir; bunun temel amacı ileriye dönük uyumluluğu korumaktır.

Bir p-EDT öğesinin ikinci elemanı her zaman bir p-INT olan version değeridir ve ilgili verinin tam biçimini belirtir. Bir semantic öğe iç yapısında birkaç kez değişikliğe uğrayabilir; bu durum her değişikliğe farklı sürüm numarası verilmesiyle anlaşılır.

Ardışık bileşenler olan com elemanları, varsa, semantic öğenin gerçek verisini taşır. Her semantic öğe tanımlanırken bu bileşenlerin izin verilen değerleri ve yorumlanma kuralları açıklanır. Bu tür tanımlar semantic öğenin biçimini belirtmek için herhangi bir öğe türünü kullanabilir. Bu tanımlarda nesneler gibi daha düşük düzey kavramların kullanılması yasaktır.

Semantic öğeler, ilgili türün anımsatıcısı ile yazdırılır ve başına "s-" karakter çifti getirilir; bu, veri öğesinin bu mekanizma tarafından ele alındığını belirtir.

V.2 — Yazdırma Kuralları

Bir semantic öğe, yalnızca bileşenlerini içeren bir p-STRUC gibi temsil edilir; ancak başında semantic tür adı ve # karakteri bulunur. Sürüm numarası belirtilmemişse 1 olarak kabul edilir. Daha sonraki sürümlerde sürüm numarası tür adına eklenir; örneğin FILE veri türünün 2. sürümünü göstermek için FILE-2.

Örneğin 'file specification' adlı bir semantic öğe tanımlanmış olsun; iki bileşen içeriyor: bir ana bilgisayar numarası ve bir yol adı. Böyle bir öğenin belirli bir örneği şu şekilde görünebilir:

#FILE(69 "DIRECTORY.NAME-OF-FILE")

Genel bir s-FILE ise aşağıdaki gibi gösterilebilir:

#FILE(host:p-INT|p-STRING pathname:p-STRING)

host öğesi ya p-INT ya da p-STRING olabilir ve pathname ikinci bileşendir; p-STRING olmak zorundadır. Tam tanım bu bileşenlerin yorumlanma kurallarını da içerir.

VI. KODLAMA NESNELERİ

Bu bölüm, öğeleri sunucular arası aktarım için bayt akışları olarak temsil etmekte kullanılan nesneler kümesini sunar. Nesneler, yalnızca bayt akışı olarak var olduklarını göstermek için başında "b-" karakter çifti bulunan anımsatıcı tür adlarıyla gösterilecektir.

Tüm sunucuların nesnelerin tamamını çözümleyebilme yeteneğine sahip olması gerekir. Ancak kanal verimliliğini artırmak amacıyla sağlanan bazı nesneleri iletmek zorunlu değildir.

Kodlamalar, alıcı tarafındaki çözücünün programlanmasını kolaylaştıracak ve verimli olacak şekilde tasarlanmıştır. Tüm durumlarda nesnelerin türü ve bayt cinsinden uzunluğu gönderilen ilk bilgi olarak verilir. Bu özellik uygulama kolaylığı açısından önemlidir. Tür bilgisi, bir çözücünün modüler biçimde kurulmasına olanak tanır. Boyut bilgisinin eklenmesinin en önemli avantajı, alıcının bir sonraki adımda ne yapacağını belirlemek için kaç bayt okuması gerektiğini her zaman bilmesidir ve her nesnenin nerede bittiğini de bilir. Bu gereksinim, süreçlerin zamanlama ve senkronizasyonuyla ilgili birçok olası sorunu önler.

İki tür nesne tanımlanmıştır. İlki ATOMIC olarak adlandırılır ve en yaygın verileri verimli şekilde kodlamak için kullanılan nesneleri içerir. İkinci tür NON-ATOMIC olarak adlandırılır ve daha büyük veya daha az yaygın öğeleri kodlamak için kullanılır.

Her durumda bir veri nesnesi tek bir bayt ile başlar; buna TYPE-BYTE adı verilir ve bunun bir alanı nesnenin tür kodunu içerir. Sonraki baytlar varsa, ilgili türe göre yorumlanır.

VI.1 — Sunum Kuralları

Bayt biçimlerini tartışırken aşağıdaki kurallar kullanılacaktır. Bir baytın tek tek bitleri A ile H arasındaki büyük harflerle gösterilecektir; burada A en yüksek anlamlı biti, H ise en düşük anlamlı biti ifade eder. Örneğin sekiz bitlik değerin tamamı ABCDEFGH olarak adlandırılabilir. Benzer şekilde baytın alt alanları da bu tür dizilerle tanımlanacaktır. CDEF alanı bir baytın ortadaki dört bitini belirtir.

Alanların değerlerine atıfta bulunurken ikili (binary) biçim kullanılacak ve tartışma sırasında belirli bitleri tanımlamak için alfabenin sonlarına yakın küçük harfler kullanılacaktır. Örneğin, bir baytın BCD alanının belirli bir tür için bir belirteç içerdiğini söyleyebilir ve değerini BCD=11z olarak tanımlayabiliriz. Belirtecin kullanımına ilişkin tartışmalarda, sırasıyla BCD=111 ve BCD=110 değerlerini tanımlamak için kısaltma gösterimi olarak z=1 ve z=0 durumlarına atıfta bulunabiliriz.

V1.2 -- Tür-Baytı Bit Ataması

Çeşitli tür-baytı değerlerinin atamasının anlaşılmasına yardımcı olmak için, aşağıdaki tablo ve grafik sekiz bitin gösterimlerini sunmak üzere verilmiştir.

OXXXXXXX -- CHAR7 (CHARacter, 7 bit)
10XXXXXX -- SINTEGER (Small INTEGER)
110XXXXX -- NON-ATOM (NON-ATOMic objects)
11100XXX -- LINTEGER (Large INTEGER)
11101XXX -- reserved
11110XXX -- SBITSTR (Short BIT STReam)
111110XX -- XTRA (eXTRA single-byte objects)
1111110X -- BOOL (BOOLean)
11111110 -- EMPTY (EMPTY data item)
11111111 -- PADDING (unused byte)

Her durumda, X ile belirtilen bitler ilgili türe özgü bilgileri içermek için kullanılır. Bunlar her tür tanımlandığında açıklanacaktır.

Bunu tercih edenler için eşdeğer bir ağaç gösterimi aşağıda verilmiştir.

yüksek anlamlı bitten başlanır
 |
 |
 |
 0-----0-----0-----0-----0-----0-----0-----0-----X
 |     |     |     |     |     |     |     |   PADDING
0|    0|    0|    0|    0|    0|    0|    0|
 |     |     |     |     |     |     |     |
 X     |     X     |     X     |     X     X
CHAR7  | NON-ATOM  |    BITS   |   BOOL   EMPTY
 (7)   |   (5)     |    (3)    |   (1)
       |        0| |           |
   SINTEGER        |          XTRA
      (6)          |           (2)
               LINTEGER
                  (3)

Tür-Baytı Bit Atama Şeması

Bu diyagram, en üstten girilerek ve tür-baytı soldan sağa doğru taranırken her düğümde bir sonraki bite karşılık gelen uygun dalın seçilmesiyle yorumlanır. Bir tür atandığında, dal "X" ve nesnenin tür adı ile sona erer; parantez içindeki sayı kalan bit sayısını gösterir. Tek tek nesne tanımları, bu bitlerin ilgili tür için nasıl kullanıldığını belirtir.

V1.3 -- Atomik Nesneler

Atomik nesneler, bir tür-baytındaki belirli desenlerle tanımlanır. Nesnenin boyutu tekdüze bir biçimde açıkça belirtilmediğinden, alıcı sunucuların tüm atomik türleri tanıyıp işleyebilmesi gerekir.


Atomic Object: B-CHAR7

b-CHAR7 (CHARacter 7 bit) nesnesi, karakterlerin 7 bit ASCII biçiminde iletimini sağlamak için kullanılır. Mesajla ilişkili verilerin büyük çoğunluğu bu tür nesneleri içerdiğinden, iletim açısından oldukça verimli olacak şekilde tasarlanmıştır. Sekiz bitlik değerler gibi diğer biçimler atomik olmayan nesneler olarak kullanılabilir. Bir b-CHAR7'nin biçimi aşağıdaki gibidir:

Tuvwxyz bitleri karakterin ASCII kodunu içerir. Örneğin, "boşluk" (ASCII kodu 32, sekizlik 40) karakterinin iletimi aşağıdaki bayt ile yapılır.

00100000
ABCDEFGH

A = 0 bu baytı b-CHAR7 olarak tanımlar. Kalan bitler boşluk karakteri için 7 bitlik kodu, yani sekizlik 40 değerini içerir.

Tek başına bulunan bir b-CHAR7, bir p-CHAR olarak sunulur. Böyle durumlar kullanılırsa muhtemelen nadir olacaktır. b-CHAR7'lerin en yaygın kullanımı, daha sonra açıklanacağı gibi p-STRINGS iletmek için kullanılan b-USTRUC'ların elemanları olarak olacaktır.


Atomic Object: B-SINTEGER

b-SINTEGER (Small INTEGER) nesnesi, değeri 64'e kadar olan çok küçük pozitif tamsayıların iletilmesi için kullanılır. Her zaman bir p-INT'e dönüştürülür ve 0 ile 63 arasındaki herhangi bir p-INT iletim sırasında b-SINTEGER olarak kodlanabilir. b-SINTEGER biçimi aşağıdaki gibidir.

Örneğin, 10 (sekizlik 12) tamsayısını iletmek için aşağıdaki bayt gönderilir:

10001010
ABCDEFGH

AB = 10 bir b-SINTEGER olduğunu belirtir. Kalan altı bit, ikili biçimde ifade edilmiş 10 sayısını içerir.


Atomic Object: B-LINTEGER

b-LINTEGER (Large INTEGER) nesnesi, 64 bite kadar herhangi bir hassasiyette p-INT iletmek için kullanılır. Her zaman bir p-INT olarak çevrilir. Gönderen sunucular, sayıları iletmek için uygun olduğunda b-SINTEGER veya b-LINTEGER biçimlerinden birini seçebilir. Mümkün olduğunda kanal verimliliği için b-SINTEGER tercih edilebilir. b-LINTEGER biçimi aşağıdaki gibidir:

xyz bitleri, tamsayının 2'nin tümleyeni biçimindeki gerçek ikili kodunu içeren takip eden baytların sayısı olarak yorumlanır. Sıfır baytlık bir tamsayıya izin verilmediğinden xyz = 000 deseni 1000 olarak yorumlanır ve 8 baytın geleceğini belirtir. Sayı, yüksek anlamlı bitler önce olacak şekilde iletilir. Bu biçim, büyüklüğü 64 bite kadar olan tamsayıların iletimine olanak tanır.

Örneğin 4096 (sekizlik 10000) sayısı iletilecekse aşağıdaki bayt dizisi gönderilir:

11100010 00010000 00000000
ABCDEFGH ---gerçek veri---

ABCDE = 11100 bunun bir b-LINTEGER olduğunu tanımlar, E = 0 pozitif bir sayıyı belirtir ve FGH = 010 gerçek ikili sayıyı içeren 2 baytın geleceğini belirtir.


Atomic Object: B-SBITSTR

b-SBITSTR (Short BIT STReam) nesnesi, uzunluğu 63 veya daha az olan bir p-BITS iletmek için kullanılır. Daha uzun bit akışları için atomik olmayan b-LBITSTR nesnesi kullanılabilir. b-SBITSTR biçimi aşağıdaki gibidir.

xyz değeri bit akışı değerlerini elde etmek için okunacak ek bayt sayısını belirtir. b-SINTEGER durumunda olduğu gibi xyz = 000 değeri 1000 olarak yorumlanır ve 8 baytın geleceğini belirtir.

Tam olarak kaç bit bulunduğunu belirtme zorunluluğunu ortadan kaldırmak için aşağıdaki kural kullanılır. İlk veri baytı soldan sağa doğru taranır ve ilk 1 bitine ulaşılıncaya kadar devam edilir. Bit akışı hemen sonraki bit ile başlar ve okunan son baytın son bitine kadar devam eder. Başka bir deyişle, bit akışı toplanan baytlar içinde "sağa hizalanmıştır" ve sol sınırı ilk "1" biti tarafından belirlenir.

Örneğin 001010011 (9 bit) bit akışını göndermek için aşağıdaki baytlar iletilir.

11110010 00000010 01010011
ABCDEhij klmnopqr stuvwxyz

hij = 010 değeri iki baytın geleceğini belirtir. Karşılaşılan ilk 1 bit olan q biti, bit akışının başlangıcının r biti olduğunu gösterir. rstuvwxyz bitleri işlenen bit akışını oluşturur.


Atomic Object: b-BOOL

b-BOOL (BOOLean) nesnesi p-BOOL değerlerini iletmek için kullanılır. b-BOOL nesnelerinin biçimi aşağıdaki gibidir.

Bir b-BOOL'ün iki olası karşılığı FALSE ve TRUE değerleridir.

11111100 FALSE değerini temsil eder
11111101 TRUE değerini temsil eder
ABCDEFGz

z = 0 ise değer FALSE, aksi halde TRUE'dur.


Atomic Object: B-EMPTY

b-EMPTY nesne türü bir "null" nesneyi, yani bir EMPTY değerini iletmek için kullanılır. b-EMPTY biçimi aşağıdaki gibidir.

ABCDEFGH = 11111110 EMPTY değerini belirtir

Atomic Object: B-XTRA

b-XTRA nesneleri dört olası p-XTRA öğesini taşımak için kullanılır; bunlar XTRA0, XTRA1, XTRA2 ve XTRA3'tür. Bu dört öğe, b-XTRA tür kodu bitlerinden sonra kalan iki bitin ikili kodlamasına karşılık gelir. b-XTRA biçimi aşağıdaki gibidir.

Baytın GH bitleri aşağıdaki şekilde çözümlenerek belirli bir p-XTRA öğesi elde edilir:

b-XTRA nesnesi, üst katmanlara birkaç tek baytlık veri öğesinin kullanılmasını sağlamak için dahil edilmiştir. Bu öğeler, çok sık kullanılan bazı veri öğelerinin iletim verimliliğini artırmak amacıyla uygulamalar tarafından atanabilir. Örneğin, mesaj hizmetleri protokolleri bu öğeleri olumlu ve olumsuz onayları iletmek için kullanacaktır; bu iki öğe her etkileşimde oldukça yaygındır.


Atomic Object: B-PADDING

Bu nesne sıra dışıdır çünkü gerçekte hiçbir veriyi temsil etmez. Bir bayt akışında tür-baytı beklenen bir konumda karşılaşıldığında tamamen göz ardı edilir ve onun yerine sonraki bayt incelenir. Amacı, bayt akışlarında dolgu görevi görmek ve sunuculara kendi sözcük uzunlukları gibi içsel sorunları ele almada yardımcı olmaktır. Kodlayıcılar gerektiğinde dolgu amacıyla bu nesneyi serbestçe kullanabilir.

Tüm b-PADDING veri nesneleri yalnızca kodlanmış bir bayt akışı içinde bulunur. Kodlayıcı modülünün dışına hiçbir veri öğesi sunulmasına asla neden olmazlar. b-PADDING biçimi aşağıdaki gibidir.

ABCDEFGH = 11111111

Bunun, bir akış içindeki tüm bu tür "boş" baytların göz ardı edileceği anlamına gelmediğine dikkat edin; çünkü bunlar b-LINTEGER gibi başka bir türün içinde bir bayt olarak da bulunabilir. Yalnızca akış içindeki konumlarına göre bir "tür" baytı olarak görünen bu biçimdeki baytlar göz ardı edilir.

VI.4 -- Atomik Olmayan Nesneler

Atomik olmayan nesneler her zaman tek bir tür baytı ve ardından gelen birkaç boyut baytı ile birlikte iletilir. Tür baytı, ilgili veri nesnesinin atomik olmayan bir tür olduğunu tanımlar ve aynı zamanda ilgili özel türü benzersiz biçimde belirtir. Tüm atomik olmayan nesnelerin tür baytı değerleri aşağıdaki biçimdedir.

vwxyz değeri 31 olası atomik olmayan türden birini belirtmek için kullanılır. vwxyz = 00000 değeri gelecekteki genişletmeler için ayrılmıştır.

Tüm atomik olmayan veri nesnelerinde, tür baytından sonra gelen bayt(lar) veri nesnesini içeren takip eden baytların sayısını belirtir. Her durumda belirtilen bayt sayısı işlendiğinde akışta görülecek bir sonraki bayt başka bir tür baytı olmalıdır; bu da akıştaki bir sonraki nesnenin başlangıcıdır.

Nesne boyutu bilgisini içeren bayt sayısı değişkendir. Bu baytlar SIZE-BYTES olarak adlandırılacaktır. İlk karşılaşılan bayt aşağıdaki biçimdedir.

Tuvwxyz değerleri pozitif bir ikili sayı sağlar. Eğer s değeri 1 ise, tuvwxyz değeri okunması gereken ve ikili bir sayı olarak birleştirilecek olan takip eden baytların sayısını belirtir; bu sayı nesnenin boyutunu belirler. Bu baytlar yüksek anlamlı bitler önce olacak şekilde görünür. Böylece s = 1 ise, takip eden veri baytlarının sayısını içeren en fazla 128 bayt gelebilir; bu kesinlikle yeterli olacaktır.

Birçok atomik olmayan nesne oldukça kısa olacağından, s = 0 durumu tuvwxyz içindeki 7 bitin gerçek veri baytı sayısını belirttiğini göstermek için kullanılır. Bu, 128 bayta kadar olan nesnelerin tek bir boyut bilgisi baytı kullanılarak belirtilmesine olanak tanır. tuvwxyz = 0000000 durumu 128 baytı belirtir.

Örneğin iletilmesi için 100 (sekizlik 144) bayt gerektiren atomik olmayan bir veri nesnesi aşağıdaki şekilde gönderilir.

110XXXXX -- belirli bir atomik olmayan nesneyi tanımlar
01100100 -- ardından 100 bayt geleceğini belirtir
.
.
data -- 100 veri baytı
.
.

Boyut sayımının, boyut belirtici bayt(lar)ın kendisini içermediğini ancak nesneyi kodlamak için kullanılan akıştaki tüm takip eden baytları içerdiğini unutmayın.

20000 (sekizlik 47040) bayt gerektiren bir veri nesnesi akışta aşağıdaki şekilde görünür.

110XXXXX -- belirli bir atomik olmayan nesneyi tanımlar
10000010 -- sonraki 2 baytın akış uzunluğunu içerdiğini belirtir
01001110 -- 20000 sayısının ilk baytı
00100000 -- ikinci bayt
.
.
data -- 20.000 bayt
.
.

Akıştaki 20000 baytın içeriğinin yorumlanması, tür baytındaki DEFGH tarafından belirtilen atomik olmayan türün özel biçimini bilen bir modül tarafından yapılabilir.

Bu bölümün geri kalanı, başlangıç niteliğinde bir atomik olmayan tür kümesini, bunların kodlama biçimini ve yorumlama anlamlarını tanımlar.


Non-atomic Object: B-LBITSTR

b-LBITSTR (Long BIT Stream) veri türü, b-SBITSTR tarafından işlenemeyen p-BITS değerlerini iletmek için kullanılır. b-LBITSTR kısa p-BITS değerlerini iletmek için de kullanılabilir. Biçimi aşağıdaki gibidir.

11000001 size-bytes data-bytes
ABCDEFGH

ABC = 110 bunun atomik olmayan bir nesne olduğunu belirtir. DEFGH = 00001 bunun bir b-LBITSTR olduğunu belirtir. Standart boyut bilgisi takip eden baytların sayısını belirtir.

Veri baytları içinde karşılaşılan ilk nesne bir p-INT olarak çözülmelidir. Bu sayı, ardından gelecek bit akışının uzunluğunu belirtir. Gerçek bit akışı bir sonraki baytla başlar ve bayt akışı içinde sola hizalanmıştır.

Örneğin 101010101010 değerini kodlamak için aşağıdaki b-LBITSTR kullanılabilir; ancak b-SBITSTR daha kompakt olacaktır.

11000001 -- bir b-LBITSTR olduğunu belirtir
00000010 -- uzunluğu belirtmek için b-SINTEGER
10001100 -- boyut = 2
10101010 -- ilk 8 veri biti
10100000 -- son 4 veri biti

Non-atomic Object: B-STRUC

b-STRUC (STRUCture) veri türü herhangi bir p-STRUC iletmek için kullanılır. Bir b-STRUC'un ilkel bir öğeye dönüştürülmesine ilişkin çeviri kuralları b-REPEAT'lerin tartışılmasının ardından sunulacaktır. b-STRUC biçimi aşağıdaki gibidir.

11000010 size-bytes data-bytes
ABCDEFGH

ABC = 110 bunun atomik olmayan bir tür olduğunu belirtir. DEFGH = 00010 nesnenin bir b-STRUC olduğunu belirtir.

Veri baytları akışı içinde nesneler sırayla gelir. Bu, b-STRUC kodlayıcı ve çözücü modüllerinin b-STRUC'un her elemanını işlemek için standart bir kodlayıcı/çözücüye özyinelemeli çağrılar yapabileceği anlamına gelir.

Herhangi bir tür nesnenin b-STRUC elemanı olmasına izin verilir; ancak b-STRUC'un boyut bilgisi, elemanları temsil etmek için kullanılan tüm baytları içermelidir.

b-STRUC'ların başka b-STRUC'lar içinde bulunmasına makul herhangi bir seviyeye kadar izin verilir. Yani bir b-STRUC, eleman olarak başka bir b-STRUC içerebilir; o da başka bir b-STRUC içerebilir ve bu böyle devam edebilir. Tüm sunucuların bu tür iç içe yapıları en az üç seviyelik bir derinliğe kadar işleyebilmesi gerekir.

Kodlanmış yapı örnekleri daha sonraki bir bölümde verilmiştir.


Non-atomic Object: B-EDT

Bir b-EDT, anlamsal öğelerin iletiminde p-EDT'ler için taşıyıcı olarak kullanılan nesnedir. İşlevsel olarak bir b-STRUC ile aynıdır, ancak bir p-STRUC yerine anlamsal bir öğe olarak tanımlanıp dönüştürülebilmesini sağlamak için farklı bir tür koduna sahiptir. Bir b-EDT biçimi aşağıdaki gibidir.

11000011 size-bytes data-bytes
ABCDEFGH

Atomik olmayan tüm türlerde olduğu gibi, ABC = 110 bunun bu sınıfa ait olduğunu belirtir ve DEFGH = 00011 bir b-EDT tanımlar. Veri baytlarındaki nesneler b-STRUC'larda olduğu gibi çözümlenir. Ancak p-EDT biçimine uyması için ilk nesnenin p-INT veya p-STRING, ikinci nesnenin ise p-INT olarak çözümlenmesi gerekir.


Atomik Olmayan Nesne: b-REPEAT

b-REPEAT nesnesi hiçbir zaman doğrudan bir öğeye dönüştürülmez. Yalnızca kapsayıcı bir b-STRUC, b-USTRUC, b-EDT veya b-REPEAT bileşeni olarak kullanılması geçerlidir. Bir b-REPEAT, kapsayıcı yapıda b-REPEAT yerine yer alıyormuş gibi ele alınacak bir öğe kümesini kısa ve öz bir şekilde belirtmek için kullanılır. Bu, iletim sırasında aynı veri öğelerinin veya desenlerinin bir dizisini verimli biçimde kodlamak için bir mekanizma sağlar.

Bunun yaygın bir örneği metin iletiminde görülür; uzun boşluk dizileri içeren satır görüntüleri veya birden fazla carriage-return, line-feed çifti içeren sayfalar sıkça karşılaşılır. Bu tür diziler, iletim için veriyi daha sıkıştırılmış hale getirmek amacıyla uygun bir b-REPEAT olarak kodlanabilir. Bir b-REPEAT'in biçimi aşağıdaki gibidir.

11000100   -- nesnenin b-REPEAT olduğunu belirtir
size-bytes -- standart atomik olmayan nesne boyut bilgisi
countspec  -- p-INT'e dönüştürülen bir nesne
.
.
data -- deseni tanımlayan nesneler
.
.

countspec nesnesi, b-REPEAT'i kapsayan nesnede aşağıdaki veri deseninin kaç kez tekrarlanacağını belirtmek için bir p-INT'e dönüştürülmelidir.

b-REPEAT içindeki kalan nesneler tekrarlanacak veri desenini oluşturur. Kapsayıcı yapının çözümlemesi, veri deseni nesneleri b-REPEAT yerine countspec kez görünüyormuş gibi sürdürülür. Genellik sağlamak amacıyla sıfır tekrar sayısına izin verilir. Bu durumda kapsayıcı yapıda hiçbir nesne simüle edilmez.

Kodlayıcı, veri sıkıştırmanın getirdiği avantajlardan daha önemli olan durumlarda kodlamanın basitliğini tercih ederse b-REPEAT kullanmak zorunda değildir. Örneğin mesaj hizmetlerinde bir kodlayıcı kendini yalnızca uzun metin dizilerini sıkıştırmakla sınırlayabilir. Bununla birlikte uyumluluk açısından çözücülerin b-REPEAT nesnelerini işleyebilme yeteneğine sahip olması önemlidir.


Atomik Olmayan Nesne: B-USTRUC

b-USTRUC (Uniform Structure) nesne türü, sunucuların aktarılan bir p-STRUC'un yalnızca tek bir türden öğeler içerdiği bilgisini iletebilmesini sağlamak için sunulmuştur. En yaygın örnek, yalnızca p-CHAR öğeleri içeren ve bu nedenle bir p-STRING olarak değerlendirilebilen bir p-STRUC'a dönüştürülen bir b-USTRUC olacaktır. Sunucular bu bilgiyi nesneleri daha verimli biçimde çözümlemek için kullanabilir. Hiçbir sunucunun b-USTRUC üretmesi zorunlu değildir.

Bir b-USTRUC'un iç yapısı, tür baytı dışında bir b-STRUC ile aynıdır. b-USTRUC'un biçimi aşağıdaki gibidir.

11000101 size-bytes data-bytes
ABCDEFGH

ABC = 110 atomik olmayan bir nesneyi tanımlar. DEFGH = 00101 nesnenin b-USTRUC olduğunu belirtir.


Atomik Olmayan Nesne: B-STRING

b-STRING nesnesi, bir yapının açık biçimde p-STRING olarak belirtilmesine izin vermek için dahil edilmiştir. Bu bilgi, alıcı sunucuların gelen yapıyı daha verimli biçimde işlemesini sağlar.

Bir b-STRING, tür baytının nesneyi b-STRING olarak tanımlaması dışında bir b-USTRUC ile benzer biçimde düzenlenir. Normal boyutlandırma bilgisinin ardından, yüksek anlamlı bit yok sayılarak b-CHAR7 olarak yorumlanan bir bayt akışı gelir. b-STRING biçimi aşağıdaki gibidir.

11000110 size-bytes data-bytes
ABCDEFGH

ABC = 110 atomik olmayan bir nesneyi tanımlar. DEFGH = 00110 nesnenin b-STRING olduğunu belirtir.


VI.5 — Yapı Çeviri Kuralları

Bir b-STRUC, bir p-STRUC'a dönüştürülür. Bu işlem, b-STRUC içindeki her nesnenin karşılık gelen öğeye çevrilmesi ve üretilen p-STRUC içine dahil edilmek üzere saklanmasıyla gerçekleştirilir.

Bir b-USTRUC benzer şekilde işlenir; ancak kodlama programları ortaya çıkacak p-STRUC'un tek tip öğeler içereceği bilgisinden yararlanabilir. p-STRING'lerin kodlanması için tercih edilen yöntem b-USTRUC kullanmaktır.

Ortaya çıkan p-STRUC'un tüm elemanları p-CHAR ise, çözücü kullanıcısına bu yapı bir p-STRING olarak sunulur. Bir p-STRING, yalnızca karakterlerden oluşan bir p-STRUC için eşanlamlı olarak düşünülmelidir. p-CHAR'lardan oluşan p-STRUC'ları uygulama programlarına sunan bazı ortamlarda p-STRING'in özel olarak bulunması zorunlu değildir.

Bir öğe olarak karşılaşıldığında b-REPEAT nesnesi özel bir şekilde işlenir. Bu durumda b-REPEAT'in veri deseni bir öğe dizisine dönüştürülür ve bu dizi bir üst seviyede b-REPEAT içinde belirtilen sayıda tekrar edilir. Bu nedenle b-REPEAT yalnızca bir b-STRUC, b-USTRUC, b-EDT veya b-REPEAT içinde öğe olarak bulunabilir.

Bir p-STRUC veya p-STRING iletim için kodlanırken, çevirici veri sıkıştırması sağlamak amacıyla isteğe bağlı olarak b-REPEAT kullanabilir; ancak kullanımı zorunlu değildir. Benzer şekilde b-STRING nesneleri de kullanılabilir fakat zorunlu değildir.

Bir b-EDT, semantik bir öğenin taşıyıcısı olduğunu belirtmek için bir p-EDT'ye dönüştürülür. Bunun dışında bir b-STRUC ile aynı şekilde ele alınır.


VI.6 — Çeviri Özeti

Aşağıda ilkel öğeler ile nesneler arasındaki olası dönüşümler özetlenmiştir:

Tüm semantik öğelerin p-EDT olarak temsil edildiğini ve bayt akışı biçiminde her zaman b-EDT olarak bulunduğunu unutmayın.


VI.7 — Yapı Kodlama Örnekleri

Aşağıdaki akış, değerleri 1, 2 ve 3 olan üç b-SINTEGER içeren bir b-STRUC iletir; bu, üç p-INT içeren bir p-STRUC'u, yani (1 2 3) ifadesini temsil eder.

11000010 -- b-STRUC
00000011 -- boyut = 3
10000001 -- b-SINTEGER = 1
10000010 -- b-SINTEGER = 2
10000011 -- b-SINTEGER = 3

Bir sonraki örnek, X ve Y karakterlerini ve ardından b-LINTEGER 10 değerini içeren bir b-STRUC'u temsil eder; bu, iki p-CHAR ve bir p-INT içeren bir p-STRUC, yani ('X' 'Y' 10) anlamına gelir. p-INT bulunduğu için bunun bir p-STRING olarak değerlendirilemeyeceğine dikkat edin.

11000010 -- b-STRUC
00000100 -- boyut = 4
01011000 -- b-CHAR7 'X'
01011001 -- b-CHAR7 'Y'
11100001 -- b-LINTEGER
00001010 -- 10

Bu p-STRUC'u göndermenin daha iyi bir yolu, aşağıda gösterildiği gibi tamsayıyı bir b-SINTEGER olarak temsil etmektir.

11000010 -- b-STRUC
00000011 -- boyut = 3
01011000 -- b-CHAR7 'X'
01011001 -- b-CHAR7 'Y'
10001010 -- b-SINTEGER = 10

Bir sonraki örnek b-CHAR7'lerden oluşan bir b-STRUC gösterir. Bu, b-STRING "HELLO" ifadesinin çevirisidir.

11000010 -- b-STRUC
00000101 -- boyut = 5
01001000 -- b-CHAR7 'H'
01000101 -- b-CHAR7 'E'
01001100 -- b-CHAR7 'L'
01001100 -- b-CHAR7 'L'
01001111 -- b-CHAR7 'O'

Bu veri aynı zamanda bir b-STRING olarak da iletilebilir. Karakter baytlarının mutlaka b-CHAR7 olması gerekmediğini, çünkü yüksek anlamlı bitin yok sayıldığını unutmayın.

11000110 -- b-STRING
00000101 -- boyut = 5
01001000 -- 'H'
01000101 -- 'E'
01001100 -- 'L'
01001100 -- 'L'
01001111 -- 'O'

20 carriage-return/line-feed çifti içeren bir p-STRING kodlamak için, aşağıdaki b-REPEAT içeren b-STRUC kullanılabilir.

11000010 -- b-STRUC
00000101 -- boyut = 5
11000100 -- b-REPEAT
00000011 -- boyut = 3
10010100 -- sayım, b-SINTEGER = 20
00001101 -- b-CHAR7 'CR'
00001010 -- b-CHAR7 'LF'

Dizinin başında tek bir 1 bulunan ve ardından otuz adet 0 içeren bir p-INT p-STRUC kodlamak için aşağıdaki b-STRUC kullanılabilir.

11000010 -- b-STRUC
00000110 -- boyut = 6
10000001 -- b-SINTEGER = 1
11000100 -- b-REPEAT
00000010 -- boyut = 2
10011110 -- sayım, b-SINTEGER = 30
10000000 -- b-SINTEGER = 0

VII. Genel Bir Veri Aktarım Şeması

Bu bölüm, bir veri çevirici kavramının çok amaçlı bir veri aktarım mekanizmasına nasıl genişletilebileceğine dair olası bir şemayı ele almaktadır.

Önerilen ortam, burada listelenenleri de içeren ancak çeşitli uygulamaları karşılamak üzere gerektiğinde genişletilmiş bir ilkel öğeler kümesi sağlayacaktır. Süreçler arasındaki iletişim yalnızca bu öğeler açısından tanımlanacak ve verinin hangi gerçek biçimlerde aktarıldığı konusu özellikle dikkate alınmayacaktır.

Öğeleri çeşitli iletim biçimlerine dönüştürmek için kullanılacak çeviricilerden oluşan bir repertuar sağlanacaktır; bunlardan biri MSDTP mekanizmasıdır. Radyo terminolojisinden bir kavram ödünç alınarak, her çevirici belirli bir iletişim ortamı üzerinden veri aktarmak için kullanılan farklı bir modülasyon şemasına benzer olacaktır.

Bu ortamlar sekiz bitlik bayt yönelimli bir bağlantı, 36 bitlik bir bağlantı vb. olabilir ve bant genişliği, maliyet ve gecikme gibi başka ayırt edici özelliklere de sahip olabilir. Bir site hangi ortamı destekliyorsa, programcılarına gerekli çevirileri gerçekleştiren bir modül sağlayacaktır.

Bazı ortamlar veya çeviriciler çeşitli öğeleri işleyemeyebilir. Örneğin MSDTP, p-FLOAT, p-COMPLEX, p-ARRAY vb. olarak adlandırılabilecek öğeleri işlemez. Ayrıca belirli öğelerin aktarımında farklı ortamların verimliliği büyük ölçüde değişebilir. Örneğin MSDTP, mesaj işleme sırasında sık kullanılan verileri çok verimli biçimde aktarır, ancak çok büyük veya derin ağaç yapılarının aktarımında nispeten zayıf kalır.

Her sitede bir süreç veya alt yordam paketi olarak, iletişim ortamının diğer ucundaki karşı modülle arayüz kurmaktan sorumlu bir modül bulunacaktır. Bu modüller, henüz tanımlanmamış bir protokol kullanarak yeteneklerini eşleştirecek ve birden fazla seçenek olduğunda veri öğelerinin aktarımı için belirli bir ortam ve çevirici seçecektir.

Böyle bir olanak, uygulamaları kodlama biçimleri, makine farklılıkları vb. konuları dikkate alma gerekliliğinden tamamen yalıtabilir ve bu tür olanakları gerektiren her yeni proje için tekrar tekrar geliştirme yapılmasını ortadan kaldırabilir. Ayrıca yeni çeviriciler veya ortamlar eklendiğinde, mevcut kullanıcılar bunları yeniden programlama yapmadan hemen kullanabilir.

Böyle bir protokolün uygulanması çok zor veya zaman alıcı olmamalıdır; çünkü ilk uygulamalarda en uygun aktarım mekanizmasını seçme konusunda çok karmaşık olması gerekmez. Sistem doğası gereği ileriye dönük uyumludur ve kolayca genişletilebilir.