Sunteți pe pagina 1din 5

Laborator 7 - Protocolul de transport TCP

Cuprins
1 Obiective 2 Noiuni teoretice 2.1 Header TCP 2.2 Schema tipica (inter)actiuni client/ erver TCP ! "P# !.1 oc$et() !.2 bind() !.! connect() !.% li ten() !.& accept() !.' end() / recv () !.( clo e() % )*ercitii+

Obiective
,n urma parcur-erii ace tui laborator tudentul va .i capabil+ a e*plice /n ce con t0 protocolul de tran port TCP a crie un pro-ram care .olo e1te oc$ei TCP.

Noiuni teoretice
TCP (Tran port Control Protocol) e te un protocol ce .urni2ea20 un .lu* i-ur de date /ntre dou0 calculatoare. "ce t protocol a i-ur0 tabilirea unei cone*iuni permanente /ntre cele dou0 calculatoare pe parcur ul comunicaiei. (34C (5!) Protocolul TCP are urm0toarele propriet0i+ tabilirea unei cone*iuni permanent /ntre client6 erver7 erverul va a tepta apeluri de cone*iune din partea clientilor. -arantarea ordinii primirii me a8elor 1i prevenirea pierderilor pachetelor controlul con-e tiei (.erea tra -li anta) are un overhead mare9 /n comparaie cu :;P6ul ("re un header de 2< =>te 9 /n comparaie cu :;P6ul care are ? =>te ). Header TCP :n pachet TCP are urm0torul header+ (34C (5!)
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | c!no"#e$%ment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |&| |P|'|S|(| | | )**set| 'eser+e$ |'|,|S|S|-|.| /in$o" | | | |0|1|2|3|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ,4ec!sum | &r%ent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | )5tions | Pa$$in% | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | $ata | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

)*plicaii header+ Portul surs e te ale random de c0tre ma1ina ur 0 a pachetului dintre porturile libere e*i tente pe acea ma1in0. Portul destinaie e te portul pe care ma1ina de tinaie poate recepiona pachete. Lungime e te lun-imea in octei a pachetului (header@date). Checksum e te valoarea umei de control pentru un pachet TCP

chema tipica !inter"actiuni client#server TCP


3,P S6'76' ---------,'6 36 S),163 | 8.ND 9#e%are soc!et $e 5ort cunoscut: | 3,P ,;.6N3 ;.S36N 9*ace soc!etu# 5asi+ - $oar 5entru conectare< nu si 5entru scriere=citire $e $ate: ---------| ,,6P3 9se b#oc4ea>a aste5tan$ conectarea c#ienti#or? intoarce un nou soc!et< *o#osit 5entru scriere=citire $e $ate $e #a ,6S3 c#ient: ,'6 36 S),163 | | | | Stabi#irea ,one@iunii | ,)NN6,3 A-----------------------------B | | 3,P 3 "aC 4an$s4a!e | | | -BS6ND ---------Data----------------B '6,6.76 A| | | | |D'6,6.76 A--------Data---------------- S6ND DDDD| | | ,;)S6 S),163 -----Noti*icare 6)( -----B '6,6.76 | ,;)S6 S),163 9 36N3.6< se inc4i$e soc!etu# acti+< creat cu ,,6P3< nu ce# creat initia# - 5e care se ascu#ta cone@iuni:

$P%
socket!" Pentru obinerea de criptorului de .i1ier e .olo e1te9 ca i in ca2ul :;P .unctia+
Einc#u$e AsCs=tC5esF4B Einc#u$e AsCs=soc!etF4B int soc!et9int $omain< int tC5e< int 5rotoco#:?

