Presentation is loading. Please wait.

Presentation is loading. Please wait.

计算机网络实验介绍 信息网络实验室 2017/9/13 04:55:22.

Similar presentations


Presentation on theme: "计算机网络实验介绍 信息网络实验室 2017/9/13 04:55:22."— Presentation transcript:

1 计算机网络实验介绍 信息网络实验室 2017/9/13 04:55:22

2 实验安排及考察方式 实验地点:信院大厅计算机软件教学实验室 实验时间:第十周开始
周五下午(40个机位): 4.25 周日上午(170机位): 实验考察方式:考勤、实验结果和实验报告(实验数据、实验报告要求手写) 实验讲义下载: 04:55:22

3 网络知识基础 ——IP地址和端口 一个完整的网间进程通信需要一个五元组来标识
IP地址是网络中计算机的唯一标识。没有IP地址,计算机无法接入因特网。 IPv4地址32bit,用点分十进制表示,如 IPv6地址128bit,用冒号分割十六进制表示,如2001:da8:d800:1075:5813:f666:5737:3 端口是传输层使用的用于区分不同的服务的一个16bit的正整数。例如80号端口是web服务,23号端口是telnet服务 通过IP地址找到计算机,通过端口找到该计算机上的服务进程。 一个完整的网间进程通信需要一个五元组来标识 源地址、源端口、协议、目的地址、目的端口 telnet远程登录 端口其实就是队,操作系统为各个进程分配了不同的队,数据包按照目的端口被推入相应的队中,等待被进程取用,在极特殊的情况下,这个队也是有可能溢出的,不过操作系统允许各进程指定和调整自己的队的大小。 一个IP地址上可以开启多个应用,需要通过端口号区分不同的服务进程 04:55:22

4 网络知识基础 ——DNS IP地址不容易记忆,如202.38.75.11(?)
引入域名:一个域名是一个用点隔开的字符串,如infonet.ustc.edu.cn。 由域名得到对应的IP地址,就需要通过DNS(Domain Name System)服务器 域名和IP并不一定是一一对应的,多地址对应同一个域名 查看域名/IP地址:nslookup 04:55:22

5 网络知识基础 ——MAC地址知识 IP地址是网络层的地址,MAC地址是数据链路层的地址,用于标识网络设备。 ARP协议
MAC地址48bit,如F4-6D A-2E 每块以太网卡的MAC地址是全球唯一的 ARP协议 根据主机IP地址确定其MAC地址的一种协议 ARP缓存:IP地址和MAC地址映射 将ARP请求广播到网络上的所有主机,并接收返回消息,确定目标IP地址的物理地址,同时将IP地址和硬件地址存入本机ARP缓存中,下次请求时直接查询ARP缓存 04:55:22

6 网络知识基础 ——命令 查看arp缓存 (局域网内ip和mac对应关系) arp -an ip neigh arp -a
Linux Windows 查看arp缓存 (局域网内ip和mac对应关系) arp -an ip neigh arp -a 查看本机的ip地址和mac地址 ifconfig ipconfig -all 查看本机路由表 route -n ip route show route PRINT 04:55:22

7 网络知识基础 ——命令 查看TCP/UDP连接 netstat -aunt netstat -an -p tcp //udp
Linux Windows 查看TCP/UDP连接 netstat -aunt netstat -an -p tcp //udp 查看到某个IP需要经历几个路由器 ping -R 或traceroute -n ping -r count 或tracert -d 网络诊断 ping 04:55:22

8 示例ping -r count及tracert -d
04:55:22

9 实验内容概述 实验一、网络的使用和配置 实验二、TCP、UDP通信程序设计实验 实验三、基于UDP协议实现可靠数据传输(RDT)
实验四、IP组网实验 注:前三个实验各4个学时,实验四8个学时(共5次) 实验三是开放性的编程实验,不要求当堂完成,实验时提交代码演示检查。 04:55:22

10 实验一、网络的使用和配置 熟悉Linux操作系统 wget下载命令使用 抓包工具tcpdump的使用 观察FTP的两种数据传送模式
了解DNS域名服务 04:55:22

