![]() |
|
|
Home
> Inginerie > Calculatoare
> Ghid retele >
Nivelul Transport > Exemplu: TCPStudiu de caz pentru nivelul transport pentru Internet: TCP şi UDPUDP: servciu de datagramă
Implementarea UDP: codul sursăImplementarea Linux a UDP partea de transmisie
/* udp_send called from above, as result of sendto system call */
static int udp_send(struct sock *sk, struct sockaddr_in *sin,
unsigned char *from, int len, int rt)
{
struct sk_buff *skb;
struct device *dev;
struct udphdr *uh;
unsigned char *buff;
unsigned long saddr;
int size, tmp;
int ttl;
/* Allocate an sk_buff copy of the packet. */
size = sk->prot->max_header + len;
skb = sock_alloc_send_skb(sk, size, 0, &tmp);
if (skb == NULL)
return tmp;
skb->sk = NULL; /*
to avoid changing sk->saddr */
skb->free = 1;
skb->localroute = sk->localroute|(rt&MSG_DONTROUTE);
/*Now build the IP and MAC header. */
buff = skb->data;
saddr = sk->saddr;
dev = NULL;
ttl = sk->ip_ttl;
tmp = sk->prot->build_header(skb,
saddr, sin->sin_addr.s_addr,
&dev, IPPROTO_UDP, sk->opt,
skb->mem_len,sk->ip_tos,ttl);
skb->sk=sk; /* So memory is freed correctly */
/*Unable to put a header on the packet. */
if (tmp < 0 )
{
sk->prot->wfree(sk, skb->
mem_addr, skb->mem_len);
return(tmp);
}
buff += tmp;
saddr = skb->saddr; /*dev->pa_addr;*/
skb->len = tmp + sizeof(struct udphdr) +
len; /* len + UDP + IP + MAC */
skb->dev = dev;
/*Fill in the UDP header. */
uh = (struct udphdr *) buff;
uh->len = htons(len + sizeof(struct udphdr));
uh->source = sk->dummy_th.source;
uh->dest = sin->sin_port;
buff = (unsigned char *) (uh + 1);
/*Copy the user data. */
memcpy_fromfs(buff, from, len);
/*Set up the UDP checksum. */
udp_send_check(uh, saddr, sin->sin_addr.s_addr,
skb->len - tmp, sk);
/* Send the datagram to the interface. */
udp_statistics.UdpOutDatagrams++;
sk->prot->queue_xmit(sk, dev, skb, 1);
return(len);
}
TCP: apel setare şi īnchidereLegătură pe trei căi pentru setarea conexiunii. Īnchiderea conexiunii:
TCP: transfer de dateOrientat pe flux (flux de byte fără limitări de mesaj) Verificarea sumei pe Internet ca īn UDP Cānd trebuie să se transmită īn TCP?
La destinatar:
TCP: retransmiterea rapidă cu recunoaştere cumulativăRetransmitere rapidă după recepţia a trei recunoaşteri (N) īn timp ce se aşteaptă pentru recunoaşterea (N+1)
Exemplu:
Formatul pachetului TCPDespre multe din cāmpurile de pachete am vorbit deja.
Cāmpuri despre care nu s-a vorbit:
Ferestre şi timere TCPEstimarea RTT se bazează pe īntārzierile măsurate ale recunoaşterii. Timere de retransmitere
Controlul traficului cu ajutorul ferestrei:
Controlul congestiei cu ajutorul ferestrei:
Aspecte terminal-terminal pentru ATMNivelul de adaptare ATM (ATM adaptation layer (AAL)) permite funcţionarea terminal-sistem īn reţelele ATM
AAL1:
AAL2: nefuncţional AAL3/4 şi AAL5
AAL5 Studiu de cazSeamănă mult cu UDP Va detecta erori dar nu le va retransmite Formatul pachetului:
Nivel transport: perspectivaCerinţele noilor aplicaţii impun noi mecanisme pentru nivelul de transport. Se caută alăturarea unui set specific de funcţionalităţi cu un protocol monolitic cum este TCP, pentru a permite protocoale flexibile īn cazul blocurilor de construcţie mai mici. Inter-reţele: cānd se traversează mai multe reţele, cel mai de jos nivel de serviciu este minimal. Este necesară funcţionalitatea nivelelor de transport bogate. |
| ||||||||||
|
|