| Yazar | Eric Harslem, John Haefner, Jim Madden | | Kurum | UCLA | | Tarih | 25 Mayıs 1971 | | Durum | Network Working Group Yorum Talebi | | RFC Numarası | 166 |
İÇİNDEKİLER
- I. GİRİŞ ................................... 2
- Bu RFC’nin Amacı ............................ 2
- Motivasyon ..................................... 2
- II. VERİ YENİDEN YAPILANDIRMA HİZMETİNE GENEL BAKIŞ ... 3
- Veri Yeniden Yapılandırma Hizmetinin Bileşenleri ... 3
- Kavramsal Ağ Bağlantıları ................. 3
- Bağlantı Protokolleri ve Mesaj Biçimleri ....... 4
- Örnek Bağlantı Yapılandırmaları .............. 7
- III. FORM MAKİNESİ ............................... 8
- Giriş/Çıkış Akışları ve Formlar ................. 8
- Form Makinesi BNF Sözdizimi ........................ 8
- Form Makinesi Sözdiziminin Alternatif Tanımı . 9
- Formlar .......................................... 10
- Kurallar .......................................... 10
- Terimler .......................................... 11
Terim Biçimi 1 ................................ 11 - Terim Biçimi 2 ................................ 11
- Terim Biçimi 3 ................................ 14
- Terim Biçimi 4 ................................ 14
Bir Terimin Uygulanması ...................... 14
Terim Fonksiyonlarının Kısıtlamaları ve Yorumları .................................. 15
Terim ve Kural Sıralaması ....................... 16
IV. ÖRNEKLER ....................................... 17
Açıklamalar ........................................ 17
Alan Ekleme ................................ 17
Silme ....................................... 17
Değişken Uzunluklu Kayıtlar ........................ 18
Dize Uzunluğu Hesaplama ...................... 18
Yer Değiştirme .................................. 18
Karakter Paketleme ve Paket Açma ................ 18
I. GİRİŞ
BU RFC’NİN AMACI
Bu RFC’nin amacı Veri Yeniden Yapılandırma Hizmetini (DRS) tanımlamaktır.
DRS deneyi, Ağ veri akışlarını yeniden biçimlendirmek için bir yazılım mekanizmasını kapsamaktadır. Bu mekanizma, çok sayıda Ağ uygulama programına uyarlanabilir. Deneyin sonucunun, bu RFC’de açıklanan ilkeleri bünyesinde barındıran gelecekteki bir standart hizmete yol açmasını umuyoruz.
MOTİVASYON
Uygulama programları belirli veri G/Ç biçimlerine gereksinim duyar, ancak bu biçimler programdan programa farklılık gösterir. Bizim benimsediğimiz görüş, her programı bir standarda uydurmak için değiştirmek yerine, Ağ’ın bireysel program gereksinimlerine uyum sağlaması gerektiğidir. Bu görüş, düzenli mesaj içeriklerinin biçimlerini tanımlayan standartların kullanımını dışlamaz; yalnızca, bir standardın zorunlu olmaktan ziyade tercih edilen bir çalışma biçimi olduğu şeklinde bir yorumdur.
Farklı program gereksinimlerine ek olarak, kullanıcıların tek bir hizmet programına bağlanmak için birçok farklı türde konsol kullanmak istemesi durumunda da bir biçim uyuşmazlığı problemi ortaya çıkar. Her bir konsol dönüşümü için ayrı yazılım paketleri gerektirmek yerine, Ağ’ın bireysel konsol yapılandırmalarına uyum sağlaması tercih edilir.
Uyarlama sağlamanın bir yaklaşımı, önemli ölçüde hesaplama gücüne sahip sitelerin bir veri yeniden yapılandırma hizmeti sunmasıdır; bu belge, böyle bir hizmetin teknik özelliklerini tanımlamaktadır.
Hizmetin öngörülen çalışma biçiminde, bir uygulama programcısı veri yeniden yapılandırmalarını tanımlayan formlar belirler. Hizmet, bu formları adlarıyla saklar. Daha sonraki bir zamanda, bir kullanıcı (belki de programcı olmayan biri) yalnızca formu adıyla çağırarak, bir Ağ veri akışının belirli bir dönüşümünü gerçekleştirmek için hizmeti kullanır.
Bazı özel veri yeniden biçimlendirme gereksinimlerine uygun bir gösterim sağlamaya çalıştık; bunu yaparken, gösterimin ve onun temel uygulamasının, deneysel hizmeti kullanışlı kılacak kadar ifade gücüne sahip olan alt sınır ile, genel amaçlı bir programlama diline ulaşmayan üst sınır arasında kalan bir yararlılık aralığında olmasına dikkat ettik.
II. VERİ YENİDEN YAPILANDIRMA HİZMETİNE GENEL BAKIŞ
VERİ YENİDEN YAPILANDIRMA HİZMETİNİN BİLEŞENLERİ
Veri Yeniden Yapılandırma Hizmetinin (DRS) bir uygulaması; bağlantı protokolleri için modüller, hizmetten talep edilebilecek bazı istekleri ele alan bir birim, bu isteklere yanıt vermek üzere çalışan (Form Makinesi olarak adlandırılan) bir derleyici ve/veya yorumlayıcı ve veri yeniden yapılandırma tanımlarını (formları) saklamak ve geri çağırmak için bir dosya depolama modülünü içerir.
Bu bölüm, bağlantı protokollerini ve istekleri açıklamaktadır. Bir sonraki bölüm, Form Makinesi dilini ayrıntılı olarak ele almaktadır. Dosya depolama bu belgede tanımlanmamıştır; çünkü hizmetin kullanımı açısından saydamdır ve uygulaması her DRS ana bilgisayarında farklıdır.
KAVRAMSAL AĞ BAĞLANTILARI
DRS’ye yönelik üç kavramsal Ağ bağlantısı vardır; Şekil 1’e bakınız.
- Denetim bağlantısı (CC), kaynak kullanıcı ile DRS arasındadır. Veri yeniden yapılandırmalarını tanımlayan formlar bu bağlantı üzerinden belirlenir. Kullanıcı, aşağıda açıklanan iki bağlantı üzerinden geçen verilere uygulanacak formları (bir kez) belirtir.
- Kullanıcı bağlantısı (UC), bir kullanıcı süreci ile DRS arasındadır.
- Sunucu bağlantısı (SC), DRS ile hizmet veren süreç arasındadır.
Amaç Ağ’ı kullanıcı ve sunucu süreçlerine uyarlamak olduğundan, UC ve SC üzerinde asgari düzeyde gereksinim dayatılmaktadır.
+------------+ +------+ +---------+
| KAYNAK | CC | DRS | SC | SUNUCU |
| KULLANICI |--------------| |----------| SÜRECİ |
+------------+ ^ +------+ ^ +---------+
| / |
| UC/ GEÇERLİ => | | ÇIKIŞ
AKIŞI | | İŞARETÇİ | GEÇERLİ BÖLÜMÜ | İŞARETÇİ | | AKIŞI
| | +- ----------------- -+ | |
| | ----------------- | |
| | ----------------- | |
| | ----------------- | |
\/\/ \/\/
Şekil 5. Formun Veri Akışlarına Uygulanması
FORM MAKİNESİ BNF SÖZDİZİMİ
form ::= rule | rule form
rule ::= label inputstream outputstream ;
label ::= INTEGER |
inputstream ::= terms |
terms ::= term | terms , term
outputstream ::= : terms |
term ::= identifier | identifier descriptor |
descriptor | comparator
identifier ::= bir alfabetik karakteri izleyen 0 ila 3
alfanümerik karakter
descriptor ::= (replicationexpression , datatype ,
valueexpression , lengthexpression control)
comparator ::= (value connective value control) |
(identifier .
datatype ::= B | O | X | E | A
valueexpression ::= value |
lengthexpression ::= arithmeticexpression |
connective ::= .LE. | .LT. | .GE. | .GT. | .EQ. | .NE.
value ::= literal | arithmeticexpression
arithmeticexpression ::= primary | primary operator arithmeticexpression
primary ::= identifier | L(identifier) | V(identifier) |
INTEGER
operator ::= + | - | * | /
literal ::= literaltype "string"
literaltype ::= B | O | X | E | A
string ::= 0 ila 256 karakter
control ::= : options |
options ::= S(where) | F(where) | U(where) |
S(where) , F(where) |
F(where) , S(where)
where ::= arithmeticexpression | R(arithmeticexpression)
FORM MAKİNESİ SÖZDİZİMİNİN ALTERNATİF TANIMI
sonsuz
form ::= {rule}
1
1 1 1
rule ::= {INTEGER} {terms} {:terms} ;
0 0 0
sonsuz
terms ::= term {,term}
0
1
term ::= identifier | {identifier} descriptor
0
| comparator
1
descriptor ::= ({arithmeticexpression} , datatype ,
0
1 1 1
{value} , {lengthexpression} {:options}
0 0 0
1
comparator ::= (value connective value {:options} ) |
0
1
(identifier .
İsteğe bağlı tamsayı etiketleri 0 >= INTEGER >= 9999 aralığındadır. Kuralların artan sayısal sırada etiketlenmesi gerekmez.
TERİMLER
Giriş akışı (eşleştirilecek giriş akışını tanımlar) ve çıkış akışı (çıkış akışında üretilecek verileri tanımlar) sıfır veya daha fazla terimden oluşur ve aşağıda gösterilen biçimdedir.
inputstream ::= terms |
outputstream ::= :terms |
terms ::= term | terms , term
Terimler aşağıda belirtildiği gibi dört biçimden birine sahiptir.
term ::= identifier | identifier descriptor |
descriptor | comparator
Terim Biçimi 1
identifier
Tanımlayıcı, form içinde daha önce tanımlanmış bir terime (terim biçimi 2) sembolik bir referanstır. Adı geçen terimle aynı öznitelikleri (değer, uzunluk, tür) alır. Terim biçimi 1 normalde çıkış akışında veri üretmek için kullanılır.
Tanımlayıcılar, bir alfabetik karakteri izleyen 0 ila 3 alfanümerik karakterden oluşur.
Terim Biçimi 2
identifier descriptor
Terim biçimi 2 genellikle bir giriş akışı terimi olarak kullanılır, ancak bir çıkış akışı terimi olarak da kullanılabilir.
Bir tanımlayıcı aşağıda gösterildiği gibi tanımlanır.
descriptor ::= (replicationexpression, datatype,
valueexpression, lengthexpression
control)
Tanımlayıcı, terimin olağan programlama dili anlamındaki sembolik adıdır. Terimin tür, uzunluk, değer ve çoğaltma özniteliklerini alır ve formun başka yerlerinde referans alınabilir.
Çoğaltma ifadesi belirtilmişse, terimin birim değerinin, çoğaltma ifadesinin değeriyle belirtilen sayıda üretilmesine neden olur. Terimin birim değeri (çoğaltılacak nicelik), veri türü, değer ifadesi ve uzunluk ifadesi özniteliklerinden belirlenir. Veri türü, belirtilen verinin türünü tanımlar. Değer ifadesi, diğer terim öznitelikleriyle genişletilen nominal bir değeri belirtir. Uzunluk ifadesi, terimin birim uzunluğunu belirler. (Benzer bir yorum için IBM SRL Form C28-6514’e bakınız; tanımlayıcı, orada tanımlanan sözde komut, tanımlı sabit temel alınarak modellenmiştir.)
Çoğaltma ifadesi aşağıda tanımlanmıştır.
replicationexpression ::= # | arithmeticexpression |
arithmeticexpression ::= primary | primary operator arithmeticexpression
operator ::= + | - | * | /
primary ::= identifier | L(identifier) | V(identifier) | INTEGER
Çoğaltma ifadesi, birleştirilmiş veri türü, değer ve uzunluk ifadelerine uygulanan bir tekrar işlevini temsil eder. Nominal değerin kaç kez yineleneceğini ifade eder.
# uç sembolü, keyfi bir çoğaltma katsayısı anlamına gelir. Giriş akışına bir eşleşme ya da eşleşmeme ile açıkça sonlandırılmalıdır. Bu sonlandırma aynı terimden ya da onu izleyen terimden kaynaklanabilir.
Boş bir çoğaltma ifadesinin değeri birdir. Aritmetik ifadeler, öncelik olmaksızın soldan sağa değerlendirilir.
L(identifier), adı verilen terimin uzunluğuna karşılık gelen 32 bitlik ikili bir tamsayı üreten bir uzunluk operatörüdür. V(identifier) ise adı verilen terimin değerine karşılık gelen 32 bitlik ikili bir tamsayı üreten bir değer operatörüdür. (Terim İşlevlerinin Kısıtları ve Yorumları bölümüne bakınız.) Değer operatörü, karakter dizilerini sayısal karşılıklarına dönüştürmek amacıyla tasarlanmıştır.
Veri türü aşağıda tanımlanmıştır.
datatype ::= B | O | X | E | A
Veri türü, terimin temsil ettiği veri türünü açıklar. (Gereksinim duyuldukça kayan nokta ve kullanıcı tanımlı türler gibi ek veri türlerinin eklenmesi beklenmektedir.)
| Veri Türü | Anlamı | Birim Uzunluk |
|---|---|---|
| B | Bit dizisi | 1 bit |
| O | Bit dizisi | 3 bit |
| X | Bit dizisi | 4 bit |
| E | EBCDIC karakteri | 8 bit |
| A | Ağ ASCII karakteri | 8 bit |
Değer ifadesi aşağıda tanımlanmıştır.
valueexpression ::= value |
value ::= literal | arithmeticexpression
literal ::= literaltype "string"
literaltype ::= B | O | X | E | A
Değer ifadesi, terimin nominal değeridir ve veri türüyle belirtilen biçimde ifade edilir. Çoğaltma ifadesine göre yinelenir.
Giriş akışında boş bir değer ifadesi, giriş akışında bulunan veriyi varsayılan olarak alır. Ancak bu veri, veri türü özniteliğine uymalıdır.
Boş bir değer ifadesi, Terim İşlevlerinin Kısıtları ve Yorumları bölümüne göre doldurma üretir.
Uzunluk ifadesi aşağıda tanımlanmıştır.
lengthexpression ::= arithmeticexpression |
RFC 166 — Veri Yeniden Yapılandırma Hizmeti
Mayıs 1971
Uzunluk ifadesi, değer ifadesini içeren alanın uzunluğunu belirtir.
Uzunluk ifadesi sıfıra eşit veya sıfırdan küçükse, terim başarılı olur ancak ilgili akış işaretçisi ilerletilmez. Pozitif uzunluklar, terim diğer açılardan başarılıysa ilgili akış işaretçisinin ilerletilmesine neden olur.
Denetim, TERİM VE KURAL SIRALAMASI başlığı altında tanımlanmıştır.
Terim Biçimi 3
Terim biçimi 3 aşağıda gösterilmiştir.
descriptor
Tanımlayıcının çıkarılması dışında terim biçimi 2 ile aynıdır. Terim biçimi 3 genellikle çıkış akışında kullanılır. Giriş akışında ise, giriş verilerinin atlanması ancak üretim veya daha sonra referans için saklanmaması gereken durumlarda kullanılır.
Terim Biçimi 4
Dördüncü terim biçimi aşağıda gösterilmiştir.
comparator ::= (value connective value control) |
(identifier *
options ::= S(where) | F(where) | U(where)
S(where), F(where) |
F(where), S(where)
where ::= arithmeticexpression | R(arithmeticexpression)
S, F ve U sırasıyla başarı, başarısızlık ve koşulsuz aktarımı ifade eder. Where, bir kural etiketine değerlendirilir; böylece aktarım, bir kuralın içinden (bir terimin sonunda) başka bir kuralın başlangıcına yapılabilir. R, formu sonlandırmak ve değerlendirilen ifadeyi kontrol bağlantısı üzerinden (hala açıksa) başlatıcıya geri döndürmek anlamına gelir.
Terimler açıkça sıralanmamışsa, aşağıdaki varsayılanlar geçerlidir:
- Bir terim başarısız olduğunda, bir sonraki sıralı kurala gidilir.
- Bir terim başarılı olduğunda, kural içindeki bir sonraki sıralı terime gidilir.
- Bir kuralın sonunda, bir sonraki sıralı kurala gidilir.
Aşağıdaki örnekte, kontrol aktarımı ile girdi işaretçisinin hareketi arasındaki ilişkiye dikkat ediniz.
1 XYZ(,B,,8:S(2),F(3)) : XYZ ;
2 . . . . . . .
3 . . . . . . .
XYZ’nin değeri, başarı ya da başarısızlık durumlarının her ikisinde de kuralın dışına aktarım yapıldığından, çıktı akışına hiçbir zaman gönderilmeyecektir. Terim başarılı olursa, girdinin 8 biti XYZ’nin değeri olarak atanır ve ardından kural 2 aynı girdi akışı verisine uygulanır. Yani, kural 1’in sol tarafının tamamı başarıyla uygulanmadığından, girdi akışı işaretçisi ilerletilmez.
IV. ÖRNEKLER
Açıklamalar
Aşağıdaki örnekler (formlar ve ayrıca tekil kurallar), Form Makinesinin basit ve temsilî kullanımlarıdır. Örnekler, açıklamayı kolaylaştırmak amacıyla satır başına bir terim biçiminde ifade edilmiştir. Normalde, tek bir kural tek bir satır olarak yazılabilir.
Alan Ekleme
Bir alan eklemek için, eklenen alanın araya girebilmesini sağlamak amacıyla girdiyi iki terime ayırın. Örneğin, başında bir satırbaşı denetim karakteri bulunan ve satır başına 121 karakter kullanan bir yazıcı için satır numaralandırması yapmak üzere aşağıdaki formu kullanın.
(NUMB*<=*1); /* satır numarası sayacını bire ayarla */
1 CC(,E,,1:F(R(99))), /* denetim karakterini al ve CC olarak sakla */
/* tükenme durumunda 99 kodunu döndür */
LINE(,E,,121 : F(R(98))) /* metni LINE olarak sakla */
:CC, /* denetim karakterini gönder */
(,E,NUMB,2), /* sayacı ilk iki sütunda gönder */
(,E,E".",1), /* satır numarasından sonra nokta gönder */
(,E,LINE,117), /* metni gönder, 117 baytlık alanda kes */
(NUMB*<=*NUMB+1:U(1)); /* satır sayacını artır ve birinci kurala git */
;;
Silme
Silinecek veriler, solda ayrı terimler olarak ayrılmalıdır; böylece sağ tarafta gönderilmeyerek atlanabilirler.
(,B,,8), /* yok sayılacak 8 biti ayır */
SAVE(,A,,10) /* girdi akışından 10 ASCII karakter çıkar */
:(,E,SAVE,); /* SAVE içindeki karakterleri EBCDIC karakterleri olarak gönder */
/* uzunluk, varsayılan olarak SAVE’in uzunluğudur */
Yukarıdaki örnekte, girdi akışı terimlerinden herhangi biri başarısız olursa, bir sonraki sıralı kural uygulanır.
Değişken Uzunluklu Kayıtlar
Bazı aygıtlar, terminaller ve programlar değişken uzunluklu kayıtlar üretir. Aşağıdaki kural, değişken uzunluklu EBCDIC kayıtlarını alır ve bunları ASCII’ye dönüştürür.
CHAR(#,E,,1), /* girdi akışındaki tüm EBCDIC karakterleri al */
(,X,X"FF",2) /* ardından onaltılık sabit FF */
:(,A,CHAR,), /* bunları ASCII olarak gönder */
(,X,X"25",2); /* bir ASCII satırbaşı karakteri gönder */
Dize Uzunluğu Hesaplama
Keyfi uzunluktaki bir karakter dizisinin başına bir uzunluk alanı eklemek çoğu zaman gereklidir. Aşağıdaki kural, bir EBCDIC dizisinin başına tek baytlık bir uzunluk alanı ekler.
Q(#,E,,1), /* tüm EBCDIC karakterleri al */
TS(,X,X"FF",2) /* ardından onaltılık sabit FF */
:(,B,L(Q)+2,8), /* karakterlerin ve sabitlerin uzunluğunu gönder */
Q, /* karakterleri gönder */
TS, /* sonlandırıcıyı gönder */
Yer Değiştirme
Aşağıdaki örnekte olduğu gibi alanların sırasını yeniden düzenlemek sıklıkla istenir.
Q(,E,,20), R(,E,,10), S(,E,,15), T(,E,,5) : R, T, S, Q ;
Terimler farklı bir sırayla gönderilir.
Karakter Paketleme ve Açma
HASP gibi sistemlerde, tekrarlanan karakter dizileri daha verimli depolama ve iletim için bir sayaç ve ardından karakter olacak şekilde paketlenir. İlk form birden çok karakteri paketler, ikincisi ise bunları açar.
/* EBCDIC akışlarını paketlemek için form */
/* her şey yolundaysa 99 döndürür, girdi tükenmiştir */
/* geçersiz EBCDIC varsa 98 döndürür */
/* yasal bir EBCDIC olmayan FF sonlandırma sinyalini ara */
/* tekrar sayısı 0–254 olmalıdır */
1 (,X,X"FF",2 : S(R(99))) ;
/* bir EBCDIC karakter al */
CHAR(,E,,1) ;
/* aynı EBCDIC karakterleri al */
LEN(#,E,CHAR,1)
/* sayacı ve karakteri gönder */
:(,B,L(LEN)+1,8), CHAR, (:U(1));
/* formun sonu */
;;
/* EBCDIC akışlarını açmak için form */
/* sonlandırıcıyı ara */
1 (,X,X"FF",2 : S(R(99))) ;
/* karakteri, sayaçta belirtilen sayıda gönder */
/* sayaç içeriğiyle belirtilen uzunlukta bir alanda */
CNT(,B,,8), CHAR(,E,,1) : (CNT,E,CHAR,1:U(1));
/* formun başarısızlığı */
(:U(R(98))) ;
;;
Bu RFC, çevrimiçi RFC arşivlerine girilmek üzere Simone Demmel tarafından 03/98 tarihinde makine tarafından okunabilir biçime dönüştürülmüştür.