11 实验一、网络的使用和配置 ——熟悉Linux操作系统
Linux有众多的发行版,包括桌面环境、办公套件、数据库等,在DistroWatch网站可以查看各种发行版的排名和信息,我们的实验采用的是较新的ubuntu发行版。 我们实验的目的是:使用Linux,而非学习Linux操作系统 遇到了问题怎么办:man,info,google,系统源码 04:55:22

12 实验一、网络的使用和配置 ——熟悉Linux操作系统
终端是重要的工具,熟悉基本命令 04:55:22

13 实验一、网络的使用和配置 ——wget下载命令使用
wget的基本使用形式是“wget [参数列表] URL(统一资源定位符)”。 常用的选项如下(详细可见实验讲义或man wget查看): -c:断点续传; -b:后台下载,记录文件写在当前目录下“wget-log”文件中; -r:--recursive,specify recursive download;递归的下载整个网站 -i download_list:下载文件“download_list”中列出的所有URL; -A/R:表示仅接受/拒绝指定的文件类型,如-A "*.gif"将仅下载gif图片,如果有多个允许可以使用“,”分开 04:55:22

14 实验一、网络的使用和配置 ——tcpdump使用
Tcpdump是linux下免费的网络分析工具(抓包),其提供了源代码,并公开了接口,因此具备很强的可 扩展性,对于网络维护人员和入侵者都是非常有用的工具 tcpdump可以将网络中传送的数据包的“头部”完全截获下来提供分析 04:55:22

15 表达式中需要注意的关键字: 这些关键字可以组合起来满足需要 关于类型的关键字,主要包括host、net、port
确定传输方向的关键字,主要包括src、dst、dst or src、dst and src,这些关键字指明了传输的方向 src host dst and src net  dst port 80 这些关键字可以组合起来满足需要 tcpdump –i eth0 host  and port 80 网络号 net 截获所有 的主机收到的和发出的所有的数据包 04:55:22

16 实验一、网络的使用和配置 ——观察FTP的两种数据传送模式(主动模式)
21号端口传输命令信息 向21号端口发起连接 服务器 客户 使用PORT命令告知服务器客户端监听在哪个端口,“你来连接我的x号端口”(x>1024) OK 服务器从20号端口向客户端的X号端口发起连接,建立数据连接 (服务器主动) 21号端口建立命令链路,20号端口建立数据链路 x号端口 传输数据 20号端口 传输数据 数据传输开始 04:55:22

17 实验一、网络的使用和配置 ——观察FTP的两种数据传送模式(被动模式)
21号端口传输命令信息 客户 服务器 向21号端口发起连接,建立控制连接 PASV命令,告知服务器使用被动模式 Entering Passive Mode(A.B.C.D.E.F),其中A.B.C.D表示服 务器的IP地址,E*256+F表示服务器将要监听的数据端口 对于用户而言 被动模式 客户端向服务器的 (E*256+F)号端口发起连接,建立起数据连接 (服务器被动) (E*256+F)号端口 传输数据 数据传输开始 04:55:22

18 实验一、网络的使用和配置 ——观察FTP的两种数据传送模式
使用tcpdump观察FTP的两种数据传输模式 在观察主动模式时请注意观察FTP命令:PORT命令;在观察被动模式时请注意观察FTP命令:PASV命令。 连接ftp时,可以使用图形化界面软件gftp,也可以使用命令行模式的ftp和lftp gftp 有模式切换的选项;ftp需在客户端里输入passive命令以实现主动模式和被动模式之间切换 实验要求:设计tcpdump的命令格式(注意使用关键字),并使用ftp客户端程序连接某ftp服务器,然后分析tcpdump抓到的数据包,对比ftp主动模式和被动模式的区别。 ftp 04:55:22

19 实验一、网络的使用和配置 ——了解DNS域名服务
在Windows下,域名查询可以使用nslookup 在Linux下,域名查询可以使用nslookup、host、dig命令 实际上,跟telnet、ftp一样,nslookup也需要有DNS服务器提供服务,默认就是本地的DNS配置。当然也可以指定特定的DNS服务器。 指定DNS服务器进行查询: nslookup -qt=类型 目标域名 指定的DNS服务器IP或域名 例子:nslookup flame.nsrl.ustc.edu.cn DNS服务器的端口号是53 域名查询需要DNS服务器提供服务 04:55:22

