ελληνικο ανοικτο πανεπιστημιο

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
4η Γραπτή Εργασία ΠΛΗ 23
Ακαδημαϊκό Έτος 2012 - 2013
( Τόμος Β’, Κεφάλαια 4 – 8 και Τόμος Γ’ )
Ημερομηνία Παράδοσης 08.05.2013
ΕΝΔΕΙΚΤΙΚΕΣ ΑΠΑΝΤΗΣΕΙΣ
Άσκηση 1
Επέκταση συστήματος διαχείρισης φιλοδωρημάτων καφετέριας με
χρήση XML/XSL
Στην Άσκηση αυτή ζητείται να προσθέσετε κάποιες λειτουργίες στο σύστημα που αναπτύχθηκε
στα πλαίσια της 3ης Εργασίας. Μπορείτε να χρησιμοποιήσετε είτε το σύστημα που αναπτύξατε
εσείς, είτε το σύστημα των υποδειγματικών απαντήσεων.
Υποθέστε ότι ένας χρήστης θέλει να εξάγει, για ένα συγκεκριμένο αριθμό ημερών, το σύνολο των
φιλοδωρημάτων με τις λεπτομέρειές τους (ποσό, ημερομηνία-ώρα, όνομα και επώνυμο
σερβιτόρου), ώστε να επεξεργαστεί τα δεδομένα αυτά με κάποιο πρόγραμμα λογιστικών
φύλλων. Η εξαγωγή θα γίνεται με χρήση XML αρχείων που περιέχουν κατάλληλα δομημένα τα
δεδομένα αυτά. Για το σκοπό αυτό θα πρέπει:
(a) (Ερώτηση 1) Να περιγράψετε τη δομή του XML αρχείου, ορίζοντας το κατάλληλο σχήμα με
χρήση DTD. Επίσης, να παρουσιάσετε ένα παράδειγμα ενός σωστά δομημένου και έγκυρου
XML αρχείου.
(b) (Ερώτηση 2) Στην αρχική σελίδα της εφαρμογής φιλοδωρημάτων, θα πρέπει να προστεθεί μία
επιλογή με την οποία θα εμφανίζεται, για μία χρονική περίοδο που θα ορίζει ο χρήστης, το
XML αρχείο σε νέο παράθυρο (θα δημιουργείται δυναμικά) μορφοποιημένο κατάλληλα με
XSL. Η λίστα των φιλοδωρημάτων θα περιλαμβάνει το όνομα και επώνυμο του σερβιτόρου, το
ποσό και την ημερομηνία ώρα. Τα φιλοδωρήματα να εμφανίζονται από το πιο πρόσφατο στο
πιο παλιό. Ακόμη, στο τέλος του αρχείου θα πρέπει να εμφανίζεται ο ημερήσιος μέσος όρος
των φιλοδωρημάτων (για την επιλεγμένη περίοδο) στο παραγόμενο XML. Ο υπολογισμός του
μέσου όρου προτείνεται να γίνει server side, από την PHP.
(c) (Ερώτηση 3) Πριν την εμφάνιση των XML αρχείων με τη χρήση XSL, θα πρέπει να προστεθεί
έλεγχος του παραγόμενου XML με βάση το DTD του (a). Σε περίπτωση λάθους, θα πρέπει να
εμφανίζεται αντίστοιχο μήνυμα στο χρήστη. Τέλος, στην κορυφή της τροποποιημένης σελίδας
(b) θα πρέπει να εμφανίζεται ο συνολικός αριθμός των φιλοδωρημάτων που εμφανίζονται
στο XML. Η λειτουργία αυτή θα πρέπει να υλοποιηθεί είτε με συνάρτηση της XSL, είτε με
χρήση DOM.
Για την ανάγνωση ενός XML αρχείου,
(http://gr.php.net/manual/en/refs.xml.php).
η
PHP
προσφέρει
διάφορες

DOMDocument (http://gr.php.net/manual/en/class.domdocument.php).

SimpleXML (http://gr.php.net/manual/en/book.simplexml.php).
1
βιβλιοθήκες
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Η βιβλιοθήκη DOM δίνει τη δυνατότητα ελέγχου του XML αρχείου με βάση το DTD για την
εγκυρότητα ή όχι της δομής:
http://php.net/manual/en/domdocument.validate.php
Επίσης, για έλεγχο της εγκυρότητας του XML με βάση το DTD στην SimpleXML, δείτε εδώ:
http://www.phpbuilder.com/columns/adam_delves20060719.php3
Εναλλακτικά, ο έλεγχος μπορεί να γίνει με JavaScript όπως περιγράφεται εδώ :
http://www.w3schools.com/dtd/dtd_validation.asp
Οι βιβλιοθήκες DOMDocument και SimpleXML της PHP, υποστηρίζουν Ελληνικούς χαρακτήρες με
χρήση της κωδικοποίησης UTF-8. Αν χρησιμοποιείτε διαφορετική κωδικοποίηση, χρήσιμη θα σας
φανεί η συνάρτηση iconv().
Παραδοτέα:

Ο DTD ορισμός της δομής και τουλάχιστον ένα XML αρχείο που θα λειτουργεί σωστά με
την εφαρμογή σας (a).

Ο HTML/PHP κώδικας της εφαρμογής που υλοποιεί τα (b) και (c).

Τα XSL αρχεία (b), (c).

Screenshots από τη λειτουργία της εφαρμογής.
Στόχος:
Η κατανόηση και η πρακτική εφαρμογή των τεχνικών προγραμματισμού εφαρμογών παγκόσμιου ιστού με
χρήση XML, DTD, DOM, XSL.
Απαραίτητες γνώσεις:
Για την καλύτερη κατανόηση των εννοιών και των προγραμματιστικών τεχνικών, είναι χρήσιμη η
παρακολούθηση των παρουσιάσεων web casts No 8 – 11, καθώς και η μελέτη του «UNIT23 - Book2 - HT2»
και του νέου ΕΔΥ με hypertext υλικό για «Μετασχηματισμό XML αρχείων με χρήση XSL, μέσω PHP» από το
2ο CD του ΕΔΥ. Επίσης, βοηθητική είναι και η χρήση των σχετικών χρήσιμων δικτυακών τόπων από τη
σελίδα της Θ.Ε.
2
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΠΑΝΤΗΣΕΙΣ ΑΣΚΗΣΗΣ 1
(a) Ερώτηση 1.
Το DTD αρχείο είναι το εξής:
<!DOCTYPE tips [
<!ELEMENT tips (tip*)>
<!ELEMENT tip (f_name, l_name, amount, date)>
<!ELEMENT f_name (#PCDATA)>
<!ELEMENT l_name (#PCDATA)>
<!ELEMENT amount(#PCDATA)>
<!ELEMENT date (#PCDATA)>
]>
Το παραπάνω DTD δηλώνει ότι το root element θα είναι το tips, το οποίο μπορεί να έχει κανένα,
ένα ή περισσότερα παιδιά, συγκεκριμένα το element tip. Δηλαδή, θεωρούμε ένα σύνολο
φιλοδωρημάτων που έχει καθένα φιλοδώρημα ξεχωριστά. Εν συνεχεία, δηλώνεται ότι το κάθε
element tip θα έχει παιδιά τα εξής elements: f_name, l_name, amount, date. Το κάθε ένα από
αυτά τα elements θα είναι της μορφής περιεχομένου (#PCDATA).
Το XML αρχείο που θα χρησιμοποιήσουμε, έχει την παρακάτω δομή:
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<tips>
-<tip>
<f_name/>
<l_name/>
<amount/>
<date/>
</tip>
</tips>
(b) Ερώτηση 2
Στη σελίδα της εφαρμογής όταν εισάγεται ο χρήστης και στη σελίδα όπου παρουσιάζεται η λίστα
με τα φιλοδωρήματα, έχει προστεθεί μία φόρμα στην οποία ο χρήστης μπορεί να εισάγει το
χρονικό διάστημα για το οποίο θέλει να εμφανίσει τα φιλοδωρήματα και ένα button που
αναγράφει XML και μόλις το πατά ο χρήστης εμφανίζεται σε νέο παράθυρο το XML αρχείο
μορφοποιημένο με XSL. Στη λίστα εμφανίζονται τα φιλοδωρήματα με το ονοματεπώνυμο αυτού
που τα καταχώρησε και την ημερομηνία που έγινε η καταχώρηση.
Το button για την XML το εμφανίζουμε στο αρχείο view_tip.php:
3
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
<img src='images/xml.jpg' alt='XML' title='XML' style='padding:0;margin:0;float:center;'
onclick='checkentryform();' onmouseover='this.style.cursor="pointer"'/>
Ο κώδικας για όλη τη φόρμα είναι ο εξής:
<form name="date_tip" method="post" action="xml_tips.php" enctype="multipart/form-data">
<table align= 'center' border="0" cellspacing="1" style="border-collapse: collapse;
color:#000000" bordercolor="#111111" width="60%">
<tr>
<th colspan='5'><h3> Επιλέξτε χρονικό διάστημα </h3><br></th> </tr>
<tr>
<th colspan='5'> Παρακαλώ εισάγετε την ημερομηνία στη μορφή "2013-0422"<br></th> </tr>
<tr>
<td align='center'>Από</td>
<td><?php echo"<input type='date' name='date_f' >"; ?></td>
<td></td>
<td align='center'>Μέχρι</td>
<td><?php echo"<input type='date' name='date_l' >"; ?> </td>
</tr>
<tr>
<td align='center' colspan='5'><br>
<img
src='images/xml.jpg'
alt='XML'
title='XML'
style='padding:0;margin:0;float:center;'
onclick='checkentryform();' onmouseover='this.style.cursor="pointer"'/>
</td>
</tr>
</table>
</form>
Εικόνα 1. Φόρμα συμπλήρωσης για εμφάνιση XML
Για την checkentry() ο κώδικας είναι ο εξής:
4
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
<script>
function checkentryform() {
var cForm = document.forms.date_tip;
var errstr = '';
//alert(cForm.date_l.value);
// Ημερομηνία: Έλεγχος για να μην είναι κενό το πεδίο
if ( cForm.date_f.value==''){
errstr = errstr+'Το πεδίο Aπό δεν μπορεί να είναι κενό.\n';
cForm.date_f.style.backgroundColor="#ff6347";
}
if ( cForm.date_l.value==''){
errstr = errstr+'Το πεδίο Μέχρι δεν μπορεί να είναι κενό.\n';
cForm.date_l.style.backgroundColor="#ff6347";
}
var loc=13;
var
str="./logged_in.php?menu="+loc+"&p1="+cForm.date_f.value+"&p2="+cForm.date_l.value;
window.open(str); // για να ανοίξει σε νέο παράθυρο
//document.forms.date_tip.submit();
}
</script>
Έτσι, όταν πατάμε το κουμπί, εμφανίζεται ένα νέο παράθυρο με τα φιλοδωρήματα, με τη μορφή
που έχει δοθεί από το παρακάτω XSL αρχείο:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method = "html"></xsl:output>
<xsl:template match="/" >
<p align="center"><b>Φιλοδωρήματα</b></p>
<xsl:if test="count(/tips/tip) &gt; 0">
<TABLE border="0" cellpadding="2" cellspacing="2" align="center">
<TR><TD align="center" bgcolor="#CCFFFF"><b>Όνομα</b></TD>
<TD align="center" bgcolor="#CCFFFF"><b>Επώνυμο</b></TD>
<TD align="center" bgcolor="#CCFFFF"><b>Ποσό</b></TD>
<TD align="center" bgcolor="#CCFFFF"><b>Ημερομηνία</b></TD></TR>
<xsl:for-each select="tips/tip">
<TR><TD valign="top" bgcolor="#CCFFFF"><xsl:value-of select="f_name" /></TD>
<TD valign="top" bgcolor="#CCFFFF"><xsl:value-of select="l_name" /></TD>
<TD valign="top" bgcolor="#CCFFFF"><xsl:value-of select="amount" /></TD>
<TD valign="top" bgcolor="#CCFFFF"><xsl:value-of select="date" /></TD></TR>
</xsl:for-each>
5
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
</TABLE>
<br/>
<p
align="center"><font
color="red"><b><xsl:value-of
φιλοδωρήματα συνολικά</b></font></p>
</xsl:if>
select="count(/tips/tip)"/>
</xsl:template>
</xsl:stylesheet>
Αφού πατηθεί το κουμπί XML, ελέγχουμε αν ο χρήστης έχει εισάγει χρονικό διάστημα για την
εμφάνιση των φιλοδωρημάτων μέσω XML. Το αρχείο tips_xsl.xsl δηλώνει ότι τα φιλοδωρήματα
θα εμφανίζονται σε έναν πίνακα όπου κάθε στήλη θα αντιστοιχεί στο όνομα του σερβιτόρου, στο
ποσό του φιλοδωρήματος και στην ημερομηνία που καταχωρήθηκε. Αυτό θα γίνεται για όλα τα
φιλοδωρήματα που υπάρχουν στο χρονικό διάστημα που δηλώθηκε, γι’ αυτό χρησιμοποιείται η
for-each. Τέλος, έχει προστεθεί ένας μετρητής count(/tips/tip) ο οποίος μετράει πόσες φορές θα
εμφανιστεί το element reminder στο XML, δηλαδή, όσα φιλοδωρήματα θα υπάρχουν γι’ αυτό το
χρονικό διάστημα (Ερώτημα 3).
Πατώντας το κουμπί «XML», εμφανίζεται η παρακάτω εικόνα (Εικόνα 2) σε νέο παράθυρο:
6
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Εικόνα 2. Εμφάνιση XML
Για να εμφανίσουμε τα φιλοδωρήματα για το χρονικό διάστημα που έχουμε επιλέξει, θέτουμε τις
ημερομηνίες του χρονικού διαστήματος ως παράμετρο στο URL και παίρνουμε με $_GET τις
ημερομηνίες από το URL:
$d1= $_GET['p1'];
$d2= $_GET['p2'];
7
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Στη συνέχεια δημιουργούμε ένα query:
$query_tip = "SELECT t1.id_tip, t1.amount, t1.date_time, t1.kod_user, t2.kod_user, t2.f_name,
t2.l_name from tip as t1 INNER JOIN user as t2 on t1.kod_user=t2.kod_user WHERE
date_time>='$d1' AND date_time<='$d2 23:59:59' ORDER BY date_time DESC";
Για να εμφανίσουμε τον ημερήσιο μέσο όρο των φιλοδωρημάτων, αρκεί να δημιουργήσουμε το
εξής query:
$query_avg = "SELECT * , count( * ) , sum( amount ) , avg( amount ) FROM tip WHERE
date_time>='$d1' AND date_time<='$d2 23:59:59' GROUP BY DATE_FORMAT( date_time, '%d')";
Για να δημιουργήσουμε το συνολικό ημερήσιο μέσο όρο, θα αθροίσουμε τους μέσους όρους που
θα έχουν προκύψει από το παραπάνω query και θα τους διαιρέσουμε με τον αριθμό των ημερών
που έχουν γίνει καταχωρήσεις μέσα στο ζητούμενο χρονικό διάστημα.
Έτσι ο κώδικας θα είναι ως εξής:
$avg_t += $avg;
$mo= $avg_t/$j;
$hmo = number_format($mo, 2); // για να κρατήσουμε μέχρι 2 δεκαδικά ψηφία
( c ) Ερώτηση 3
Εν συνεχεία, δημιουργούμε το αρχείο xml_tips.php όπου χτίζουμε αρχικά το XML μας με βάση το
DTD.
Η υλοποίηση ελέγχου επικύρωσης της δομής του αρχείου που εμφανίζεται – σύμφωνα με το DTD
που έχουμε ορίσει στο πρώτο ερώτημα – γίνεται με τον παρακάτω κώδικα:
if ($create_xml)
{
$xsl_filename = "tips_xsl.xsl";
$doc = new DOMDocument();
$xsl = new XSLTProcessor();
$doc->load($xsl_filename);
$xsl->importStyleSheet($doc);
$doc->loadXML($create_xml);
if(!$doc->validate()){
echo "<p>Το αρχείο δεν είναι έγκυρο σύμφωνα με το DTD<p>";
8
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
}
else
{
$tip = $doc->getElementsByTagName('tip'); //Το $tip είναι ένα DOMNodeList
echo $xsl->transformToXML($doc);
}
}
Δημιουργούμε ένα νέο αντικείμενο της κλάσης Dom Document ($doc = new DOMDocument();)
και κάνουμε validate ((!$doc->validate()). Αν δεν είναι σωστό, τότε εμφανίζεται μήνυμα λάθους
στο χρήστη για τη μορφή του DTD. Επίσης, στον κώδικα χρησιμοποιούμε τη συνάρτηση
getElementsByTagName η οποία επιστρέφει μια λίστα των στοιχείων tips που υπάρχουν στο
αρχείο που δημιουργήθηκε.
9
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Άσκηση 2
Απόδοση του πρωτοκόλλου HTTP και Caching
Εισαγωγή
Σκοπός της παρούσας άσκησης, είναι η μέτρηση της απόδοσης του πρωτοκόλλου HTTP αλλά και
των διαδικασιών caching που πραγματοποιούν οι browsers που χρησιμοποιούμε καθημερινά.
Ερώτηση 1
Για την εκτέλεση της Ερώτησης 1 θα πρέπει να χρησιμοποιήσετε το εργαλείο Wireshark, το οποίο
είναι δωρεάν διαθέσιμο στο http://www.wireshark.org/download.html για λειτουργικά
συστήματα Windows/Linux/Mac. To Wireshark είναι ένα εργαλείο το οποίο “συλλαμβάνει” και
εμφανίζει την κίνηση του δικτύου στον υπολογιστή σας. Για τη χρήση του εργαλείου Wireshark θα
πρέπει να επιλέξετε την κατάλληλη διεπαφή που χρησιμοποιείται για την πρόσβασή σας από τη
διαθέσιμη λίστα του εργαλείου, όπως εμφανίζεται στην παρακάτω εικόνα:
Επίσης, για τους σκοπούς της παρούσας ερώτησης, στο πεδίο του φίλτρου “σύλληψης” το οποίο
εμφανίζεται στην παρακάτω εικόνα
θα πρέπει να συμπληρώσετε την IP διεύθυνση του διακομιστή που σας ζητείται στα παρακάτω
ερωτήματα στο πεδίο ip.addr, καθώς και το όρισμα http (ακριβώς όπως παρουσιάζεται στην
εικόνα παραπάνω), ώστε το Wireshark να καταγράφει μόνο κίνηση που αφορά το διακομιστή της
άσκησης, καθώς και το πρωτόκολλο HTTP. Εκκινήστε το εργαλείο Wireshark, εκκινήστε τη
“σύλληψη” κίνησης στη διεπαφή (interface) του δικτύου σας και ρυθμίστε το φίλτρο να εμφανίζει
μόνο την HTTP κίνηση από και προς το διακομιστή με διεύθυνση 150.140.8.26 (όπως
περιγράφηκε παραπάνω).
- Σε περίπτωση που είστε σε περιβάλλον Linux, χρησιμοποιείστε τον telnet client όπως στην 3η
Γραπτή Εργασία για την αποστολή http εντολών, όπως αυτές περιγράφονται παρακάτω.
- Σε περίπτωση που είστε σε περιβάλλον Windows, θα χρησιμοποιήσετε το εργαλείο PuTTY.
Κατεβάστε το εργαλείο PuTTY από εδώ: http://www.putty.org/ . Στη ρύθμιση Connection > Telnet
επιλέξτε Passive για Telnet negotiation mode. Στην επιλογή Window, πληκτρολογήστε ένα μεγάλο
αριθμό (π.χ. 1000) στο Lines of scrollback. Στη σελίδα Session, επιλέξτε Telnet για Connection type.
10
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Πληκτρολογήστε για hostname ru6.cti.gr και 80 στο πεδίο port. Επιλέξτε Never για Close window
on exit. (Καλό είναι σε αυτό το σημείο να σώσετε τις ρυθμίσεις αυτές ώστε να μην κάνετε την ίδια
διαδικασία κάθε φορά. Απλά δώστε κάποιο όνομα στο πεδίο Saved sessions, και πατήστε save.
Πλέον μπορείτε να φορτώσετε τις ρυθμίσεις επιλέγοντας το όνομα που δώσατε, και πατώντας
Load.) Τέλος, πατήστε Open.
α)
Στο παράθυρο του telnet client που χρησιμοποιείτε (telnet ή putty) γράψτε το παρακάτω
και πατήστε enter δύο φορές:
GET /eap/image.jpg HTTP/1.1
host: www.ru6.cti.gr
Cache-Control: no-cache
Παρατηρήστε την κίνηση που καταγράφει το Wireshark. Στη συνέχεια επαναλάβετε τα παραπάνω
αλλά με την αντικατάσταση του header Cache-Control με το If-Modified-Since, όπως φαίνεται
παρακάτω. Δηλαδή, δώστε:
GET /eap/image.jpg HTTP/1.1
host: www.ru6.cti.gr
If-Modified-Since: Sun, 12 Mar 2012 13:34:54 GMT
Και στη συνέχεια επαναλάβετε με το παρακάτω αίτημα:
GET /eap/image.jpg HTTP/1.1
host: www.ru6.cti.gr
If-Modified-Since: Sun, 12 Mar 2005 13:34:54 GMT
Παρατηρήστε την καταγραφή του Wireshark. Καταγράψτε και συγκρίνετε τους χρόνους
ολοκλήρωσης των αιτημάτων που εκτελέσατε. Παραθέστε χαρακτηριστικά screenshots από το
Wireshark και εξηγείστε που οφείλονται οι διαφορές που παρατηρείτε.
β) Στη συνέχεια επισκεφθείτε από το φυλλομετρητή σας τη σελίδα http://ru6.cti.gr/ru6/.
Εκτελέστε hard refresh (Ctrl + F5) και καταγράψτε με τη βοήθεια του Wireshark το χρόνο
ολοκλήρωσης του αιτήματος. Κάντε το ίδιο εκτελώντας απλή ανανέωση της σελίδας (F5).
Παραθέστε χαρακτηριστικά screenshots από το Wireshark και εξηγείστε που οφείλονται οι
διαφορές που παρατηρείτε.
ΠΡΟΣΟΧΗ: Για την εκτέλεση των ερωτήσεων, θα πρέπει να βεβαιωθείτε πως η λειτουργία του
caching στο φυλλομετρητή σας δεν είναι απενεργοποιημένη.
Ερώτηση 2
α) Περιγράψτε τι είναι και πώς χρησιμοποιείται το πεδίο επικεφαλίδας ETag του πρωτοκόλλου
HTTP.
β) Περιγράψτε τι είναι και πώς χρησιμοποιείται το πεδίο επικεφαλίδας Expires του πρωτοκόλλου
HTTP.
11
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Ερώτηση 3
Υποθέστε ότι προσπελαύνετε καθημερινά την ίδια σελίδα από τον υπολογιστή σας. Έχετε
παρατηρήσει ότι στις τελευταίες 60 φορές που αναζητήσατε τη σελίδα, 15 φορές χρειάστηκαν
από περίπου 0,5 sec για να «κατεβεί», 12 φορές χρειάστηκαν από περίπου 1,5 sec, 9 φορές
χρειάστηκαν από περίπου 3,5 sec, και τέλος, τις υπόλοιπες φορές, η σελίδα έκανε χρόνο περίπου
5 sec για να «κατεβεί». Γνωρίζετε ότι η σελίδα μπορεί να βρεθεί είτε στον υπολογιστή σας, είτε
στον υπολογιστή του τοπικού δικτύου που ανήκετε, είτε στη μνήμη cache που χρησιμοποιεί ο ISP
με τον οποίο συνδέεστε στο Internet, είτε τέλος από τον web server της σελίδας.
Αν γνωρίζετε ότι α) το πλήθος των μεταβάσεων με επιστροφή που χρειάζονται για να «κατεβεί» η
σελίδα είναι Ν = 30, β) το RTT από το PC σας ως την cache του υπολογιστή τοπικού δικτύου έχει
μετρηθεί 20 msec και γ) το μέγεθος της σελίδας είναι 200Kbytes, τότε σας ζητούνται τα
παρακάτω:
α) Ποια είναι η πιθανότητα η σελίδα που ζητήσατε να βρίσκεται:
(i) στο PC σας;
(ii) στον ενδιάμεσο υπολογιστή του τοπικού σας δικτύου;
(iii) στην cache του ISP;
(iv) στον web server;
β) Πώς μεταβάλλονται οι παραπάνω πιθανότητες σε περίπτωση που για ένα διάστημα η cache
του ISP ήταν εκτός λειτουργίας λόγω αναβάθμισης;
γ) Ποιο είναι το ελάχιστο bandwidth (δηλαδή το bottleneck) της σύνδεσης από το PC σας ως την
cache του υπολογιστή τοπικού δικτύου;
δ) Θεωρώντας ότι το bandwidth που βρήκατε στο (γ) είναι το ελάχιστο σε όλη τη διαδρομή από το
PC σας ως τον Web Server, ποιο είναι το RTT από το PC σας ως τον Web Server;
(Παρατήρηση: τηρήστε ακρίβεια 2 δεκαδικών στις πράξεις.)
Στόχος:
Βασικός στόχος της συγκεκριμένης άσκησης είναι η μέτρηση της απόδοσης του πρωτοκόλλου Internet HTTP, η
κατανόηση της διαδικασίας caching, αλλά και η κατανόηση στοιχείων που έχουν να κάνουν με διάφορους τρόπους
αποθήκευσης δεδομένων από τους φυλλομετρητές.
Απαραίτητες γνώσεις:
Για την καλύτερη κατανόηση των εννοιών, είναι χρήσιμη η μελέτη των Κεφαλαίων 5 και 6 του Τόμου Β’ και η
αξιοποίηση των σχετικών Παράλληλων Κειμένων και των Χρήσιμων Δικτυακών Τόπων από τη σελίδα της Θ.Ε.
12
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΠΑΝΤΗΣΕΙΣ ΑΣΚΗΣΗΣ 2
Ερώτηση 1
α) Αν τα κάνατε όλα σωστά, τότε το wireshark θα καταγράψει την παρακάτω κίνηση:
Η κίνηση του κάθε αιτήματος καταλαμβάνει δύο γραμμές. Η πρώτη αφορά το αίτημα και η
δεύτερη την απάντηση. Αν μετρήσουμε τους χρόνους ολοκλήρωσης του κάθε αιτήματος,
βρίσκουμε πως για το πρώτο αίτημα χρειάστηκαν 56,0052 – 55,7665 = 0,2387 sec, για το δεύτερο
107,6283 – 107,6215 = 0,0068 sec, και για το τρίτο 125,8848 – 125,6851 = 0,1997 sec.
Όπως μπορούμε να παρατηρήσουμε από το παραπάνω στιγμιότυπο, οι διαφορές αφορούν το
αποτέλεσμα των αιτημάτων GET που αποστέλλονται στο διακομιστή. Συγκεκριμένα, ενώ κατά το
πρώτο αίτημα τo status code της απάντησης είναι 200 OK, που σημαίνει πως το περιεχόμενο του
αιτήματος GET ολοκληρώθηκε με επιτυχία (δλδ. έγινε λήψη του περιεχομένου της σελίδας που
ζητήθηκε), κατά το δεύτερο αίτημα το αποτέλεσμα του ίδιου αιτήματος GET είναι το status code
304 Not Modified, που σημαίνει πως το περιεχόμενο του αιτήματος GET δεν έχει τροποποιηθεί
από την τελευταία του προσπέλαση. Προφανώς, με την προϋπόθεση πως η cache του
φυλλομετρητή είναι ενεργή, ο διακομιστής αποκρίθηκε με το HTTP response 304 Not Modified
από την ημερομηνία που έθεσε το αίτημα, με αποτέλεσμα να φορτωθεί από την cache.
Η μεγάλη διαφορά στους χρόνους ολοκλήρωσης του ίδιου αιτήματος είναι απόρροια αυτής της
λειτουργίας caching, με τη φόρτωση από την cache να είναι αισθητά ταχύτερη από τη φόρτωση
από το διακομιστή. Στο τρίτο αίτημα, που η προϋπόθεση της μη τροποποίησης από την
ημερομηνία που ορίζει το αίτημα δεν καλύπτεται, η ζητούμενη εικόνα φορτώνεται πάλι από το
διακομιστή, με αποτέλεσμα να απαιτείται πάλι μεγαλύτερος χρόνος, παρόμοιος με του πρώτου
αιτήματος.
β) Κατά την πρώτη προσπέλαση της σελίδας http://ru6.cti.gr/ru6/ με hard refresh, το εργαλείο
Wireshark καταγράφει την παρακάτω κίνηση:
13
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Κατά την επόμενη προσπέλαση (refresh) της συγκεκριμένης σελίδας (με την προϋπόθεση πως το
caching του φυλλομετρητή είναι ενεργοποιημένο), το Wireshark καταγράφει την παρακάτω
κίνηση:
Όπως μπορούμε να παρατηρήσουμε από την καταγραφή του Wireshark, κατά την πρώτη
προσπέλαση της σελίδας απαιτήθηκε χρόνος περίπου ίσος με 0,118 sec (76,808 sec – 76,690 sec)
για την ολοκλήρωση του αιτήματος, ενώ για την ολοκλήρωση της δεύτερης προσπέλασης
(ανανέωση) απαιτήθηκε χρόνος περίπου ίσος με 0,075 sec (40,613 sec – 40,538 sec).
Προφανώς, με την προϋπόθεση πως η cache του φυλλομετρητή είναι ενεργή, κατά τη δεύτερη
προσπέλαση της ίδιας σελίδας βρέθηκε ένα έγκυρο περιεχόμενο αυτής στην cache, με
αποτέλεσμα ο διακομιστής να αποκρίνεται με το HTTP response 304 Not Modified και τον
συνολικό χρόνο της φόρτωσης να είναι αρκετά μικρότερος.
Ερώτηση 2
α) Το ETag (entity tag) είναι ένα αναγνωριστικό που αποδίδεται από τον web server σε κάθε πόρο
ενός URL. Στο πρωτόκολλο HTTP, το πεδίο επικεφαλίδας ETag στην απόκριση του web server
παρέχει την τρέχουσα τιμή του ETag του αιτούμενου πόρου.
Το ETag είναι ένας από τους μηχανισμούς του πρωτοκόλλου HTTP που χρησιμοποιείται για
επικύρωση της cache και για την πραγματοποίηση υπό όρους αιτημάτων από τους clients. Γενικά,
το ETag χρησιμοποιείται για τη σύγκριση εκδόσεων των αιτούμενων πόρων, καθώς εάν ένας
πόρος αλλάξει, θα του ανατεθεί ένα νέο ETag από τον web server. Δηλαδή, ένας client ο οποίος
διατηρεί μία ή περισσότερες εκδόσεις ενός πόρου, μπορεί να επιβεβαιώσει πως μία από αυτές
τις εκδόσεις είναι η τρέχουσα, στέλνοντας μία λίστα των ETag του πόρου αυτού στον web server,
ο οποίος με τη σειρά του μπορεί να πληροφορήσει τον client εάν η έκδοση του πόρου που
διατηρεί δεν έχει τροποποιηθεί με αποτέλεσμα να χρησιμοποιηθεί η έκδοση του πόρου αυτού
που βρίσκεται στην cache και να μη ληφθεί εκ νέου.
β) Το πεδίο επικεφαλίδας Expires είναι ένας άλλος μηχανισμός ελέγχου της cache που προσφέρει
το πρωτόκολλο HTTP. Το πεδίο Expires περιλαμβάνει την ημερομηνία και ώρα μετά την οποία η
απόκριση θεωρείται πως έχει “λήξει”.
14
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Έτσι, εάν είναι γνωστή η ημερομηνία “λήξης” ενός αιτούμενου πόρου και εφόσον η ημερομηνία
αυτή δεν έχει παρέλθει, μπορεί να χρησιμοποιηθεί η έκδοση του πόρου αυτού που βρίσκεται
στην cache, χωρίς να πρέπει να ληφθεί εκ νέου από τον web server. Βασική διαφορά του πεδίου
επικεφαλίδας Expires από το ETag είναι πως στην περίπτωση του Expires δεν χρειάζεται ο client
να επικοινωνήσει εκ νέου με τον web server για επικύρωση της cache όπως στην περίπτωση του
ETag ( όπου ο client πρέπει να επικοινωνήσει με τον web server για να γίνει ο έλεγχος του ETag)
γεγονός που καθιστά τη χρήση caching ακόμα πιο αποδοτική.
Ερώτηση 3
α) Ζητούνται τα hPC, hlan, hisp και hserv που είναι οι πιθανότητες να βρίσκεται η σελίδα στο PC του
χρήστη, στον ενδιάμεσο υπολογιστή, στην cache του ISP και στον web server αντίστοιχα.
Μας δίνονται δεδομένα από τα οποία μπορούμε να πάρουμε εύκολα τα PPC, Plan, Pisp, Pserv,
δηλαδή, στο ιεραρχικό σύστημα caching της άσκησης, τις πιθανότητες επιτυχούς ανεύρεσης της
σελίδας στο PC του χρήστη, στον ενδιάμεσο υπολογιστή του τοπικού δικτύου, στην μνήμη cache
του ISP και στον web server αντίστοιχα.
Από τους χρόνους που δίνονται μπορούμε να συμπεράνουμε πως υπάρχουν 4 περιπτώσεις
επιτυχούς ανεύρεσης της σελίδας, με χρόνους απόκρισης από περίπου 0,5 sec (15 φορές στις 60),
1,5 sec (12 φορές), 3,5 sec (9 φορές) και 5 sec (24 φορές που αντιστοιχούν στις υπόλοιπες
περιπτώσεις), που αντιστοιχούν στην ανεύρεση της σελίδας από το PC του χρήστη, τον ενδιάμεσο
υπολογιστή του LAN, την μνήμη cache του ISP και τον web server αντίστοιχα, αφού αναμένουμε
οι χρόνοι απόκρισης να είναι μεγαλύτεροι όσο πιο απομακρυσμένο είναι το σημείο ανεύρεσης
της σελίδας.
Συνεπώς: PPC = 15/60 = 0,25 Plan = 12/60 = 0,2 Pisp = 9/60 = 0,15
Προφανώς Pno = 0/60 = 0 (πιθανότητα να μη βρεθεί η σελίδα), αφού όλες οι αιτήσεις
ικανοποιούνται, οπότε:
Pno +PPC +Plan +Pisp + Pserv = 1 απ' όπου προκύπτει ότι:
Pserv = 24/60 = 0,4
Από τους τύπους που συνδέουν τα P με τα h στο ιεραρχικό σύστημα caching, ισχύει:
hPC  PPC  0, 25
Plan  hlan  (1  PPC )  0,2  hlan  (1  0,25)  hlan  0,27
Pisp  hisp  (1  Plan  Ppc )  0,15  hisp  (1  0,25  0,2)  hisp  0,27
Pserv  hserv  (1  Pisp  Plan  PPC )  0,4  hserv  (1  0,15  0,2  0,25)  hserv  1
Συνεπώς, οι ζητούμενες πιθανότητες είναι:
i)
hPC = 0,25 για το PC,
ii)
hlan = 0,27 για τον ενδιάμεσο υπολογιστή του τοπικού δικτύου
iii)
hisp = 0,27 για την μνήμη cache του ISP
iv)
hserv = 1 για τον web server
15
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
(β) Στην περίπτωση που η cache του ISP καταργηθεί, οι πιθανότητες επιτυχούς ανεύρεσης
της σελίδας μεταβάλλονται ως εξής:
PPC = 15/60 = 0,25 Plan = 12/60 = 0,2 Pisp = 0/60 = 0 και Pserv=33/60=0,55
καθώς είναι προφανές πως εάν σε κάποιο επίπεδο δεν πραγματοποιείται caching, οι πιθανότητες
επιτυχούς ανεύρεσης της σελίδας μεταφέρονται στα υψηλότερα επίπεδα της ιεραρχίας. Με τις
νέες πιθανότητες, βρίσκουμε πως:
hPC  PPC  0, 25
Plan  hlan  (1  PPC )  0,2  hlan  (1  0,25)  hlan  0,27
Pisp  hisp  (1  Plan  Ppc )  0  hisp  (1  0,25  0,2)  hisp  0
Pserv  hserv  (1  Pisp  Plan  PPC )  0,55  hserv  (1  0  0,2  0,25)  hserv  1
(γ) Ισχύει από τη σχέση (5.1) του Τόμου Β’:
Tr 
S
 N  RTT  PC  PS
