Ցանցային ծրագրավորում

**Ցանցային ծրագրավորումը** համակարգչային ցանցերի միջոցով հաղորդակցվող պրոցեսների(ծրագրերի) ստեղծման կամ դրանց հետ աշխատելու գործընթացն է։ Հիմնականում ծրագրերը, որոնք ունեն տարբեր սարքերի վրա գործարկվող բաղկացուցիչ մասեր, անվանվում են բաշխված ծրագրեր և սովորաբար բաղկացած են կլիենտ/սերվեր հարաբերություններից։

**Սերվերը** համակարգչային ծրագիր է կամ սարք, որը ծառայություն է մատուցում մեկ այլ համակարգչային ծրագրի և դրա օգտագործողին, որը հայտնի է նաև որպես կլիենտ։

·       Բանկի աշխատակիցները(սերվեր) ծառայություններ են մատուցում հաշվի սեփականատերերին(կլիենտ)

·       Մատուցողուհիները(սերվեր) ծառայություն են մատուցում հաճախորդներին (կլիենտ)

·       Տուրիստական գործակալները(սերվեր) ծառայություն են մատուցում արձակուրդի մեկնողներին(կլիենտ)

Որոշ դեպքերում սերվերներն իրենք կարող են դառնալ կլիենտ.

·       Տուրիստական գործակալները դառնում են կլիենտ, երբ զանգահարում են ավիաընկերություն՝ ամրագրում կատարելու կամ հյուրանոց՝ սենյակ վարձակալելու համար

Ցանցի ներսում, սովորաբար, յուրաքանչյուր ոք ցանկացած պահի կարող է լինել կլիենտ կամ սերվեր։ Սա հայտնի է որպես peer-to-peer computing.

**Պրոտոկոլը** տվյալների ֆորմատավորման և մշակման կանոնների կանոնակարգված ամբողջություն է։ Դա հաղորդակցման համար նախատեսված օրենքների/քայլերի ամբողջություն է։ Պրոտոկոլի պարզ օրինակ է հեռախոսային խոսակցությունը, որտեղ կա քայլերի/պատասխանների ակնկալվող հավաքածու՝ զրույցի սկզբից մինչև ավարտը։ Տվյալ քայլերին չհետևելու դեպքում առաջանում է շփոթություն։ Իրականում պրոտոկոլները պարունակում են շերտավորված մակարդակներ։ Ցածր մակարդակի շերտերը գործ ունեն, օրինակ, տվյալների բիթերի փոխանցման ձևի, ավելի բարձր մակարդակի շերտերը՝ տվյալների փոխանցման վայրի հետ։

Ինտերնետի հետ աշխատող համակարգիչները հիմնականում օգտագործում են հետևյալ բարձր մակարդակի՝ ծրագրային շերտի պրոտոկոլներից որևէ մեկը՝ ապահովելու ծրագրերի հաղորդակցությունը.

·       Hyper Text Transfer Protocol(HTTP)

·       File Transfer Protocol(FTP)

·       Telnet

Ավելի ցածր՝ տրանսպորտային շերտի մակարդակում կան առանձին պրոտոկոլներ, որոնք օգտագործվում են նախօրոք որոշելով, թե տվյալները ինչպես պետք է փոխանցվեն.

·       Transport Control Protocol(TCP)

·       User Datagram Protocol(UDP)

Վերոնշյալ շերտի ներքևում ցանցի շերտն է, որը որոշում է, թե ինչպես կարելի է տեղորոշել տվյալների նպատակակետերը, իսկ ամենաներքևում հղման շերտն է, հենց որն էլ իրականացնում է բիթերի/բայթերի փոխանցումը։

## TCP
·       կապի վրա հիմնված պրոտոկոլ, որն ապահովում է տվյալների հուսալի հոսք երկու համակարգիչների միջև

·       երաշխավորում է, որ մի ծայրից ուղարկված տվյալները հասնում են մյուս ծայր և հասնում են ուղարկված հերթականությամբ

·       հուսալի հաղորդակցություն պահանջող ծրագրերի համար տրամադրում է կետ առ կետ հոսք

·       պահանջում է երկար ժամանակ երկու կետերի միջև կապ հաստատելու համար

## UDP
·       պրոտոկոլ, որը ուղարկում է իրարից անկախ տվյալների խմբեր, որոնք կոչվում են դատագրամներ

·       չի երաշխավորում, որ տվյալները կհասնեն, քանզի կապի վրա հիմնված չէ

·       ավելի արագ է, քանզի ժամանակ չի ծախսվում կապի հաստատման վրա

Ինչու՞ օգտագործել UDP պրոտոկոլը, եթե հնարավոր է տվյալների կորուստ։ Իսկ ինչու՞ ենք մենք օգտվում էլ փոստից կամ փոստային ծառայությունից։ Մենք երաշխավորված չենք, որ մեր նամակները կհասնեն ում մենք դրանք ուղարկում ենք, սակայն մենք հույս ենք դնում այդ կառույցների աշխատանքի վրա։ Դա կարող է լինել ավելի արագ, քան հեռախոակապ հաստատելը։

**Պորտը** դեպի ծրագիր տանող դարպասն է կամ դեպի ծրագիր մուտքի կետը։

Չնայած հիմնականում համակարգիչն ունի մեկ ֆիզիկական կապ ցանցի հետ, տարբեր ծրագրերից տվյալները ուղարկվում կամ ստացվում են կապի ներսում ձևավորված պորտերի միջոցով։ Երբ տվյալները ինտերնետով պետք է փոխանցվեն  պահանջվում է, որ մենք նշենք նպատակակետային համակարգչի հասցեն, ինչպես նաև ծրագրի պորտի համարը։ Համակարգչի հասցեն 32-բիթանոց IP հասցե է։ Պորտի համարը 16-բիթանոց համար է՝ 0-ից 65,535-ի սահմաններում, իսկ 0-1023 պորտերը սահմանափակված են այնպիսի ծրագրերի կողմից, ինչպիսիք են HTTP և FTP:

## Ծանոթագրություններ

## Գրականություն
Network Programmability and Automation by *Jason Edelman, Scott S. Lowe, Matt Oswalt*

Beej's Guide to Network Programming by *Brian "Beej Jorgensen" Hall*

Java Network Programming by *Elliotte Rusty Harold*