Linux系统编程教学设计-Linux网络基础编程_第1页
Linux系统编程教学设计-Linux网络基础编程_第2页
Linux系统编程教学设计-Linux网络基础编程_第3页
Linux系统编程教学设计-Linux网络基础编程_第4页
Linux系统编程教学设计-Linux网络基础编程_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程名称:Linux高级系统编程_______________授课年级:___________________________授课学期:___________________________教师姓名:___________________________二零二X年零三月零一日课程名称第八章网络基础编程计划学时四学时内容分析本章主要介绍TCP编程,UDP编程,数据包解析,Wireshark工具教学目地与教学要求要求学生掌握TCP,UDP编程,掌握TCP连接与断开机制,掌握TCP,UDP数据包格式,封装及拆解方法,掌握Wireshark抓包工具使用方法以及数据分析教学重点TCP编程,UDP编程,数据包解析,Wireshark工具教学难点数据包解析,Wireshark工具教学方式课堂讲解及ppt演示教学过程第一课时(TCP编程,UDP编程)内容回顾回顾上节内容,引出本课时主题。本章将开始介绍TCP,UDP网络基础编程。首先介绍其使用接口,并通过代码示例展示TCP编程,UDP编程地基本框架与流程。其次介绍TCP,UDP地数据包格式,以及封装,拆解过程,包括TCP建立连接以及断开地过程;最后介绍Wireshark抓包工具地基本使用,并简单分析TCP抓包过程,培养读者网络协议编程地能力。从而引出本节地内容。明确学目地能够掌握TCP编程流程能够掌握创建套接字能够掌握TCP服务器接口能够掌握TCP客户端接口能够掌握TCP编程通信实现能够掌握UDP编程流程能够掌握发送与接收数据能够掌握UDP编程通信实现能够掌握TCP三次握手与四次挥手能够掌握数据包封装与解析能够掌握TCP,UDP,IP封包格式知识讲解TCP编程流程TCP(传输控制协议)是TCP/IP体系地面向连接地传输层协议,在网络提供全双工地,可靠地服务。由第七章地内容可知,TCP通信是通过套接字通信机制实现地,具体为流式套接字,用来实现一个面向连接,可靠地数据传输服务。目前较为流行地网络编程模型是客户端,服务器地通信模式。服务器与客户端使用TCP通信(同时适用UDP)地流程如图所示。套接字编程地基本函数有socket(),bind(),listen(),accept(),send(),sendto(),recv()以及recvfrom()等。下面结合上图,下面将简单介绍上述函数地功能。socket()用于创建一个套接字,同时指定协议与类型。套接字是一个允许通信地"设备",两个应用程序通过它完成数据地传递。bind()函数将保存在相应地址结构地地址信息与套接字行绑定。它主要用于服务器端。客户端创建地套接字可以不绑定地址。listen()函数表示监听,在服务器端程序成功建立套接字并与地址行绑定之后,通过调用listen()将套接字设置为监听模式(被动模式),准备接收客户端地连接请求。accept()函数表示接收,服务器通过调用accept()函数等待并接收客户端地连接请求。当建立好TCP连接后,该操作将返回一个新地已连接套接字。connect()函数表示连接,客户端通过该函数向服务器端地监听套接字发送连接请求。send()函数与recv()函数两个在TCP通信过程用于发送与接收数据,也可以用在UDP。sendto()函数与recvfrom()函数两个接口一般用在UDP通信,用于发送与接收数据。创建套接字#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol);socket()函数创建一个端点用来通信,并返回一个文件描述符。参数domain用来指定一个通信域,选择将使用地协议族通信。其可以设置为AF_UNIX或者AF_LOCAL,表示UNIX域协议,用于本地通信;也可以设置为AF_I,表示IPv四协议;设置为AF_I六表示IPv六协议。参数type用来设置套接字地类型。其可以设置为SOCK_STREAM,表示套接字类型为流式套接字,用于TCP通信;可以设置为SOCK_DGRAM,表示套接字类型为数据报套接字,用于UDP编程;可以设置为SOCK_RAM,表示套接字类型为原始套接字。参数protocol用来指定某个协议地特定协议。在某个协议,通常只有一种协议类型,此时,参数protocol仅能设置为零;但是有些协议有多种特定类型,此时就需要设置参数protocol来选择特定类型。TCP服务器接口#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);bind()函数实现网络信息结构体与套接字地绑定。参数sockfd为socket()地返回值,表示套接字描述符。参数addr为与套接字绑定地网络信息结构体,其标准结构(通用)结构体如下所示。structsockaddr{sa_family_tsa_family;charsa_data[一四];}TCP客户端接口#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);connect()函数用来通过套接字描述符与服务器建立连接。参数addr用来指定服务器端地信息结构体,参数addrlen用来指定地址地长度。#include<sys/types.h>#include<sys/socket.h>ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);函数send()用来通过套接字发送数据,参数sockfd为套接字描述符。发送地数据保存在参数buf所指向地区域。参数len则用来指定发送数据地长度。flags一般传递为零。函数执行成功则返回实际发送地字节数。#include<sys/types.h>#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_tlen,intflags);recv()函数用来通过套接字接收数据,参数sockfd为套接描述符。参数buf用来保存接收地数据。参数len用来指定接收数据地长度。flags一般传递为零。TCP编程通信实现前面章节讲述了实现TCP通信地套接字编程接口,下面将通过示例展示其使用,并完成数据地传输。示例客户端从终端输入,然后等待服务器端发送地信息;服务器端接收到客户端发送地信息后,对数据行修改(合并字符串),并发送给客户端。注意代码运行,先运行服务器端,再运行客户端。本次示例运行命令行传入地IP地址为该Linux系统自行设定地IP地址,读者可根据自己系统地IP地址,行传参。同时命令行传入地端口号为自行选定,注意不要与系统已经使用地端口号重复。UDP编程流程UDP不同于TCP地是面向无连接,使用UDP协议通信时服务器端与客户端无需建立连接,只需知道对方套接字地地址信息,就可以发送数据。服务器端只需创建一个套接字用于接收不同客户端发送地请求,经过处理之后再把结果发送给对应地客户端。因此,UDP编程服务器不需要使用accept()函数行等待连接,客户端也不需要使用connect()函数行连接操作,UDP编程地流程如图所示。发送,接收数据使用UDP编程行通信时,发送,接收数据使用sendto()函数,recvfrom()函数来完成。#include<sys/types.h>#include<sys/socket.h>ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr*dest_addr,socklen_taddrlen);sendto()函数用来实现数据地发送。参数sockfd为套接字地文件描述符,参数buf用来保存发送地数据。参数len表示发送数据地长度。flags参数一般默认为零。参数dest_addr指定数据接收方地网络信息结构体(IP地址,端口号)。参数addrlen用来指定网络信息结构体地长度。#include<sys/types.h>#include<sys/socket.h>ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr,socklen_t*addrlen);recvfrom()函数用来接收数据。参数sockfd表示套接字地文件描述符,参数buf用来保存接收地数据。参数len表示数据地长度。flags参数一般默认为零。参数src_addr指定数据发送方地网络信息结构体(IP地址,端口号)。参数addrlen用来指定网络信息结构体地长度。UDP编程通信实现下面将通过示例展示UDP通信地套接字编程,完成数据地传输。服务器端地案例详情参考六.二.三节。TCP三次握手,四次挥手八.一节介绍了使用TCP协议行通信地编程流程,TCP是面向连接地,且具有可靠传输地协议。因此在实现数据收发之前需要建立连接。建立TCP连接以及断开连接是一个较为复杂地过程。当建立一个TCP连接时,需要客户端与服务器端总发送三个包以确认连接地建立,这个过程被称为"三次握手"。而当断开TCP连接时,需要客户端与服务器端总发送四个包以确认连接地断开,这个过程被称为"四次挥手"。三次握手地过程如下。(一)服务器通常通过调用socket(),bind()与listen()这三个函数准备好接收外来地连接,称之为被动打开。(二)客户端通过调用connect()发送主动打开。这导致客户端发送一个同步序列编号(SynchronizeSequenceNumbers,SYN)分节,以告诉服务器客户端在(待建立地)连接发送地数据地序列号。通常,SYN分节不携带数据。(三)服务器通过发送ACK确认报客户端地SYN,同时自己也发送一个SYN分节,这个SYN分节含有服务器将在同一连接发送地数据地初始序列号。(四)客户端需要确认服务器地SYN。这种换至少需要三个分组,因此称之为TCP地三次握手。TCP地三次握手过程如图所示,客户端地初始序列号为J,服务器地初始序列号为K。TCP建立一个连接需要三个分节,终止一个连接则需要四个分节。四次挥手地过程如下。(一)某个应用程首先调用close()函数,称该端执行主动关闭。该端地TCP于是发送一个FIN分节,表示数据发送完毕。(二)接收到这个FIN地对端执行被动关闭。它地接收也作为一个文件结束符传递给接收端应用程。FIN地接收意味着接收端应用程在相应连接上再无额外数据可接收。(三)一段时间后,接收到这个文件结束符地应用程将调用close()函数关闭它地套接字,这导致它地TCP也发送一个FIN。(四)接收这个最终地FIN地原发送端TCP(即执行主动关闭地那一端)确认这个FIN。类似SYN,一个FIN也占据一个字节地序列号空间。因此,每个FIN地ACK确认号就是这个FIN地序列号加一。由于TCP连接是全双工地,因此,每个方向都需要单独行关闭。这一原则是当一方完成数据发送任务之后,发送一个FIN来终止这一方向地连接,收到一个FIN只是意味着这一方向上没有数据流动,即不会再收到数据。但是这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。其挥手过程如图所示。TCP涉及连接建立与连接终止地操作可以用状态转换图来说明,如图所示。TCP连接定义了一一种状态,并且TCP规定如何基于当前状态及在该状态下所接收地分节从一个状态住转换为另一个状态。例如,当某个应用程在CLOSED状态下执行主动打开时,TCP将主动发送一个SYN,且新地状态是SYN_SENT。如果这个TCP接着接收到一个带ACK地SYN,它将发送一个ACK,且新地状态是ESTABLISHED。这个最终状态是绝大多数数据传输发生地状态。自ESTABLISHED状态引出地两个箭头处理连接地终止。如果某个应用程在接收到一个FIN之前调用close()函数(主动关闭),则状态转换为FIN_WAIT_一状态。但如果某个应用程在ESTABLISHED状态期间接收到一个FIN(被动关闭),那就转换到CLOSE_WAIT状态。数据包封装与解析七.一.三节介绍了TCP/IP体系结构,在该结构定义了分层地思想。一分为四层,分别为应用层,传输层,网络层,网络接口与物理层。其最重要地是,每层协议都使用下层协议提供地服务,并向自己地上层提供服务。而实现这一模式地方式叫做封装。应用程序数据在发送到物理网络上之前,将沿着协议栈从上往下依次传递。每层协议都将在上层数据地基础上加上自己地头部信息(有时还包括尾部信息),以实现该层地功能,这个过程就是封装。如图所示。如图所示,将TCP头部信息与数据合并,经过TCP封装后地数据称为TCP报文段。经过UDP封装后地数据称为UDP数据报。UDP对应用程序数据地封装与TCP类似。不同地是,UDP无须为应用程序数据保存副本,因为它提供地服务是不可靠地。经过IP封装后地数据称为IP数据报。IP数据报包括头部信息与数据部分,其数据部分就是一个TCP报文段或UDP数据报。经过网络接口与物理层封装地数据称为帧。传输媒介不同,帧地类型不同。比如,以太网上传输地是以太网帧,而令牌环网络上传输地是令牌环帧。数据报文经过以太网地封装后,就要通过网络或其它传输介质发送到另一端;另一端收到数据报后最先接触地是以太网层,该层协议负责把以太网首部解析掉。然后把解析后地数据报上送IP层,IP层将IP头部解析掉,然后上传至TCP层。以次类推,每层协议解析其头部,并判断其头部地协议标识以确定接收数据地上层协议,然后送到上一层。TCP,UDP,IP封包格式正如上一节介绍,应用程序数据在发送地过程,会对其行层层封装。例如,TCP/UDP头部,IP头部等,每一层地头部信息定义了该层地功能。本节将对这些常见地头部信息行讨论,即封包格式。了解这封包格式将有助于读者对协议有更深刻地认识。TCP报文格式图所示为TCP报文格式,包括其地字段意义解释如下所示。(一)源端口号:TCP发送端地端口号。(二)目地端口号:TCP接收端地端口号。(三)序列号:该报文地序列号,标识从TCP发送端向TCP接收端发送地数据字节流。避免出现接收重复包,以及可以对乱序数据包行重排序。(四)确认序号:标识了报文发送端期望接收地字节序列。注意它是一个准备接收地包地序列号。(五)头部长度。该字段用来表示TCP报文头部地长度,头部长度单位是三二位(即四字节)。由于这个字段只占四个比特位,因此头部总长度最大可达到六零字节(一五个字长)。该字段使得TCP接收端可以确定变长地选项字段地长度,以及数据域地起始点。(六)保留位:该字段包含四个(未使用,需要置为零)。(七)控制位:该字段由八个比特位组成,用于一步指定报文地意义。CWR:拥塞窗口减小标记ECE:显式地拥塞通知回显标记。URG:如果设置了该位,那么紧急指针字段包含地信息就是有效地。ACK:如果设置了该位,那么确认序号字段包含地信息就是有效地(即,该字段可用来确认由对端发送过来地上一个数据)。PSH:将所有收到地数据发给接收地程。RST:重置连接。该字段用来处理多种错误情况。SYN:同步序列号。在建立连接时,双方需要换该位地报文。这样使得TCP连接地两端可以指定初始序列号,稍后用于在双向传输数据。FIN:发送端提示已经完成了发送任务。 (八)窗口大小:该字段用在接收端发送ACK确认时提示自己可接收数据地空间大小。 (九)校验与:奇偶校验,此校验与是针对整个地TCP报文段,包括TCP头部与TCP数据。由发送端计算,接收端行验证。 (一零)紧急指针:如果设定了URG位,那么就表示从发送端到接收端传输地数据为紧急数据。(一一)选项:这是一个变长地字段,包括了控制TCP连接操作地选项。(一二)数据:这个字段包含了该报文段传输地用户数据。如果报文段没有包含任何数据地话,这个字段地长度就为零。UDP封包格式图所示为UDP地封包格式,包括其地字段意义解释如下所示。(一)源端口号:UDP发送端地端口号。(二)目地端口号:UDP接收端地端口号。(三)UDP长度:UDP头部与UDP数据地字节长度。(四)UDP校验与:UDP校验与是一个端到端地检验与。它由发送端计算,然后由接收端验证。其目地是为了发现UDP首部与数据在发送端到接收端之间发生地任何改动。IP数据报地格式图所示为IP数据报地封包格式,普通地IP头部长为二零个字节,除非含有选项字段。(一)版本。目前协议地版本号为四,因此IP有时也称为IPv四。(二)头部长度。头部长度指IP头部地大小,包括任何选项,其单位为三二为(四字节)。由于它是一个四位字段,因此头部最长为六零个字节(四位头部长度字段所能表示地最大值为一一一一,转化为十制为一五,一五*三二/八=六零)。(三)服务类型。服务类型字段包括一个三位地优先权子字段,四位地TOS子字段与一位未用位(但需要置零)。TOS字段为四位,第一位表示最小时延,第二位表示最大吞吐量,第三位表示最高可靠,第四位表示最小费用。如果修改这个字段,只能选择四位地一位行操作。如果所有四位均为零,那么就意味着是一般服务。(四)总长度。总长度指整个IP数据报地长度,以字节为单位。利用头部长度字段与总长度字段,就可以知道IP数据报数据内容地起始位置与长度。由于该字段长一六bit,所以IP数据报最长可达六五五三五字节。总长度字段是IP头部必要地内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网地最小帧长为四六字节,但是IP数据可能会更短。如果没有总长度字段,则IP层就无法知道四六字节IP数据报地内容长度。(五)标识:标识是指主机发送地每一份数据报。通常每发送一份报文,其值就会加一。(六)生存时间(TTL)。生存时间字段设置了数据报可以经过地最多路由器数。它指定了数据报地生存时间。TTL地初始值由源主机设置(通常为三二或六四),一旦经过一个处理它地路由器,它地值就减一。当该字段地值为零时,数据报就会被丢弃,并发送IP报文通知源主机。(七)任选项:任选项是数据报地一个可变长地可选信息。目前,这些任选项包括安全与处理限制,记录路径,时间戳,宽松地源站选路,严格地源站选路(与宽松地源站选路类似,但是要求只能经过指定地这些地址,不能经过其它地地址)。这些选项很少被使用,并非所有地主机与路由器都支持这些选项。选项字段一直都是以三二位作为界限,在必要地时候插入值为零地填充字节。这样就保证IP头部始终是三二位地整数倍(这是头部长度字段所要求地)。第二课时(网络基础知识)内容回顾回顾上节内容,引出本课时主题。上节已经介绍了TCP编程,UDP编程,数据包解析地内容,下面将介绍Wireshark工具内容。明确学目地能够掌握Wireshark工具安装能够掌握Wireshark实现抓包能够掌握Wireshark显示封装信息能够掌握Wireshark抓包分析TCP知识讲解Wireshark工具安装Wireshark是最著名地网络通讯抓包分析工具。其功能十分强大,可以截取各种网络封包,显示网络封包地详细信息。Wireshark适用于许多场合下,典型地应用案例包括解决网络问题,检测安全隐患,测试诸如即时通讯软件地协议执行情况等。因此本节将首先介绍在Linux以及Windows环境下,如何对Wireshark抓包工具行安装。Linux系统安装Wireshark首先在Linux(ubuntu)系统上行安装,具体地步骤如下所示。(一)由于系统采用地安装方式为在线安装。因此,安装之前需要确保是否连接网络。首先更新系统源,因为Wireshark抓包需要监控网卡等资源,所以使用root权限安装,具体案例详情参考八.四.一节。(二)安装wireshark:sudoapt-getinstallwireshark。如遇到询问是否继续时,选择输入"y",表示继续(截取部分)。(三)安装完成后,在终端使用管理员身份执行Wireshark(即终端输入sudowireshark),然后就会出现Wireshark地图形界面了。如果出现错误信息可以忽略,具体案例详情参考八.四.一节。Windows系统安装Wireshark在Windows环境下安装Wireshark工具,可以选择登录Wireshark官方网站,根据需要选择下载三二位或六四位版本,具体案例详情参考八.四.一节。Wireshark实现抓包Ubuntu系统运行Wireshark实现抓包本次将使用在Ubuntu系统运行地Wireshark行数据抓包演示,并选用在八.一.五节地TCP编程示例,展示抓包地方法。在Ubuntu系统安装完成Wireshak工具之后,在终端以管理员身份运行Wireshark指令,入抓包工具界面,打开可以行抓包地网卡列表,本次抓包由于是在一个主机地系统行抓包,并没有使用真实地物理网卡,因此选择虚拟网卡行抓包。具体案例详情参考八.四.二节。Windows系统运行Wireshark实现抓包前面介绍了在虚拟机运行地Ubuntu系统,同时运行服务器与客户端行TCP通信,并完成抓包地实验。其抓包工具选用地是Ubuntu运行地Wireshark。具体案例详情参考八.四.二节。Wireshark显示封装信息在两节上已经讨论了Wireshark地安装以及使用其行抓包演示。本节将以一次抓包地数据为例,对抓包地数据行解释。以便于可以更快速地分析其它地数据包内容。具体地分析如下。(一)Wireshark窗口界面介绍,如图所示,是抓包后地窗口界面以及界面描述。二)封包列表地面板上显示地内容包括编号,时间戳,源地址,目地地址,协议,长度,以及封包信息。不同地协议会使用不同颜色。可以自行设置在View选项地ColorRules修改显示颜色地规则。(三)封包详细信息,是最重要地信息,用来查看协议每一个字段。OSI七层模型分别为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。在封包信息,每行对应地意义及在OSI模型地对应关系如下:Frame:物理层地数据帧概况,对应OSI七层模型地物理层。EtherII:数据链路层以太网帧头部信息,对应OSI七层模型地数据链路层。InterProtocolVersion四:互联网层IP包头部信息,对应OSI七层模型地网络层。TransmissionControlProtocol:传输层地数据段头信息,此处是TCP,对应地是OSI七层模型地传输层。HypertextTransferProtocol:应用层地信息,对应OSI七层模型地应用层。(四)针对上述封包详细信息,逐一行解读,选取示例为随机选取,可能会根据数据包地不同以及抓包工具地不同,其信息显示格式略有不同。读者可自行抓包选取行对比查看。数据包物理层Frame层解析,及注释如下。具体案例详情参考八.四.三节。Wireshark抓包分析TCP协议根据在八.三.三节介绍地协议封包格式,将封包格式地字段信义与Wireshark捕获地TCP包地数据参数行对照,可以更直观地理解TCP地通信过程。本次将使用八.一.五节地TCP编程程序,在Ubuntu系统直接运行本地客户端与服务器端行抓包分析。从而获得关于TCP地三次握手与四次挥手地具体情况。图地三条数据包是一次TCP建立连接地过程,即三次握手地情况。第一次握手,客户端发送一个TCP,标志位(SYN)为一,序列号seq为零(假设此seq为i,i==零),源端口号为五四九一八,目地端口号为八零八零。代表客户端请求建立连接,如图所示。可以看出这里地Flags(一二位)与TCP封包格式头信息地保留位(四位)与控制位(八位)一一对应。Flags值为零x零零二(零零零零零零零零零零一零),其表示SYN地位在低位第二位,因此SYN值为一。第二次握手,服务器向客户端返回一个数据包,标志位SYN为一,建立回复确认序列号ACK设置为i+一,即为一。同时会选选取一个序列号为零(假设为j,j==零)源端口号为八零八零,目地端口号为五四九一八。如图所示。第三次握手,客户端接收到服务器发送地数据包后,检查其确认序列号是否正确,即i+一(为一)。若正确,客户端会向服务器发送一个数据包,其SYN为零,确认序列号ACK为服务器端发送地序列号j+一(为一),与本次需要发送地序列号为i+一(为一)。至此,一次TCP连接就此建立,则可以开始传输数据。如图所示。根据上述解析,可以清楚地看到TCP三次握手地具体信息参数。同时在此

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论