Cmin
(*)
όπου:
 Tr είναι ο χρόνος απόκρισης και στην περίπτωσή μας ισούται με 1,5 sec για την απόκριση από
τη μνήμη cache του υπολογιστή τοπικού δικτύου στο PC [δίνεται]
 S είναι το συνολικό μέγεθος της σελίδας: 200 Kbytes [δίνεται]
 N είναι το πλήθος μεταβάσεων με επιστροφή: 30 [δίνεται]
 RTT είναι ο χρόνος μετάβασης με επιστροφή από το PC ως την cache του υπολογιστή τοπικού
δικτύου: 20 msec [δίνεται]
 PC + PS είναι ο συνολικός χρόνος επεξεργασίας: 0,5 sec όπως συνάγεται από το γεγονός ότι
είναι ο συνολικός χρόνος «κατεβάσματος» της σελίδας από το PC [δίνεται]
 Cmin είναι η μικρότερη χωρητικότητα συνδέσμου, η οποία είναι το ζητούμενο της άσκησης.
Η σχέση (*) δίνει:
1.5sec 
Cmin 
200 Kbytes
 30  20 103 sec 0.5sec 
Cmin
200 Kbytes 1638400 bit

 4096 kbps
0.4sec
0.4sec
Επομένως, το ελάχιστο bandwidth (bottleneck) της σύνδεσης από το PC ως την cache του ISP είναι
4096 kbps.
16
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
(δ) Από τη σχέση (*) και δεδομένου ότι στην περίπτωση αυτή Tr είναι ο χρόνος απόκρισης από το
web server στο PC, έχουμε:
Tr 
S
 N  RTT  PC  PS 
Cmin
5sec  0.4sec 30  RTT  0.5sec 
RTT  0.136sec  136m sec
Επομένως, το RTT από το PC ως τον Web Server είναι 136 msec.
17
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Κριτήρια αξιολόγησης
Άσκηση 1 (Σύνολο)
Ερώτηση 1
Ερώτηση 2
Ερώτηση 3
Άσκηση 2 (Σύνολο)
Ερώτηση 1
Ερώτηση 2
Ερώτηση 3
Σύνολο
70
15
30
25
30
10
5
15
100
Ο συνολικός βαθμός θα διαιρεθεί δια 10, ώστε να προκύψει ο τελικός βαθμός της εργασίας.
18