20 实验二、TCP、UDP通信程序设计实验 ——通信程序基础:客户端和服务器
客户1 请求 应答 服务器 请求 客户2 应答 04:55:22

21 实验二、TCP、UDP通信程序设计实验 ——通信程序基础:分层
App1 App2 port A port B TCP UDP 程序设计在应用层做,不对TCP UDP及以下的协议进行修改 IPv4, IPv6 Ethernet Adapter 04:55:22

22 实验二、TCP、UDP通信程序设计实验 ——TCP通信实验cont1
04:55:22

23 实验二、TCP、UDP通信程序设计实验 ——TCP传输控制协议
TCP提供客户与服务器的连接,一个TCP客户建立与一个服务器的连接,并与那个服务器交换数据,然后终止连接 提供可靠性。当TCP向另外一端发送数据时,它要求对端返回一个确认,如果确认没有收到, TCP自动重传数据并等待更长时间 连接全双工(允许数据在两个方向上同时传输) ftp,http等 04:55:22

24 实验二、TCP、UDP通信程序设计实验 ——UDP用户数据报协议
缺乏可靠性,协议不保证分组能够到达最终目的地,不保证各个分组按先后顺序跨网络保持不变,也不保证每个分组只到达一次 UDP通常是单工方式,也可以是全双工的 视频传输、语音通话等实时业务 04:55:22

25 实验二、TCP、UDP通信程序设计实验 ——通信程序基础:实例
得到ip地址 建立tcp连接: 构造http数据包,向tcp请求 构造tcp数据包,承载http包 构造ip数据包 得到mac地址 构造数据帧 http服务 04:55:22

26 Wireshark是一个网络封包分析软件
访问实验室主页 时 首先DNS查询操作 而后http协议获取网页中图片 底下显示的是访问实验室主页的抓包 Wireshark是一个网络封包分析软件 04:55:22

27 实验二、TCP、UDP通信程序设计实验 ——Socket介绍
socket通常也称作“套接字”,用于描述IP地址,端口和系统资源,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。 它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,只需知道一组简单的接口即可,让Socket去组织数据,以符合指定的协议。 socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。 04:55:22

28 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(1)
最初在70年代由加州大学Berkeley分校开发,其目的是为BSD(Berkeley Software Distribution) UNIX 4.1版操作系统提供网络通信接口。 Socket在各种平台下的发展 随着Berkeley Sockets的广泛应用,九十年代初,Sun、MS等公司共同制定了适应dos和win平台的windows sockets的规范(WinSock) Sun Microsystems为Java也制定了网络通信的API Linux下的socket继承了BSD sockets的风格,并有所改动 04:55:23

29 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(2)
把用来标识这个文件整数看作是这个入口的标识 先看文件操作的例子: 通过open函数得到一个文件的文件描述符;然后对这个描述符进行读写 在Linux下,所有的I/O操作都是通过读写文件描述符而产生的 得到一个整数来标识这个文件,称为file descriptor 得到一个整数来标识这个文件 04:55:23

30 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(3)
Socket descriptor 用类似于open的函数得到一个socket 描述符,然后对这个描述符进行读写操作 socket socket ?? 04:55:23

31 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(4)
从程序员角度来看,它是应用程序和网络设备的一个接口,特殊的I/O 从操作系统看,它是一种资源。如同handle用来描述windows中的窗口等资源,socket用socket descriptor来标识。 04:55:23

32 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(5)
字节流套接口(Stream Sockets) 面向连接的,位于TCP之上 数据报套接口(Datagram Sockets) 无连接的,位于UDP之上 原始套接口(Raw Sockets) 直接发送和处理IP包:例如ping 04:55:23

33 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(6)
由前面的叙述可以看出,我们要进行通信就要得到对应的socket descriptor,一旦得到了,对它进行读写操作就可以了,例如 int read( int fd, char *buf, int len); int write(int fd, char *buf, int len); 在与另一台计算机通信之前要知道对方的什么信息? IP地址或者域名 端口(用来区分不同的应用) 04:55:23

