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

Slides:



Advertisements
Similar presentations
1 实验二、 TCP 、 UDP 通信程序设计实验 ——TCP 通信实验 注意 bind 和 listen socket() bind() listen() accept() write() read() TCP Server read() socket() TCP Client connect()
Advertisements

计算机应用基础网考课 第六章 计算机网络基础.
網路程式設計 (Network Programming)
项目四:Internet基础与接入方法 第八章 应用服务器安装配置
第6章:计算机网络基础 网考小组.
朝阳区统计系统 网络基础知识培训 计算机中心
本周复习一下基本的网络知识 下周开始讲解路由器的配置方法 第四周开始到实验室做实验(主楼910,919)
課程名稱:計算機概論 授課老師:李春雄 博士
计算机网络(第 6 版) 第 6 章 应用层 青岛理工大学通信与电子工程学院.
网络常用命令.
中国科学技术大学 肖 明 军 《网络信息安全》 中国科学技术大学 肖 明 军
因特网 TCP/IP协议 IP路由技术 Internet接入技术 Internet服务.
思考 问题十:大学生如何提高英语能力? (听说读写能力).
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
计算机网络安全技术实验 启动虚拟机、GIF、measpoilt、.
NetGuru 創新 網路通訊實驗教學解決方案 PART I TCP/IP通訊協定深入剖析/以NetGuru實作
2017/4/6 课程整体设计 计算机组网技术 梁建华.
Netman Linux 的防火牆設計與應用 Netman
计算机系统安全 第10章 常用攻击手段.
TCP Session Hijack 郭军权
Socket.
包河区学校网站管理员培训 包河中学 林文明.
網路基本概念與設定方法 林文宗 資管系助理教授
基于WinSock的邮件系统 1 设计目标: 1.1 SMTP发送邮件服务器(c语言) 1.2 POP3接受邮件服务器(c语言)
学习目标: 1)理解包和包过滤 2)理解包过滤的方法 3)设置特殊的包过滤规则
實驗8 ICMP協定分析 實驗目的 明瞭ICMP(Internet Control Message Protocol;網際網路控制訊息協定)的工作原理 解析ICMP協定下封包資料傳送的格式。
網路概論.
網路指令 講師 : 郭育倫
Advanced Sockets Programming
教师:陈有为 TCP/IP与Internet(A) 教师:陈有为
TCP、UDP 通信实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
計中「多媒體與網路應用」短期訓練課程 FTP server 架設 (in Windows)
第 13 章 DNS 著作權所有 © 旗標出版股份有限公司.
第3讲 网络安全协议基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
網路故障排除 家庭和小型企業網路 – 第九章.
臺東縣中小學資訊教育校園網路管理暨資訊安全防護計畫研習
Socket Programming in C
網路伺服器應用 Linux Server Andres, Wen-Yuan Liao
Socket Programming.
Socket 基本觀念.
網路服務 家庭和小型企業網路 – 第六章.
TCP/IP Protocol Suite TCP/IP協定 第二組 投影片製作by簡嘉宏 綦凱宏 林睿敏 滕孟哲.
ARP, RARP & ICMP.
Socket Programming.
基 礎 網 路 管 理 台東大學電算中心 郭俊賢 技術師.
第 2 章 TCP / IP 簡介.
TCP/IP基本原理 第九章 文件传输.
在一定程度上 人类的思维产生于 简单个体之间的相互作用 ——Marvin Minsky.
網路探測:路徑、延遲 與流量統計 Instructor: Teaching Assistant:.
考试题型 填空题(30) 选择题(20) 名词解释(10) 问答题(24) 计算题(16) 附加题(30) 成绩核算:
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计.
第8章 配置Linux网络 本章将从介绍Webmin软件开始,详细介绍各种网络相关的配置,如设置以太网接口连接Internet、DHCP服务器架设、设置NFS实现Unix/Linux系统间文件共享和架设DNS服务器等。通过本章学习,用户可以到相关的网络知识,并能深入理解Fedora提升用户使用该操作系统的能力。
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
公司 : 岱昇科技股份有限公司 專案負責人:翁宇宏 報告人:高一生
江西财经大学信息管理学院 《组网技术》课程组
第2章 套接字网络编程基础 2.1 UNIX套接字网络编程接口的 产生与发展 2.2 套接字编程的基本概念 2.3 面向连接的套接字编程
校園網路架構介紹與資源利用 主講人:趙志宏 圖書資訊館網路通訊組.
子網路切割、變動長度的子網路遮罩 (VLSM) 與 TCP / IP 的檢修
第十三章 TCP/IP 與 Internet 網路連結技術
第2讲 网络安全协议基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
Web Server 王宏瑾.
Westmont College 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API)
Window Socket 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
Advister: Quincy Wu Speaker: Chenglin Tsai Date:3/26
傳輸控制協議 /互聯網協議 TCP/IP.
面向非连接的 SOCKET编程 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
SOCKET( ).
2019/5/3 JAVA Socket(UDP).
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
Internet课程设计 教师:陈 妍 朱海萍 西安交通大学计算机系
Presentation transcript:

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

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

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

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

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

网络知识基础 ——命令 查看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

网络知识基础 ——命令 查看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

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

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

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

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

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

实验一、网络的使用和配置 ——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图片,如果有多个允许可以使用“,”分开 HTTPS:HTTP的安全版 04:55:22

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

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

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

实验一、网络的使用和配置 ——观察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

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

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

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

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

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

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

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

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

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

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

实验二、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

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

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

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

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

实验二、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

实验二、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

实验二、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

实验二、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

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

实验二、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

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

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

实验二、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

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

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

实验二、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()

基本套接口函数(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

基本套接口函数(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

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 是 “202.38.75.11” */ srv.sin_addr.s_addr = inet_addr(“202.38.75.11”); 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); 例如将“192.168.0.10”转化为0xC0A8000A 04:55:23

基本套接口函数(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

基本套接口函数(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

基本套接口函数(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

基本套接口函数(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

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

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

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

实验二、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()

基本套接口函数(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

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

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

UDP通信- 客户端例子 int fd; /* socket descriptor */ struct sockaddr_in srv; /* used by sendto() */ /* 1) create the socket */ /* sendto: send data to IP Address “192.168.6.51” port 8000 */ srv.sin_family = AF_INET; srv.sin_port = htons(8000); srv.sin_addr.s_addr = inet_addr(“192.168.6.51”); 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

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

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

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

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

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

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

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

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

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

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

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

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

202.38.75.0/255.255.255.0 next 0.0.0.0 eth0 202.38.74.0/255.255.255.0 next 0.0.0.0 eth1 最长前缀优先匹配 202.38.75.0/255.255.255.0 next 0.0.0.0 eth0 202.38.0.0/255.255.0.0 next 202.38.64.254 eth2 04:55:23

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

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

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

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

实验四、IP组网实验 ——Cisco路由器IP组网模拟 简单例子 192.168.101.2 192.168.100.2 192.168.101.1 192.168.1.1 192.168.1.2 192.168.100.1 04:55:23

?? 04:55:23

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

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

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

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

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

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

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

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

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

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

Thank You! 04:55:23