Слайд 2Семиуровневая сетевая модель OSI
Слайд 4Уровень 1, физический
Физический уровень получает пакеты данных от вышележащего
канального уровня и преобразует их в оптические или электрические сигналы, соответствующие 0 и 1 бинарного потока. Эти сигналы посылаются через среду передачи на приемный узел.
IEEE 802.3 -- Ethernet
IEEE 802.5 -- Token ring
Слайд 5Уровень 2, канальный
Канальный уровень обеспечивает создание, передачу и прием кадров данных.
Этот уровень обслуживает запросы сетевого уровня и использует сервис физического уровня для приема и передачи пакетов.
Слайд 6Стандарты канального уровня
Ethernet
Token ring
FDDI
X.25
Frame relay
Слайд 7В сети ETHERNET циркулируют сетевые кадры переменного размера:
Слайд 8Что такое FDDI
Это стандарт передачи данных на расстояния до 200 км.
Среда – оптоволокно.
Топология – двойное кольцо (похоже на TokenRing). Данные по кольцам циркулируют в разных направлениях. Одно кольцо основное, другое запасное.
Слайд 9Что такое X.25
Протокол для построения глобальных сетей на основе телефонных линий
Протокол
содержит очень развитые средства коррекции ошибок.
Слайд 10Что такое Frame Relay
Это дальнейшее развитие идей X.25, но рассчитанное на
качественные линии связи.
Поэтому FR не содержит таких мощных средств коррекции ошибок (как X.25)
Отличительной особенностью FR является возможность организации виртуальных каналов.
Слайд 11Уровень 3, сетевой
На сетевом уровне происходит маршрутизация пакетов на основе преобразования
MAC-адресов в сетевые адреса.
Сетевой уровень обеспечивает также прозрачную передачу пакетов на транспортный уровень.
Слайд 12Источник: http://latysheva2007.narod.ru
Слайд 13Протоколы сетевого уровня
IP - протокол Internet
IPX - протокол межсетевого обмена
X.25 (частично реализован на уровне 2)
Слайд 14Уровень 4, транспортный
Транспортный уровень делит потоки информации на достаточно малые фрагменты
(пакеты) для передачи их на сетевой уровень.
Наиболее распространенные протоколы транспортного уровня включают:
TCP - протокол управления передачей
NCP - Netware Core Protocol
SPX - упорядоченный обмен пакетами
Слайд 15Уровень 5, сеансовый
Сеансовый уровень отвечает за организацию сеансов обмена данными между
оконечными машинами.
Слайд 16Уровень 6, уровень представления
Уровень представления отвечает за возможность диалога между приложениями
на разных машинах. Этот уровень обеспечивает преобразование данных (кодирование, компрессия и т.п.) прикладного уровня в поток информации для транспортного уровня.
Слайд 17Уровень 7, прикладной
Прикладной уровень отвечает за доступ приложений в сеть.
Задачами этого
уровня является перенос файлов, обмен почтовыми сообщениями и управление сетью.
Слайд 18Протоколы 7-го уровня
FTP - протокол переноса файлов
TFTP - упрощенный протокол
переноса файлов
X.400 - электронная почта
Telnet – удаленное выполнение команд
SMTP - простой протокол почтового обмена
CMIP - общий протокол управления информацией
SNMP - простой протокол управления сетью
NFS - сетевая файловая система
Слайд 19Семиуровневая модель, пожалуй, излишне “тяжеловесна”. Вполне достаточно пятиуровневой модели:
Слайд 20Основа сетевого взаимодействия – сервер, клиент и протокол.
Сервер – это процесс,
предоставляющий некоторые ресурсы.
Клиент – это процесс, запрашивающий ресурсы.
Протокол – это правила общения клиента и сервера.
Слайд 21Сервер как правило находится в состоянии ожидания соединения с клиентом.
На компьютере
могут работать несколько серверов.
Поскольку сетевой адрес у компьютера один, то возникает организационная проблема: как различать сервера?
Эта проблема решается введением понятия “порт”.
Слайд 22Порт – это целое число из диапазона [1,65535], которое “закрепляется” за
тем или иным сервером.
Ряд портов закреплены уже “навечно”. Это порты с номерами 1-1023. Например, 80 – это порт http-сервера, 25 – порт SMTP-сервера и т.д.
Слайд 23Схема отправки данных
Программа (на прикладном уровне) передает данные транспортному (четвертому) уровню.
На транспортном уровне к блоку данных добавляются номера портов (отправителя и получателя) длина сообщения и контрольная сумма.
Слайд 24Два распространенных протокола транспортного уровня – TCP и UDP.
Протокол TCP оперирует
т.н. пакетами, а UDP – датаграммами.
Слайд 25Датаграмма UDP невелика (~1K). Если нужно передать большой объем данных, то
программа-отправитель должна эти данные сегментировать перед передачей.
Программа-получатель должна объединить отдельные датаграммы в блок данных. При этом датаграммы могут дойти до получателя разными маршрутами, а некоторые могут потеряться.
Слайд 26Нет гарантии, что все датаграммы дойдут до получателя.
В целом, UDP
напоминает передачу данных по радио.
Слайд 27ТСР-пакет тоже невелик (при передаче больших объемов требуется сегментация), однако протокол
более надежен.
ТСР сначала устанавливает двустороннее (дуплексное) соединение сервера с клиентом.
Прием каждого пакета подтверждается.
TCP-соединение напоминает телефонный разговор.
Слайд 28С транспортного уровня пакет “опускается” на сетевой уровень (третий).
На этом уровне
к пакету добавляются IP-адреса отправителя и получателя, и превращается в IP-пакет, после чего он передается “ниже” на канальный уровень…
На приемной стороне действия выполняются в обратном порядке
Слайд 29С точки зрения реализации в среде Java (а также C/С++) центральным
объектом сетевого обмена является сокет.
Сокет – это объект, который скрывает от программиста низкоуровневые детали сетевого обмена и делает обмен по сети похожим на файловый поток.
Слайд 30Далее мы рассмотрим программную реализацию нескольких тем:
Отправка запроса на URL;
TCP-обмен;
UDP-обмен.
Слайд 32import java.net.*;
import java.io.*;
class PostURL{
public static void main(String [] args)
{
String req = "HomeLisp";
try {
URL url = new URL("http://homelisp.ru");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
uc.setDoInput(true);
uc.setUseCaches(false);
uc.setRequestProperty("content-type","application/octet-stream");
uc.setRequestProperty("content-length",""+req.length());
uc.connect();
Слайд 33 DataOutputStream dos = new DataOutputStream(uc.getOutputStream());
dos.writeBytes(req);
dos.close();
BufferedReader br = new BufferedReader( new InputStreamReader(uc.getInputStream()));
String res=null;
while ((res=br.readLine()) != null)
System.out.println(res);
}
catch(MalformedURLException me){
System.err.println(me);
}
catch(UnknownHostException he){
System.err.println(he);
}
Слайд 34 catch(UnknownServiceException se){
System.err.println(se);
}
catch(IOException ioe){
System.err.println(ioe);
}
}
}
Слайд 35Упражнение
Протранслируйте и запустите код. Обеспечьте прием имени сайта из командной строки.
Слайд 37Далее приводится исходный текст http-клиента, который запрашивает у сервера файл и
выводит его содержание на консоль.
Слайд 38import java.net.*;
import java.io.*;
import java.util.*;
class tcpClient{
public static void main (String
[] args){
if (args.length != 3) {
System.err.println("Usage: tcpClient host port file");
System.exit(0);
}
String host = args[0];
int port = Integer.parseInt(args[1]);
String file = args[2];
try{
Socket sock = new Socket(host,port);
PrintWriter pw = new PrintWriter(new
OutputStreamWriter(sock.getOutputStream()),true);
Слайд 39 pw.println("POST "+file+" HTTP/1.1\n");
BufferedReader br = new BufferedReader(new
InputStreamReader(sock.getInputStream()));
String line = null;
line = br.readLine();
StringTokenizer st = new StringTokenizer(line);
String code = null;
if ((st.countTokens() >= 2) && st.nextToken().equals("POST")){
if ((code = st.nextToken()) != "200"){
System.err.println("File not found. code="+code);
System.exit(0);
}
}
while ((line = br.readLine()) != null)
System.out.println(line);
Слайд 40 sock.close();
}catch(Exception e){
System.err.println(e);
}
}
}
Слайд 41Теперь рассмотрим текст приложения-сервера (протокол http), который будет предоставлять файлы клиентам.
Слайд 42import java.net.*;
import java.io.*;
import java.util.*;
class tcpServer{
public static void main(String []
args){
try{
ServerSocket ss = new ServerSocket(Integer.parseInt(args[0]));
while (true)
new HttpConnect(ss.accept());
}catch(ArrayIndexOutOfBoundsException ae){
System.err.println("Usage: tcpServer port");
System.exit(0);
}catch(IOException e){
System.out.println(e);
}
Слайд 43 }
}
class HttpConnect extends Thread{
private Socket sock;
HttpConnect(Socket
s) {
sock=s;
setPriority(NORM_PRIORITY-1);
start();
}
public void run() {
try{
PrintWriter pw = new PrintWriter(new
OutputStreamWriter(sock.getOutputStream()),true);
BufferedReader br = new BufferedReader(new
InputStreamReader(sock.getInputStream()));
Слайд 44 String req = br.readLine();
System.out.println("Requset:
"+req);
StringTokenizer st = new StringTokenizer(req);
if ((st.countTokens() >= 2) && st.nextToken().equals("POST")) {
if ((req = st.nextToken()).endsWith("/") || req.equals(""))
req+="index.html";
try{
File f = new File(req);
BufferedReader bfr = new BufferedReader(new FileReader(f));
char [] data = new char[(int) f.length()];
bfr.read(data);
pw.println("HTTP/1.1 200 OK\n");
pw.write(data);
pw.flush();
}catch(FileNotFoundException fe){
pw.println("HTTP/1.1 404 Not Found\n");
Слайд 45 }catch(IOException ioe){
System.err.println(ioe);
}
}
else pw.println("HTTP/1.1 400 Bad Request\n");
sock.close();
}catch(IOException ioe){
System.err.println(ioe);
}
}
}
Слайд 46Упражнение
Протранслируйте и запустите клиент и север. Убедитесь в их работоспособности.
Попробуйте зайти
на сервер браузером. Что видите? В чем причина? Попробуйте ее исправить.
Слайд 48При использовании UDP, не требуется создавать клиент и сервер. Каждый участник
может как отправлять данные, так и получать их.
Далее приводится два класса: отправитель и получатель.
Слайд 49import java.net.*; // Отправитель
import java.io.*;
class UdpSender{
private String host;
private int port;
UdpSender(String h, int p){
host=h;
port=p;
}
public void sendMessage(String msg){
try{
byte [] data = msg.getBytes();
InetAddress addr = InetAddress.getByName(host);
DatagramPacket pack = new DatagramPacket(data,data.length,addr,port);
DatagramSocket ds = new DatagramSocket();
Слайд 50 ds.send(pack);
ds.close();
}catch(IOException e){
System.err.println(e);
}
}
public static void main(String[] args) {
UdpSender sndr = new UdpSender("localhost",1111);
for(int k=0; k
sndr.sendMessage(args[k]);
}
}
Слайд 51import java.net.*; // получатель
import java.io.*;
class UdpReceiver{
public static void main(String []
args){
try{
DatagramSocket ds = new DatagramSocket(1111);
while(true){
DatagramPacket pack = new DatagramPacket(new byte [1024],1024);
ds.receive(pack);
System.out.println(new String (pack.getData()).trim());
}
}catch(Exception e){
System.err.println(e);
}
}
}
Слайд 52Упражнение
Протранслируйте проекты, запустите и убедитесь в их работоспособности. Что будет, если
в коде получателя опустить вызов trim?