34 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(7)
Socket用下面的结构体来描述一个IP地址 定义在头文件socket.h中 结构中sa_family为套接口的协议族地址类型,例如对于通常的TCP/IP协议(IPv4),它的值是AF_INET; sa_data中存储着具体的协议地址,不同的协议族有不同的地址格式。 sa_data的存储内容往往是包含地址和端口信息,而仅使用一个变量,使用起来不太方便——定义新的Socket地址结构 struct sockaddr { unsigned short sa_family; /* 地址家族2字节*/ char sa_data[14]; /*14字节协议地址*/ }; 04:55:23

35 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(8)
最后的那个元素是填充的空白信息, 这样就保持整个结构与sockaddr结构的长度相同 struct sockaddr_in { short int sin_family; /* 通信类型2字节 */ unsigned short int sin_port; /* 端口, 2字节*/ struct in_addr sin_addr; /* Internet 地址, 4字节*/ unsigned char sin_zero[8]; } 04:55:23

36 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(9)
struct sockaddr_in { short int sin_family; /* 通信类型2字节 */ unsigned short int sin_port; /* 端口, 2字节*/ struct in_addr sin_addr; /* Internet 地址, 4字节*/ unsigned char sin_zero[8]; } 图中的紫色部分就是端口和IP地址。这两个域必须是网络字节顺序  Network Byte Order struct in_addr { unsigned long s_addr; }; 主机字节顺序到网络字节顺序函数htonl 结构体in_addr 用来表示一个32位的IPv4地址 04:55:23

37 struct in_addr{ union{ struct{ unsigned char s_b1; unsigned char s_b2;
} S_un_b; unsigned  short  s_w1; unsigned  short  s_w2; }  S_un_w; unsigned long  S_addr; } S_un; }; 三种种存储方式 04:55:23

38 实验二、TCP、UDP通信程序设计实验 ——Socket介绍(10)
sockaddr只是一个抽象的概况形式,并不实用 sockaddr_in更加结合了TCP/IP协议族的特点,易于使用,所以编程中常使用这个结构。 但是:socket本身所封装的API都是支持sockaddr结构的,所以填充sockaddr_in结构需要强制转换成sockaddr结构,方可作为参数被socket的标准函数所使用。例如: int connect( int sockfd, struct sockaddr * servaddr, unsigned int addrlen) 04:55:23

39 实验二、TCP、UDP通信程序设计实验 ——字节顺序
主机字节顺序(Host Byte Order) 低位在前,高位在后(little-endian) 基于Intel芯片的机器采取这种存储方式 网络字节顺序(Network Byte Order) 高位在前,低位在后(big-endian) Sockaddr_in的变量成员(端口和地址)都必须使用网络字节顺序 04:55:23

40 以字节为最小单位,但是计算机对内存的读取是双字节的
例如端口34567的16进制表示是0x8707。如果定义变量unsigned short sin_port = 34567 以字节为最小单位,但是计算机对内存的读取是双字节的 0x 07 87 ….68 1f e …. 0x 网络字节序 主机字节序 如果是ip地址 的16进制表示。如果定义变量unsigned long s_addr = 0xCA264B0B 网络来的数据包上提取的数据顺序 CA 26 4B 0B 双字节读取存入内存,先读取CA26存入内存并且低位26小地址 0x 0B 26 CA 0B 4B ….68 1f CA 26 4B 0B 12…. 4B 26 0x CA 04:55:23

41 实验二、TCP、UDP通信程序设计实验 ——字节顺序
转换字节顺序的函数 定义在头文件netinet/in.h中 htons和ntohs的实现是一样的;htonl和ntohl一样 uint16_t htons(uint16_t); uint16_t ntohs(uint_16_t); uint32_t htonl(uint32_t); uint32_t ntohl(uint32_t); ‘h’ : host ‘n’ : network ‘s’ : short (16bit) ‘l’ : long (32bit) 例如:定义struct sockaddr_in sh; unsigned short port = 12345; sh.sin_port = htons(port); 04:55:23

42 实验二、TCP、UDP通信程序设计实验 ——地址表达
前面提到的几个函数对于IP地址的转换仍然不方便,因为首先得得到ip地址的数值表示,而我们习惯于用带点的字符串来表示,如“ ” 因此希望有函数能处理这样的请求: 给一个字符串如“ ”能返回相应的网络字节序的unsigned long值 给一个unsigned long的值能返回一个字符串 04:55:23