Campurile domain i protocol au acelea i valori ca i in ca2ul :P; ("4A#N)T / P4A#N)T9 re pectiv <)). ,n ca2ul TCP9 pentru campul t>pe e utili2ea20 valoarea SOCBAST3)"C. ;i.erenta notabila intre TCP i :;P e te in modul de utili2are al de criptorului intor de oc$et()9 pentru un erver. #n ca2ul :;P9 ace t oc$et e te activ (a a cum e te creat b> de.ault) 6 e .ac trimiteri i receptionari de date pe el. #n ca2ul TCP9 ace t oc$et va .i .olo it numai in mod pa iv9 pentru tabilirea cone*iunii9 nu e vor trimite au receptiona date ale aplicatiei prin intermediul au. Da e*i ta un alt oc$et (di.erit pentru .iecare client) 6 care va .i .olo it pentru tran mi ia de date.

bind!" Odata ce am obinut un oc$et9 trebuie 0 /i a ociem un port pe ma1ina local0 (ace t lucru e te u2ual /n ca2ul /n care e dore1te a1teptarea de cone*iuni pe un anumit port). :tili2are ae te identica cu ca2ul :;P.
Einc#u$e AsCs=tC5esF4B Einc#u$e AsCs=soc!etF4B int bin$9int soc!*$< struct soc!a$$r GmCDa$$r< int a$$r#en:?

connect!"
Einc#u$e AsCs=tC5esF4B Einc#u$e AsCs=soc!etF4B int connect9int soc!*$< struct soc!a$$r Gser+Da$$r< int a$$r#en:?

"r-umentul sockfd e te un de criptor de .i1ier obinut /n urma apelului socket()9 serv_addr conine portul 1i adre a #P a de tinaiei9 iar addrlen poate .i etat la sizeof(sockaddr). Ca 1i /n ca2ul celorlate .uncii re2ultatul e te 61 /n ca2 de eroare9 iar /n ca2 de ucce <. listen!" Comunicaia prin cone*iune tabil0 e te a imetric0. Ei anume unul din cele dou0 proce e implicate 8oac0 rol de server iar cel0lalt 8oaca rol de client. Cu alte cuvinte erver6ul trebuie 061i a ocie2e oc$et6ului propriu o adre 0 pe care oricare client trebuie 0 o cunoa c09 1i apoi 0 Fa culteF pe acel oc$et cererile ce provin de la clieni. Cai mult decat atGt9 /n timp ce erverul e te ocupat cu tratarea unei cereri9 e*i t0 po ibilitatea de a /ntGr2ia cererile ce provin de la ali clieni /ntr6o coad0 de a1teptare. Hun-imea ace tei co2i trebuie peci.icat0 prin apelul listen()+
int #isten9int soc!*$< int #en:?

"r-umentul sockfd e te un de criptor de .i1ier obinut /n urma apelului socket()9 iar len repre2int0 numarul de

cone*iuni acceptate /n coada de a1teptare. Cone*iunile care e .ac vor a1tepta /n acea ta coad0 pGn0 cGnd e .ace accept() 1i nu pot .i mai mult de len cone*iuni /n a1teptare. "pelul listen() /ntoarce < /n ca2 de ucce 1i 61 /n ca2 de eroare. accept!" Ce e /ntGmpl0 /n momentul /n care altcineva /ncearc0 0 .ac0 connect() pe o ma1ina 1i un port pe care 6a .acut li ten(). Cone*iunea va .i pu 0 /n coada de a1teptare pGn0 /n momentul /n care e .ace un apel de accept(). "ce t apel /ntoarce un nou oc$et care va .i .olo it pentru acea ta cone*iune.
Einc#u$e AsCs=soc!etF4B int acce5t9int soc!*$< struct soc!a$$r Gc#iDa$$r< int Ga$$r#en:?

"r-umentul sockfd repre2int0 oc$etul care a .0cut listen() (deci cel intor de oc$et()). "ccept intoarce un nou oc$et9 care va .i .olo it pentru operatii end/recv. cli_addr repre2int0 un pointer pre o tructur0 de tip struct sockaddr_in /n care e va a.la in.ormaia de pre cone*iunea .0cuta (ce ma1in0 de pe ce port a iniiat cone*iunea). Noul oc$et obinut prin apelul accept() va .i .olo it /n continuare pentru operaiile de citire 1i criere.

send!" # recv !" "ce te dou0 .uncii e .olo e c pentru a tran mite date prin oc$ei de tip tream au oc$ei data-rama conectai. Sinta*a pentru trimitere 1i primire e te a em0n0toare.
int sen$9int soc!*$< const +oi$ Gms%< int #en< int *#a%s:?

"r-umentul oc$.d e te oc$etul caruia e dore te a e trimita date (.ie e te returnat de apelul oc$et() .ie e te returnat de apelul accept()). "r-umentul m - e te un pointer catre adre a de memorie unde e -a e c datele ce e dore c a .i trimi e9 iar ar-umentul len repre2inta numarul de octeti din memorie incepand de la adre a re pectiva ce e vor trimite. 4unctia end() intoarce numarul de octeti e.ectiv trimi i (ace ta poate .i mai mic decat numarul care 6a preci2at ca e dore te a .i trimi I). #n ca2 de eroare e intoarce 619 etandu6 e core pun2ator errno.
int rec+9int soc!*$< +oi$ Gbu*< int #en< unsi%ne$ int *#a%s:?

"r-umentul oc$.d repre2inta oc$etul de unde e cite c datele9 ar-umentul bu. repre2inta un pointer catre o adre a din memorie unde e vor crie octetii cititi iar ar-umentul len repre2inta numarul ma*im de octeti ce e vor citi. 4unctia recv() intoarce numarul de octeti e.ectiv cititi in bu.9 au 61 in ca2 de eroare. Ob ervatii+ recv() poate intoarce i <. "ce t lucru in eamna ca cealalta parte a inchi cone*iunea. pentru crierea/citirea in/din oc$eti TCP9 e pot .olo i cu ucce i .unctiile &rite!" i read!" (.oarte a emanatoare cu end() i recv()9 mai putin campul .la- 9 pe care oricm il etam pe <) close!" Pentru a /nchide un oc$et TCP9 e .olo eJte .uncKia de /nchidere a unui de criptor de .iJier din :ni*+
Einc#u$e Aunist$F4B int c#ose9int *$:?

"tentie9 in ca2ul TCP avem de6a .ace cu mai multi oc$eti 6 unul intor de oc$et() (.olo it pentru tabilire cone*iuni cu clientii) i unul au mai multi oc$eti intor i de accept (cate unul pentru .iecare client conectat) 6 .olo it pentru end/receive cu re pectivul client. ;aca clientul a ie it (recv() intoarce <)9 vrem a inchidem oc$etul core pun2ator creati cu accept9 nu pe cel creat cu oc$et().

'(ercitii)
#n ace t laborator lucrati individual7 codul erverului di.era de tul de mult de cel al clientului9 deci .iecare tudent va crie atat pro-ramul erver9 cat i pro-ramul client. 1. Scrieti un erver i un client TCP in care erverul e va comporta ca ecoul clientului. #ntr6o bucla9 clientul cite te un trin- de la ta tatura9 il trimite erverului9 a teapta ra pun de la erver i il a.i ea2a. Serverul trimite inapoi clientului9 acela i lucru pe care il prime te de la el. "tat erverul9 cat i clientul9 prime c ca ar-umente adre a erverului i portul erverului. 2. Completati codul erverului de mai u a t.el incat a .unctione2e cu 2 clienti (ambele apeluri de accept trebuie .acute inainte de primul end/recv). Serverul va intermedia un .el de chat intre cei doi clienti7 va primi ceva de la un client i va trimite celuilalt i reciproc. Trebuie atentie la ordinea operatiilor ( criere/citire de pe oc$et) atunci cand rulati clientii. (#n laboratorul viitor vom .olo i in erver un mecani m de multiple*are9 care va elimina ace t inconvenient 6 clientii nu vor mai trebui a crie/citea ca de pe oc$et intr6o anumita ordine)