全套课件·《Linux/UNIX网络编程》1.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《全套课件·《Linux/UNIX网络编程》1.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LinuxUNIX网络编程 全套 课件 Linux UNIX 网络 编程
- 资源描述:
-
1、Linux/UNIX网络编程先修课程C语言TCP/IP协议操作系统原理Linux的基本使用Linux系统基础系统基础软件开发环境最常用编辑工具:vi编译器:gcc,g+gcc编译c程序 g+编译c+程序调试器:gdb基本的C/S服务模型 n简单的客户/服务器模型1、数据请求2、数据响应无连接3、数据请求4、数据响应1、连接请求2、连接响应5、关闭请求6、关闭响应复杂的客户/服务器模型WEB服务器和客户端之间的数据传输过程 OSI 与 TCP/IP应用层表示层会话层传输层网络层数据链路层物理层应用层IPv4,IPv6网络介质层TCPUDPOSI模型TCP/IP模型网络编程接口通过路由器连接的两个
2、网络FTP客户TCPIP以太网驱动程序FTP服务器TCPIP令牌环驱动程序令牌环以太网驱动程序令牌环驱动程序IPFTP协议TCP协议IP协议IP协议以太网客户服务器数据进入协议栈时的封装用户数据用户数据App头部用户数据TCP头部用户数据TCP头部IP头部用户数据TCP头部IP头部以太网头部以太网尾部以太网帧401500字节FTP客户TCPIP以太网驱动程序TCP段IP分组以太网数据帧分用过程以太网帧ARPRARPIPICMPIGMPTCPUDP应用程序应用程序应用程序应用程序进入的帧根据以太网首部中的帧类型进行分用根据IP首部中的协议类型进行分用根据TCP或UDP首部中的端口号进行分用UDP
3、:用户数据报协议 UDP提供无连接服务 UDP缺乏可靠性支持,应用程序必须实现:确认、超时、重传、流控等 UDP面向记录服务UDP数据报格式源端口目的端口长度校验和数据01531#ifdef _FAVOR_BSDstruct udphdr u_int16_t uh_sport;/*source port*/u_int16_t uh_dport;/*destination port*/u_int16_t uh_ulen;/*udp length*/u_int16_t uh_sum;/*udp checksum*/;#elsestruct udphdr u_int16_t source;u_int
4、16_t dest;u_int16_t len;u_int16_t check;#endifTCP:传输控制协议 TCP是面向连接的。TCP提供可靠性,实现了丢失重传。RTT的估算。TCP通过给所发送数据的每一个段管理一个序列号进行排序。TCP提供流量控制和拥塞控制:通告窗口、拥塞窗口。TCP的连接是全双工的。TCP协议数据段格式HLEN窗口序列号确认号源端口目的端口保留码位校验和紧急指针选项填充字节数据URGACKPSHRSTSYNFIN015317首部数据区TCP协议数据段格式(续)struct tcphdr WORD SourPort;WORD DestPort;DWORD SeqNo;
5、DWORD AckNo;BYTE HLen;BYTE Flag;WORD Window;WORD ChkSum;WORD UrgPtr;/*Put options here.*/;TCP协议数据段格式(续)TCP协议数据段格式(续)TCP协议数据段格式(续)TCP三路握手客户服务器SocketConnect(阻塞)(主动打开)Socket,bind,listen(被动打开)SYN xSYN y,ack x+1ack y+1Accept返回Read阻塞Connect返回TCP连接的建立 TCP连接的过程:服务器必须准备好接受外来的连接。通过调用socket,bind,listen函数完成。称为被
6、动打开。客户通过调用connect进行主动打开。这引起客户TCP发送一个SYN分节,告诉服务器客户将在连接中发送的数据的初始序列号。服务器必须确认客户的SYN,同时自己也得发送一个SYN分节。服务器以单个分节向客户发送SYN和对客户的SYN的ACK。客户必须确认服务器的SYN。TCP连接关闭客户服务器Close主动关闭被动关闭Read返回0FIN Mack N+1Closeack M+1FIN NTCP连接终止 TCP一般用四个分节终止一个连接:某个进程首先调用close,这一端的TCP于是发送一个FIN分节,表示数据发送完毕。主动关闭。另一端称为被动关闭。TCP对接收的FIN分节进行确认,并
7、以文件结束标志传递给应用程序。一段时间后,接收到文件结束标志的应用程序调用close,这也导致向对方发送一个FIN分节。接收到这个FIN分节的原发送方TCP对它进行确认。还有一种关闭称为“半关闭”(half-close)CLOSELISTENSYN_RCVDSYN_SENTESTABLISHEDCLOSE_WAITLAST_ACKFIN_WAIT1FIN_WAIT2TIME_WAITCLOSING被动关闭主动关闭应用:close或超时接收:ACK发送:应用:close发送:FIN应用:主动打开发送:SYN起始点应用:被动打开发送:接收:SYN;发送:SYN,ACK接收:RST接收:SYN发送:
8、SYN,ACK,同时打开接收:ACK发送:应用:close发送FIN同时关闭接收:ACK发送:接收:FIN,ACK发送:ACK接收:FIN发送:ACK,接收:ACK发送:2MSL超时?接收:SYN,ACK发送:ACK接收:FIN发送:ACK接收:FIN发送:ACK,表示客户的状态转换表示服务器的状态转换socket,bind,listenLISTEN(被动打开)accept阻塞SocketConnect(阻塞)(主动打开)SYN_SENTSYN_RCVDESTABLISHEDESTABLISHEDaccept返回read阻塞read返回客户构造请求WriteRead(阻塞)WriteRead阻
9、塞Read(返回)CLOSE_WAIT(被动关闭)Read返回0CloseLAST_ACKClose(主动关闭)FIN_WAIT1FIN_WAIT2TIME_WAITCLOSED2MSLSYN J,mss=1460SYN K,ACK J+1,mss=1024ACK k+1数据(请求)数据(应答),请求ack应答ackFIN MACK M+1FIN NACK N+1TCP连接中的分组交换TCP 的TIME_WAIT状态 难点:执行主动关闭的那端进入这种状态。这个端点在该状态的持续时间是2MSL(最长分节生命周期)。存在TIME_WAIT状态的两个理由?物理地址:即MAC地址 逻辑地址:即IP地址
10、 端口地址:应用程序端口号 域名地址:取代IP地址记忆物理地址 48位:24位OUI,24位由厂商分配 平面地址,无结构 全球唯一 局部范围寻址 存在于数据链路层IP地址 IP地址标识着网络一个主机的位置。每个IP地址都是由32位(或128位)组成,分成两部分:网络号、主机号。全球唯一,寻址容易 两种表示形式:二进制(计算机内部)、点分十进制(便于记忆)IP地址分类0 NetID10110NetID1110Multicast AddressHostIDNetIDHostIDHostID8 bits8 bits8 bits8 bits0126128191192223224239基本套接字编程主要
11、内容主要内容 套接字基础 套接字地址结构 套接字基本函数 套接字基础套接字基础 网络编程接口有两个发展方向:Socket,TLI 套接字是一种网络API,程序员可以用之开发网络程序。进程1进程2网络编程接口(socket)网络通信协议服务接口(TCP/IP)底层通信协议和网络介质套接字类型套接字类型 套接字支持多种通信协议:Unix:Unix系统内部协议 INET:IP版本4 INET6:IP版本6 Linux支持多种套接字类型,即应用程序希望的通信服务类型 SOCKET_STREAM:双向可靠数据流,对应TCP SOCKET_DGRAM:双向不可靠数据报,对应UDP SOCKET_RAW:是
12、低于传输层的低级协议或物理网络提供的套接字类型,可以访问内部网络接口。例如接收和发送ICMP报套接字地址结构(IPv4)大多数套接字函数需要一个指向套接字地址结构的参数,每个协议族都定义它自己的套接字地址结构,一般以”sockaddr_”开头,并以协议簇为后缀。(netinet/in.h)typedef uint32_t in_addr_t;typedef uint16_t in_port_t;typedef unsigned short sa_family_t;struct in_addr in_addr_t s_addr;struct sockaddr_in uint8_t sin_len
13、;sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;char sin_zero8;struct sockaddr_in serverbzero(&server,sizeof(server)server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr.s_addr=htonl(INADDR_ANY).IPv6地址为128位。(netinet/in.h)套接字地址结构(IPv6)typedef uint16_t in_port_t;type
14、def unsigned short sa_family_t;struct in6_addr uint8_ts6_addr16;struct sockaddr_in6 uint8_t sin6_len;sa_family_t sin6_family;in_port_t sin6_port;uint32_t sin6_flowinfo;struct in6_addr sin6_addr;sin6_flowinfo成员分成三个字段:n低24位是流量标号;n下4位是优先级;n再下4位保留IPv4与IPv6地址结构比较长度AF_INET616位端口号32位流标签128位IPv6地址sockaddr_i
15、n6 长度AF_INET16位端口号32位IP地址未用sockaddr_in 固定长度(16字节)固定长度(24字节)通用套接字地址结构通用套接字地址结构 由于套接字函数需接收来自不同协议的地址结构,ANSI的办法是使用通用的指针类型,即(void*).套接字函数方法是定义一个通用的套接字地址结构。struct sockaddr uint8_t sa_len;sa_family_t sa_family;char sa_data14;这就要求调用套接字函数时,需将指向特定于协议的地址结构的指针类型转换成指向通用的地址结构的指针,如:struct sockaddr_in serv bind(soc
16、kfd,(struct sockaddr*)&serv,sizeof(serv);字节排序函数 为保证”大端“和”小端“字节序的机器之间能相互通信,需在发送多字节整数时,将主机字节序转换成网络字节序,或反之。高序字节低序字节MSB(最高有效位)16位值 LSB高序字节低序字节内存地址增大方向内存地址增大方向小端字节序大端字节序网络字节序字节排序函数(cont.)#include uint16_t htons(uint16_t hostshort)uint32_t htonl(uint32_t hostlong)均返回:网络字节序值uint16_t ntohs(uint16_t netshort
17、)uint32_t ntohl(uint32_t netlong)均返回:主机字节序值h:主机 n:网络 s:短整数 l:长整数字节操纵函数#include void bzero(void*dest,size_t nbytes);void bcopy(const void*src,void*dest,size_t nbytes);int bcmp(const void*src,void*dest,size_t nbytes);/*返回0则相同,非0不相同*/上述三个函数源自BSDvoid*memset(void*dest,int c,size_t len);void*memcpy(void*d
18、est,const void*src,size_t nbytes);int memcmp(const void*ptr1,const void*ptr2,size_t nbytes)上述三个函数属于ANSI C地址转换函数#include 将点分十进制数串转换成32位网络字节序二进制值。int inet_aton(const char*cp,struct in_addr*inp);返回:1-串有效,0-串有错in_addr_t inet_addr(const char*cp);返回:若成功,返回32位二进制的网络字节序地址,若有错,则返回一个 常值INADDR_NONE(32位均为1).ine
19、t_aton函数将cp所指的字符串(点分十进制数串,如192.168.0.1)转换成32位的网络字节序二进制,并通过指针inp来存储。这个函数需要对字符串所指的地址进行有效性验证。但如果cp为空,函数仍然成功,但不存储任何结果。inet_addr进行相同的转换,但不进行有效性验证,也就是说,所有232种可能的二进制值对inet_addr函数都是有效的。地址转换函数(续)地址转换函数(续)char*inet_ntoa(struct in_addr inaddr);返回:指向点分十进制数串的指针 函数inet_ntoa将32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。但由于返回值所
20、指向的串留在静态内存中,这意味着函数是不可重入的。需要注意的是这个函数是以结构为参数的,而不是指针。上述三个地址转换函数都只能处理IPv4协议,而不能处理IPv6地址。地址转换函数(地址转换函数(cont.)#include int inet_pton(int family,const char*strptr,void*addrptr);返回:1-成功,0输入无效,-1:出错const char*inet_ntop(int family,const void*addrptr,char*strptr,size_t len);返回:指向结果的指针成功,NULL出错字母P和N分别代表presenta
21、tion(地址的表达格式)和numeric(数值格式)。family参数可以是AF_INET,也可以是AF_INET6。长度参数len是目标的大小,如果太小无法容纳表达格式结果,则返回一个空指针。另外,目标指针调用前必须先由调用者分配空间。表达式格式数值格式inet_pton(AF_INET)inet_aton,inet_addr适用IPv4地址inet_ntop(AF_INET)inet_ntoainet_pton(AF_INET4/6)即可用于IPv4地址,又可用于IPv6地址inet_ntop(AF_INET4/6)适用IPv6地址inet_pton(AF_INET6)inet_ntop
22、(AF_INET6)表达式格式表达式格式数值格式数值格式Tcp套接字编程TCP套接字编程(cont.)基本套接字函数socket#include int socket(int family,int type,int protocol)返回:非负套接字(sockfd)成功;-1出错。family:协议族;type:套接字类型;protocol:一般为0,除原始套接字外。family typeAF_INET IPv4协议SOCK_STREAM 字节流套接口AF_INET6IPv6协议SOCK_DGRAM 数据报套接口AF_LOCALunix域协议SOCK_RAW 原始套接口AF_ROUTE 路由套
23、接口AF_KEY 密钥套接口Protocol:指明此socket请求所使用的协议,可以使用如下相关符号常数来表示。IPPROTO_TCP:表示TCP协议IPPROTO_UDP:表示UDP协议 AF_INET AF_INET6 AF_LOCAL AF_ROUTE AF_KEY SOCK_STREAM TCP TCP Yes SOCK_DGRAM UDP UDP Yes SOCK_RA W IPv4 IPv6 Yes Yes 基本套接字函数bind#include int bind(int sockfd,const struct sockaddr*addr,socklen_len len)返回:0
24、成功;-1出错并置errno 该函数指明套接字将使用本地的哪一个协议端口进行数据传送(IP地址和端口号),注意:协议地址addr是通用地址。Len是该地址结构(第二个参数)的长度。一般而言,服务器调用此函数,而客户则很少调用它。绑定地址时,可以指定地址和端口号,也可以指定其中之一,甚至一个也不指定。通配地址:INADDR_ANY,其值一般为0,它通知内核选择IP地址。IP地址 端口 结果通配地址 0 内核选择IP地址和端口号通配地址 非0 内核选择IP地址,进程指定端口本地IP 0 进程指定IP地址,内核选择端口本地IP 非0 进程指定IP地址和端口号 若指定端口号为0,调用函数bind时,内
25、核选择一个临时端口(在实际中,端口号都要指定);但若指定一个通配IP地址,则直到套接字已连接(TCP)或数据报已在套接字上发出(UDP),内核才选择一个本地IP地址。bind函数的用法struct sockaddr_in addr;int port=1234;int opt=SO_REUSEADDR;setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt);bzero(&server,sizeof(server);addr.sin_family=AF_INET;addr.sin_addr.s_addr=htonl(INADDR_ANY);ad
展开阅读全文