43 inet_aton inet_addr inet_ntoa
int inet_aton(const char *cp, struct in_addr *inp); 例如将“ ”转化为0xC0A8000A 成功返回非零,如果输入地址不正确,则返回零 inet_addr unsigned long inet_addr(const char *cp); 功能同上,但不能处理广播地址 返回网络地址 inet_ntoa char * inet_ntoa(struct in_addr in); 例如将0xC0A8000A转化为“ ” 返回字符串 04:55:23

44 实验二、TCP、UDP通信程序设计实验 ——TCP通信实验
注意bind和listen TCP Server socket() TCP Client bind() socket() listen() connect() accept() 连接建立 write() bind()必须设好本地的地址,否则listen()得到的数据包不知道是通往哪个连接的socket read() 客户请求 服务器响应 write() read() 结束连接 close() read() 04:55:23 close()

45 基本套接口函数(1)- socket() #include <sys/socket.h>
int socket(int domain, int type, int protocol); 创建socket 返回:非负整数描述符表示成功,-1表示出错 domain一般设为AF_INET,protocol一般设为0 类型(type) SOCK_STREAM SOCK_DGRAM SOCK_RAW 解释 字节流套接口 数据报套接口 原始套接口 domain=AF_INET TCP UDP IPv4 接收到本机网卡上的数据帧或者数据包,对于监听网络流量和分析是很有用的 int fd; /* socket descriptor */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) } fprintf(stderr,“socket creating error\n”); exit(1); }/*注:在TCP或UDP编程的时候,protocol都取0*/ 04:55:23

46 基本套接口函数(2)- connect() #include <sys/socket.h>
int connect(int sockfd, struct sockaddr * servaddr, unsigned int addrlen); 返回:0表示成功,-1表示出错 connect()由客户使用, 旨在和服务器建立一个连接。sockfd是函数socket()返回的套接口描述符, servaddr表示远程服务器的套接口, addrlen表示套接口地址的长度 其中servaddr是包含IP地址和端口号的 注意:之前要先调用socket()创建套接口 04:55:23

47 TCP通信- 客户端例子 int fd; /* 套接口描述符 */
struct sockaddr_in { short int sin_family; /* 通信类型2字节 */ unsigned short int sin_port; /* 端口, 2字节*/ struct in_addr sin_addr; /* Internet 地址, 4字节*/ unsigned char sin_zero[8]; } int fd; /* 套接口描述符 */ struct sockaddr_in srv; /* 套接口地址结构 */ fd = socket(AF_INET, SOCK_STREAM, 0); /* connect: AF_INET表示使用Internet地址族 */ srv.sin_family = AF_INET; /* connect: 目标是连向服务器的 8000 号端口 */ srv.sin_port = htons(8000); /* connect: 目标服务器的 IP Address 是 “ ” */ srv.sin_addr.s_addr = inet_addr(“ ”); if(connect(fd, (struct sockaddr*) &srv, sizeof(srv)) < 0) { fprintf(stderr, ”connect error!\n"); exit(1); } struct in_addr { unsigned long s_addr; }; inet_addr unsigned long inet_addr(const char *cp); 例如将“ ”转化为0xC0A8000A 04:55:23

48 基本套接口函数(3)- bind() #include <sys/socket.h>
int bind(int sockfd, struct sockaddr * servaddr, unsigned int addrlen); 返回:0表示成功,-1表示出错 bind将本机地址(某个或全部地址)与套接口绑定在一起 一般用于服务器绑定自己公认的服务端口号 客户端一般会在调用connect函数时,系统自动为客户 选择一个大于1024的端口号,并用客户本地IP地址填充 套接口地址中的相关项 04:55:23

49 基本套接口函数(4)- listen() #include <sys/socket.h>
int listen(int sockfd, int backlog); 返回:0表示成功,-1表示出错 listen只被TCP服务器所使用! 函数listen将一个套接口转换为侦听套接口(listening socket), 因为每个套接口在创建的时候都是主动套接口,等待使用connect函数发起连接。而listen将套接口转化为被动的,指示内核应接收来自此套接口的连接请求。 backlog参数指示了内核为此套接口排队的最大连接数目 04:55:23

50 基本套接口函数(5)- accept() 该函数是阻塞型!!! #include <sys/socket.h>
int accept(int sockfd, struct sockaddr * addr, unsigned int * addrlen); 返回:非负描述符表示成功,-1表示出错 函数accept由TCP服务器在listen函数之后调用, 它从侦听的套接口的完成连接队列中接收一个连接, 若已完成连接为空, 那么该进程进入睡眠, 处于等待连接的方式 参数sockfd指定侦听的套接口描述符, addr和addrlen用以返回与服务器相连接的客户的协议地址信息, 如果对客户地址和端口感兴趣, 则可以从addr中提取相关信息 函数accpet最终返回一个新的套接口描述符, 以标识连接 04:55:23

51 基本套接口函数(6)- 其它 #include <unistd.h>
int read( int fd, char *buf, int len); 返回实际接收的缓冲区大小 int write(int fd, char *buf, int len); 返回实际发送的缓冲区大小 int close(int sockfd); int closesocket(int sockfd); 成功返回0, 否则返回-1 还有一些其他的发送接收函数, 感兴趣的同学可以查阅学习 04:55:23

52 TCP通信- 服务器例子 int fd; /* 套接口描述符 */
struct sockaddr_in srv; /* 套接口地址结构 */ fd = socket(AF_INET, SOCK_STREAM, 0) /* AF_INET表示使用Internet地址族 */ srv.sin_family = AF_INET; /* 将socket绑定到 8000 号端口,将主机存储方式转化为网络存储方式 */ srv.sin_port = htons(8000); /* bind: INADDR_ANY 表示服务器将接收来自本机上任何一块网卡的客户连接 将主机存储方式转化为网络存储方式 */ srv.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(fd, (struct sockaddr*) &srv, sizeof(srv)) < 0) { fprintf(stderr, ”bind error!\n"); exit(1); } 04:55:23

53 TCP通信- 服务器例子(续) if(listen(fd, 5) < 0) {
fprintf(stderr, ”listen error!\n"); exit(1); } newfd = accept(fd, (struct sockaddr*) &cli, &cli_len); if(newfd < 0) { fprintf(stderr, "accept error\n"); 04:55:23

54 实验二、TCP、UDP通信程序设计实验 ——TCP通信实验注意事项
要求使用linux编写通信程序 Linux下,写好源代码后,gcc file.c –o xxx;运行则用./xxx (xxx是生成的文件的名字) 注意对调用函数进行错误检查及处理 例如 if(listen(fd, 5) < 0) … 一般来说终止程序,返回错误报告 socket用完之后要调用close关闭连接 进一步的思考 程序的水平取决于连接建立后的读写操作的设计,当然良好的用户界面也很重要 accept函数是一个阻塞型函数——多线程的用武之地,建议感兴趣的同学可以学习一下select函数 04:55:23

55 实验二、TCP、UDP通信程序设计实验 ——UDP通信实验
UDP Server socket() bind() UDP Client recvfrom() socket() 阻塞型,直到接收到 客户发送过来的数据报 sendto() data request Connect listen accept data reply sendto() recvfrom() 04:55:23 close()

56 基本套接口函数(7) 阻塞型函数 #include <sys/socket.h>
返回发送方地址信息,由函数填写 #include <sys/socket.h> int recvfrom(int sockfd, void * buf, int len, int flags, struct sockaddr * from, unsigned int *addrlen); int sendto(int sockfd, const void * msg, int len, int flags, const struct sockaddr * to, unsigned int addrlen); 需要服务器地址信息,由程序员填写 与TCP不同的是, UDP在通信时, 系统内部不记录套接口地址信息, 都是函数中主动以参数的形式指明的. 在TCP情况下, 客户connect成功后(服务器accept成功后), 每次发送接收都只需指定套接口描述符就行了, 但是这里每次发送接收都需要额外附加上对方的套接口地址信息. 04:55:23

57 UDP通信- 服务器端例子 int fd; /* 套接口描述符 */
struct sockaddr_in srv; /*服务器绑定的套接口地址信息*/ fd = socket(AF_INET, SOCK_DGRAM, 0); srv.sin_family = AF_INET; srv.sin_port = htons(8000); srv.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(fd, (struct sockaddr*) &srv, sizeof(srv))<0) { fprintf(stderr, "bind error!\n"); exit(1); } 04:55:23

58 UDP通信- 服务器端例子(续) struct sockaddr_in cli; char buf[512];
int cli_len = sizeof(cli); int nbytes; nbytes = recvfrom(fd, buf, sizeof(buf),0/*flags*/, (struct sockaddr*) &cli, &cli_len); if(nbytes < 0) { fprintf(stderr,“recvfrom error\n”); exit(1); } 04:55:23

59 UDP通信- 客户端例子 int fd; /* socket descriptor */
struct sockaddr_in srv; /* used by sendto() */ /* 1) create the socket */ /* sendto: send data to IP Address “ ” port 8000 */ srv.sin_family = AF_INET; srv.sin_port = htons(8000); srv.sin_addr.s_addr = inet_addr(“ ”); nbytes = sendto(fd, buf, sizeof(buf), 0 /* flags */, (struct sockaddr*) &srv, sizeof(srv)); if(nbytes < 0) { fprintf(stderr,“sendto error\n”); exit(1); } 04:55:23

60 实验三、基于UDP协议实现可靠数据传输(RDT)
基于UDP协议实现可靠数据传输,需要对UDP协议进行扩展。 RDT协议通过调用UDP协议的send_to及recv_from函数进行数据包的发送和接收,在此基础上通过实现检验和,报文序列号,确认重传等机制为上层提供一条“虚拟的可靠数据信道”。 04:55:23

61 1 停等协议 在此协议中,发送端每次只发送一个数据包,为此数据包设置超时定时器,然后进入阻塞等待该数据包的确认消息。发送端如果收到接收端的ACK消息,则开始发送下一个数据包;如果超时或收到NACK消息,则重新发送数据包。 接收端收到一个数据包后,先检查此数据包是否完整,如果完整,发送ACK消息;否则发送NACK消息。 04:55:23

62 2 Go-Back-N协议 在GBN协议中,发送端发送[base, base+N-1]的滑动窗口,为每个正在发送的数据包设置一个定时器。如果数据包k超时,所有k及以后的数据包重新发送。 接收端只需要记住当前预期的数据包的序列号expectedseqnum;如果收到完整的数据包,并且包序号等于expectedseqnum,发送确认消息;否者将数据包丢弃,并使用累积确认方式发送ACK数据包,表明接收方正确接收到序号n以前(包括n在内)的所有分组。 累积确认方式? 04:55:23

63 GBN中的发送方窗口 04:55:23

64 3 选择重传协议 在GBN协议中,如果接收方收到的数据包序列号不等于expectedseqnum,则将其丢弃;如果一个数据包出错,则其以后的数据包都需要重传,无论此数据包是否已被正确接收过。 而选择重传协议则让发送方只重传出错的数据包,接收端同样维护一个缓存窗口,如果接收的数据包的序列号在此窗口内,则将其缓存;如果接收到的数据包的序列号等于recv_base,则将该数据包及其后连续的数据包交送到上层。 不管是不是expectednum只要落在缓存窗口内就将其缓存起来 04:55:23

65 选择重传中的窗口 04:55:23

66 实验要求 扩展UDP协议,在其基础上实现停等协议或GBN协议,以实现可靠数据传输
要求单工通信,编写相应的发送端及接收端的程序,并能通过实际的大文件传输验证程序的可靠性 在Linux平台,使用c或c++实现 选做: GBN协议和选择重传协议性能比较 04:55:23

67 实验四、IP组网实验 ——Linux下IP组网基础
理解ARP协议 理解路由 理解IP协议的基本配置 04:55:23

68 实验四、IP组网实验 ——Linux下IP组网基础
理解ARP(Address Resolution Protocol) MAC地址是链路层协议中通信实体的唯一标志 协议的各层是独立的,IP地址不应该被链路层所使用 链路层需自己解决目的地址问题 在子网中广播“谁的IP地址是a.b.c.d”;接收者核对后,是则回答“a.b.c.d的mac地址是xxxxx”,不是则丢弃。 并不是每次通信前都要用arp,主机会缓存一段时间 04:55:23

69 实验四、IP组网实验 ——Linux下IP组网基础
查看arp缓存:arp -an(ip neigh)、arp -a 04:55:23

70 用ifconfig eth0命令查看本机IP地址和以太网的硬件地址 用arp -n命令查看本机ARP缓存表的内容。
询问临近同学实验所用计算机的IP地址,然后使用ping命令向其发送ICMP echo request报文。 收到响应(ICMP echo reply)后,再次使用arp -n命令查看本机ARP缓存表的内容,并获得对方机器的MAC地址 检查与对方主机上ifconfig的结果是否一致。 04:55:23

71 实验四、IP组网实验 ——Linux下IP组网基础
理解路由 路由就是决定一个数据包的去向的功能 一般的主机不具有转发功能,因此只是简单的判断接收到的数据包是否是发给自己的;以及判断自己要发出去的数据包,该交给谁(下一跳) 对于路由器而言,还应该对一些数据包进行转发。即,收到一个数据包,目的地址不是自己,应该决定下一跳发给谁 04:55:23

72 / next eth / next eth1 最长前缀优先匹配 / next eth / next eth2 04:55:23

73 实验四、IP组网实验 ——Linux下IP组网基础
找出软件教学实验室到bbs服务器,经历了多少路由器(注意一个路由器有多个IP地址): 1.使用traceroute工具实现; 2.使用ping -R 利用记录路由选项实现 软件教学实验室 学校BBS 服务器 04:55:23

74 实验四、IP组网实验 ——路由 到某IP所经过的路由器 查看本机路由表 traceroute -n ping -R(往返) route -n
ip route show 04:55:23

75 实验四、IP组网实验 ——Cisco路由器IP组网模拟
NetSim是Boson公司开发的一个针对Cisco认证的路由器配置模拟软件,主要模拟Cisco路由器的命令行配置。软件还提供一个拓扑设计功能,使用者可以使用软件提供的缺省拓扑或自己设计的拓扑进行网络配置实验。 本实验的目的: 因为“netsim”是一套用于CCNP考试的学习软件,其中提供的设备操作与Cisco的设备完全一样(华为设备用户界面也是如此)。通过本部分实验的学习,可以了解实际网络中对路由进行配置的基本流程。 CCNP思科认证网络高级工程师 04:55:23

76 实验四、IP组网实验 ——Cisco路由器IP组网模拟 (常用Cisco命令)
Netsim模拟的是Cisco的路由器,本实验要用到一些常用的Cisco命令: enable :进入特权命令状态 configure terminal:进入全局设置状态 interface 网络接口设备名:进入某网络接口的配置状态; ip address IP地址 子网掩码:为某个网络接口配置IP地址 ip route IP地址 子网掩码 下一条地址:配置静态路由 04:55:23

77 实验四、IP组网实验 ——Cisco路由器IP组网模拟 简单例子
04:55:23

78 ?? 04:55:23

79 实验四、IP组网实验 ——Cisco路由器IP组网模拟 (Cisco配置示例——配置动态路由)
04:55:23

80 实验四、IP组网实验 ——明确各设备的连接关系
在拓扑图上双击某设备即显示该设备和其它设备的连接情况 04:55:23

81 实验四、IP组网实验 ——根据拓扑结果分析各设备应该怎样配置路由
例如本例中可以采取如下的方案: 1. 路由器A配置到路由器C的默认路由; 2. 路由器B配置到路由器C的默认路由; 3. 路由器C配置到子网 /24的静态路由和到子网 /24子网的静态路由; 04:55:23

82 实验四、IP组网实验 ——根据拓扑结果分析各设备应该怎样配置路由
例如本例中可以采取如下的方案(续): 4. 主机分别配置到各自出口路由器的默认路由。 配置完成后可以用show interface 查看已配好的配置文件 04:55:23

83 实验四、IP组网实验 ——配置动态路由 04:55:23

84 实验四、IP组网实验 ——配置动态路由 04:55:23

85 实验四、IP组网实验 ——配置动态路由 04:55:23

86 实验四、IP组网实验 ——配置动态路由 04:55:23

87 实验四、IP组网实验 ——配置Host:HostA1上的配置情况
主机间ping通 ?打开终端 04:55:23

88 实验四、IP组网实验 ——验证实验是否成功,看主机间可否相互ping通
04:55:23

89 Thank You! 04:55:23


Download ppt "计算机网络实验介绍 信息网络实验室 2017/9/13 04:55:22."

Similar presentations


Ads by Google