福州大学网络程序设计考点完美版.docx
- 文档编号:6442019
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:34
- 大小:67.39KB
福州大学网络程序设计考点完美版.docx
《福州大学网络程序设计考点完美版.docx》由会员分享,可在线阅读,更多相关《福州大学网络程序设计考点完美版.docx(34页珍藏版)》请在冰豆网上搜索。
福州大学网络程序设计考点完美版
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
第一章网络编程概述
1.3网络协议
1、套接口编程接口(API)位置
套接口编程接口(API)位置
上三层(应用层)到传输层的接口
使用套接口编写使用TCP/UDP协议的网络应用程序
理由
应用层处理具体应用(FTP、Telnet、HTTP)的细节;对通信细节一无所知
下四层,处理通信细节:
收发数据、等待确认、排序、计算和验证校验和;对应用一无所知
应用层构成用户的进程;下四层为OS内核的一部分提供
2、internet协议(IP)、图
Internet协议(IP)
网际协议IP是TCP/IP的核心协议,也是网络层中最重要的协议。
接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到TCP层或UDP层;
把从TCP或UDP层接收来的数据包传送到更低层。
IP协议提供面向无连接的、不可靠的数据报传输服务
没有确认数据包顺序和是否被破坏
IP数据包含源地址和目的地址。
高层的TCP和UDP服务以IP地址为认证基础。
提供了递送分组的服务
3、internet消息控制协议(ICMP)、图
1)ping
2)差错报告,测试报告
Internet消息控制协议(InternetControlMessageProtocol)
ICMP与IP位于同一层,用来传送IP的控制信息
ICMP数据包被封装在IP数据包的数据部分中进行传输
发送IP数据包时发生错误,路由器使用ICMP协议来报告错误消息和控制消息
PING是最常用的基于ICMP的服务(回显应答与回显请求,两种报文)
差错报告和测试查询两类
一般由TCP/IP网络软件自身处理,而非用户进程
4、internet组管理协议(IGMP)
Internet组管理协议(IGMP)
IGMP数据包也是嵌入在IP数据包内进行传输
多播路由器使用IGMP协议来查询多播组内有哪些主机,主机则在加入和退出多播组时使用IGMP协议向路由器发出通告,或者使用IGMP协议响应多播路由器的查询
IPv4中可选,IPv6中没有
6.用户数据报协议(UDP)
端口号概念
用户数据报协议(UDP)
UDP与TCP位于同一层(传输层),都建立在IP协议的基础上
提供非面向连接的和不可靠的简单的数据报服务
不可用于使用虚电路的面向连接的服务
主要用于面向查询/应答的服务
具有较高的效率,不须要花费开销建立连接;常用于交换量较少的服务如:
NFS
每个客户机的请求都是独立和无序的对客户机而言,每个服务器的应答都是独立和无序的
同一个客户端用同一个套接口可以与多个服务器收发数据包,反之也是
UDP协议增加了端口号的概念
不同的进程使用不同的端口
每个端口有一个惟一的整数标识
端口号分为公认端口和自由端口号两种
服务器使用公认端口号来提供服务
客户机使用自由端口号与服务器通信
小于1024的端口号被用做保留端口号,常被用来提供公共服务。
例如HTTP服务的标准端口号是80,FTP的标准端口号是21。
必须在应用程序上建立特性,确保可靠性
7、传输控制协议(TCP)
可靠性(本身不能保证把数据传送到对方,只是可靠投递或故障的可靠通知)
传输控制协议(TransmissionControlProtocol)
提供虚电路服务,它面向连接,提供可靠、双向、有序、无重复的数据流服务---无记录边界
可以解决网络通信中的数据丢失、重复、出错、无序等问题
TCP协议根据接收方所能接收信息的最大发送速度传输数据
并以接收方所能接收的最大发送长度把用户数据分段发送
其本身并不能保证把数据传送到对方,只是可靠投递或故障的可靠通知
协议描述
通信之前,必须先建立一条连接;通信结束,应该断开连接
用确认和超时重传保证通信的可靠性
用序列号保持字节流的顺序;为每个要发送的字节数据分配一个序列号,并将起始序列号通知对方
提供流量控制,接收方总是把它能接收的数据量告诉对方,设置了一个大小可变的接收窗口。
窗口大小在确认数据段中,通知对方,发送方据此发送数据
全双工信道
TCP不支持多点播送或广播
8、码位
码位:
URG(urgent)位:
如果使用紧急数据指针,则将这一位设置成1。
ACK(acknowledge)位:
如果确认序列号有效,则将这一位设置成1。
PSH(push)位:
表示“推”数据,如果这一位设置成1,则表示希望接收方在接收到这个数据段之后,立即将它传送给高层应用程序,而不是缓存起来。
RST(reset)位:
表示请求重置连接。
当TCP协议接收到一个不能处理的数据段时,向对方TCP协议发送这种数据段,表示这个数据段所标识的连接出现了某种错误,请求对方TCP协议将这个连接清除。
SYN(synchronize)位:
请求建立连接。
TCP用这种数据段向对方TCP协议请求建立连接。
在这个数据段中,TCP协议将它选择的初始序列号通知对方,并且与对方协议协商最大数据段的大小。
SYN数据段的序列号为初始序列号,这个SYN数据段能够被确认。
当协议接收到对方这个数据段的确认之后,建立TCP连接。
紧急指针:
如果设置了紧急指针位(URG),这个域指出紧急数据相对于这个数据段的开始序列号的偏移量。
TCP协议只提供一字节的紧急数据
紧急指针指向紧急数据的下一个字节位置。
9建立连接(三次握手)、图
建立连接
双方发送各自的同步请求,并收到对方确认
A→BSYNmysequencenumberisX。
A向B发送同步请求,附序号X
A←BACKyoursequencenumberisX。
B响应序号为X的A同步请求
A←BSYNmysequencenumberisY。
B向A发送同步请求,附序号Y
A→BACKyoursequencenumberisY。
A响应序号为Y的B同步请求
10、TCP连接终止
TCP连接终止
客户端调用close,主动关闭,发送FIN,表示数据发送完毕(假设客户端主动关闭)
服务器接收到FIN,被动关闭,由TCP确认这个FIN。
将文件结束符传递给接收端应用程序,表明应用程序再也接收不到数据
一段时间后,服务器调用close关闭它的套接口,也发送一个FIN
客户端收到FIN并确认
总之,每个方向都有一个FIN和ACK
11、标识一条连接,状态转换图
四个信息{本地IP地址、本地端口号、远地IP地址、远地端口号}
标识一条连接
TCP协议中,使用四个信息完全标识一条连接:
{本地IP地址、本地端口号、远地IP地址、远地端口号}。
连接一端的IP地址和端口号组成了一个套接口(socket)的地址部分。
连接双方的套接口组成一个套接口对,一个套接口对惟一地标识一条TCP连接。
12、TIME_WAIT存在的两个理由
TIME_WAIT状态存在的两个理由:
主动关闭的那端进入TIME_WAIT状态,持续时间是2个MSL(最大分节生命期)
可靠的实现TCP全双工连接的终止
假设最终的ACK丢失允许老的重复分节在网络中的消逝
13、流控制传输协议特性
流控制传输协议(StreamControlTransmissionProtocol)
较新的协议
在客户和服务器之间提供关联,应用层提供可靠性、有序、流量控制以及全双工的数据传输服务。
(TCP)
面向消息的通信,提供各个记录按序投递服务,保护数据消息边界(UDP)
14、TCP.UDP
1)PDU
2)SDU
3)如何分片
TCP和UDP的PDU、SDU和分片(MSS,MTU)
PDU(协议数据单元):
对等实体间交换的单位信息
SDU(服务数据单元):
每层的PDU通过由相邻下层提供的服务接口,作为下层的SDU传递给下层,由下层间接完成本层的PDU交换
如果本层PDU大小超过紧邻下层的最大SDU,本层事先将PDU分片让下层载送,再在反方向上重组。
1.4网络编程模式与编程接口
1.客户机、服务器模式(C/S)
1)重复服务器
2)并发服务器
3)典型C/S模型
客户机/服务器模式(C/S模式)
服务器:
为应用提供服务的主机;一直等待客户请求,以便为客户提供服务
客户机:
向服务器提出服务要求,并等待传回的结果
服务:
文件传送,电子邮件,远程登录,时间服务
网络应用的标准模型是C/S模型
C/S模型是非对称模型
重复服务器(iterativeserver),也称循环服务器
在同一个时刻只可以响应一个客户端的请求。
这种服务器上的进程能够预知在短时间内可以处理完请求,便亲自处理它。
例如,典型的服务是通报时间。
并发服务器(concurrentserver)
在同一个时刻可以响应多个客户端的请求。
这种服务器上的进程事先不能预知完成服务请求需要花多长时间,便以并发的方式处理它。
并发服务器通过激活别的进程来完成服务请求,而本身转入睡眠状态以等待另一个请求的到来。
典型的服务是处理文件信息,例如对文件的访问和打印文件。
1.6变元表。
环境表.gcc编译器。
gdb常用命令
变元表
变元表是用来向执行的程序提供参数的
指向字符串的指针数组
其长度可变,最大长度不应超过5120或10 240个字节
在C语言中变元表主要用argc,argv表示。
C语言的main函数格式为:
main(intargc,charargv[])
{
…
}
main函数argc,argv参数根据需要可有可无
变元表存放在进程的数据空间中,进程可以使用这些参数
当一个程序被激活时,通常把这些参数放进初始堆栈
main(intargc,char*argv[ ])
{
printf("argc:
%d\n",argc);
printf("argv:
%s",argv[0]);
}
第二章基于TCP套接口的编程
2.2套接口和套接口地址
1、linux系统的套接口
套接口是两个通信通道上的端节点
套接口函数可以用来产生通信信道,通过信道两个应用程序间可以传送数据
Linux系统的套接口
网络编程接口,支持多种协议
套接口地址结构“sockaddr_”开头,并以对应协议族的唯一后缀结束
sockaddr_in、sockaddr_in6、sockaddr_un
通用的套接字地址结构
structsockaddr
{
unsignedshortsa_family;
/*地址类型,AF_xxx,2个字节*/
charsa_data[14];
/*协议地址,14个字节*/
};//16字节
2、值—结果参数
值——结果参数
函数调用时,结构大小是一个值
告诉内核结构的大小,内核在写结构时不会越界
函数返回时,结构大小是一个结果
告诉进程结构中确实存在的信息量
若套接口地址结构为定长:
返回值是定长
sockaddr_in(16B)、sockaddr_in6(28B)
若套接口地址结构为变长:
返回值是比最大值小
sockaddr_un
3、网络字节顺序、主机字节顺序
网络字节顺序与主机字节顺
内存中存储字节的两种方法
将低序字节存储在起始地址:
小端字节序
将高序字节存储在起始地址:
大端字节序
将给定系统所用的字节序称为主机字节(hostbyteorder)
这两种方式都有系统使用
网际协议在处理多字节整数(如传输TCP分节的协议地址16位端口号,32位IP地址)时,使用大端字节序。
套接口地址结构中的某些成员需要按网络字节序进行维护
在填充套接口地址结构前必须考虑主机字节到网络字节之间的转换
4、IP地址的使用,功能
IP地址的使用
设置sockaddr_in类型地址时,需要进行字符串形式的IP地址和二进制形式的地址间转换:
#include
#include
#include
intinet_aton(constchar*cp,structin_addr*inp);
//点分十进制字符串à网络字节顺序二进制值
unsignedlongintinet_addr(constchar*cp);
//点分十进制字符串à网络字节顺序二进制值
//以255.255.255.255表示出错,不能表示此广播地址
char*inet_ntoa(structin_addrin);
//网络字节顺序二进制值à点分十进制字符串
2.3基本套接口函数
1、TCP数据流流程图
2、socket()、socketpair()(socketpair()产生两个套接口)
socket()函数
执行网络通信,进程调用socket函数,指定期望的通信协议
#include
#include
intsocket(intdomain,inttype,intprotocol);
socketpair()
socketpair()产生两个套接口,并连接这两个套接口,返回这两个套接口描述字
3、connect()
三种出错返回
状态转换:
CLOSED状态—SYN_SENT状态—ESTABLISHED状态
connect函数
TCP客户端与服务器建立连接用connect函数
未连接的套接口à主动连接套接口
#include
#include
intconnect(intsockfd,structsockaddr*addressp,intaddrlen);
成功返回:
0;出错返回:
-1
connect的三种出错返回
[1]若TCP客户没有收到SYN分节的响应(ACK)——返回ETIMEOUT错误
调用connect函数时,系统发送SYN,若无响应则等待6秒钟再发送一个,若仍然无响应则等待24秒钟后再发送一个SYN。
总共等75秒后仍未收到响应则返回该错误。
[2]若对客户的SYN响应是RST,则表示该服务器主机在指定端口上没有进程在等待与之连接
称为硬错(harderror),客户收到RST立即返回ECONNREFUSED错误
目的地为某端口的SYN到达,该端口上没有正在监听的服务器
TCP想取消一个已有连接
TCP接收到一个根本不存在的连接上的分节
【3】若客户发出的SYN在中间的某个路由器上引发一个“destinationunreachable目的地不可达”ICMP错误
称为软错(softerror)
客户机内核保存该消息,按第一种方式继续发送SYN,规定时间内无响应,则将保持的消息(ICMP错误报文)作为EHOSTUNREACH或ENETUNREACH错误返回。
收到一次ICMP错误后,必须继续发送SYN,这种错误可能是暂时情况。
CLOSED状态àSYN_SENT状态àESTABLISHED状态
若失败则套接口不再可用了,必须关闭,不能再在该套接口上调用connect函数,需要重新调用socket
4、listen()
listen函数
监听端口:
未连接的套接口à被动套接口
内核应该接收指向该套接口的连接请求
套接口状态:
CLOSEDàLISTEN
服务端在socket和bind后,accept前调用
#include
intlisten(intsockfd,intbacklog)
功能:
监听本地地址和端口
参数:
sockfd-已绑定的socket描述符
backlog-已完成连接、等待接收的队列长度
返回值
0-成功,-1-失败
5、等待队列
当客户SYN到达时,若队列是满的··········
如果返回RST················
等待队列
未完成连接队列:
客户端发来的SYN分节对应其中一项;服务器正等待完成相应TCP三次握手。
服务端为SYN_RCVD状态
已完成连接队列:
每个已完成三次握手的客户对应其中一项。
服务端为ESTABLISHED状态
未完成队列+完成队列 当客户SYN到达时,若队列是满的,TCP就忽略该分节,不发送RST分节。 客户端会重发SYN,期望不久在队列中找到可用空间 如果返回RST则出现: connect立即返回错误,客户端也不知是“端口没有监听”还是“端口在监听,而队列满了” 6.accept()(完成三次握手) TCP服务器调用 从已完成连接队列头返回下一个已完成连接 已完成队列为空,则进程睡眠 执行步骤: (1)服务请求到达accept()函数监视的socket(监听套接口) (2)socket执行体将自动建立一个新的socket(已连接套接口) (3)并将此socket和客户进程连接起来 (4)监听套接口继续接收到达的服务请求 #include #include intaccept(intsockfd,sockaddr*cliaddr,int*addrlen); 成功返回: 非负套接字;出错返回: -1 7、套接口的生存期 套接口的生存期 监听套接口(socket创建)在服务器的生命期内一直存在已连接套接口(accept创建)服务器完成该客户端进程服务时,关闭该套接口 8、close() 考虑计数器 注意 close()函数 用来关闭套接口,终止TCP连接 #include intclose(intfd); 注意: close引发相应套接口描述字的引用计数器减一 若引用计数器值仍大于0,该close不引发TCP的四分组连接终止序列 只有在引用计数器=0时,才关闭套接口 例如: 并发服务器中,父进程close已连接套接口,不影响子进程对该套接口的使用 close的两个限制 仅当计数器=0时,才关闭套接口 Close终止数据发送的两个方向: 读与写; TCP是全双工的 9、并发服务器(实验)fork的典型用法 fork函数: #include #include pid_tfork(void); fork的两个典型用法: (1)进程创建一个自身的拷贝,该拷贝都可以在另一个拷贝执行其他任务的时候处理各自的操作如: 网络服务器 (2)一个进程要执行另一个程序 创建自身拷贝后,其中一个拷贝调用exec吧自身换成新的程序 2.4高级套接口函数 9、send()、recv() send()和recv() 与write函数和read函数类似,用来发送数据 可用于TCP或者UDP通信协议 采用数据报传送方式时,应利用connect()函数给出所连接的套接口地址 #include #include intsend(intsockfd,constvoid*buf,size_tlen,intflags); intrecv(intsockfd,void*buf,size_tlen,intflags); sockfd: 套接口的文件描述符;buf: 数据缓冲区;len: 数据缓冲区字节数 flags: 发送/接收数据的控制参数 返回值: -1失败;>0成功。 10、sendto()、recvfrom() sendto()与recvfrom()函数 两个函数均可用于TCP或者UDP通信协议 #include #include intsendto(ints,constvoid*msg,size_tlen,intflags,conststruct sockaddr*to,socklen_ttolen); intrecvfrom(ints,void*buf,size_tlen,intflags,structsockaddr *from,socklen_t*fromlen); from: 发送数据的套接口地址 to: 数据要发送的目的套接口地址 tolen: 目的地址字节数 fromlen: 源地址字节数(值-结果参数) 返回值: 读写数据的长度 11、readv()/writev() readv和writev函数 与read/write类似,用于一次读写多个非连续缓存 readv: 分散读,读操作的输入数据分散到多个应用缓冲区中 writev: 集中写,多个应用缓冲区的输出数据被集中提供给单个写操作 二者可以用于任何描述字: 套接口描述字,文件描述字等 函数 任何描述字 仅套接口描述字 单个读/写缓冲区 分散/集中读/写 可选标志 可选对端地址 可选控制信息 read/write √ √ readv/writev √ √ recv/send √ √ √ recvfrom/sendto √ √ √ √ recvmsg/sendmsg √ √ √ √ √ 12、几种IO函数的差异(图) 13、shutdown() shutdown() 终止网络连接并停止所有信息的发送与接收 不管引用计数器为何值 #include intshutdown(intsockfd,inthow); 参数说明: sockfd: 套接口描述字 how: 套接口关闭方式 14、多路复用(概念、select()函数、中间三个参数、描述子集、低潮标记、select返回某个套接口就绪小结) 内核发现进程指定的一个或多个I/O条件就绪,就通知进程: 这种方式称为多路复用 I/O复用在网络编程中的典型应用: 客户机处理多个描述字时,使用I/O复用。 (交互式输入与网络套接口) 客户同时处理多个套接口时,使用I/O复用 一个TCP服务器,既要处理监听套接口,又要处理已连接套接口,使用I/O复用 如果一个服务器要处理多个服务或者多个协议,一般也要用I/O复用。 (如inetd守护进程) Unix下可用的5种I/O模型: 阻塞I/O 非阻塞I/O I/O复用(select函数、poll函数、pselect函数) 信号驱动I/O(SIGIO) 异步I/O(POSIX的aio_***函数) select函数——同步多路复用 可对任何描述字进行操作 将多个套接字组成一个集合 使用select函数对集合进行监控 集合中任一个描述符就绪,进程就作相应的I/O处理 或者经历指定时间后唤醒进程 中间三个参数 readset,writeset和exceptset: 指定让内核测试的读、写和异常条件到达的描述字 每个描述字集合指定一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 福州大学 网络程序设计 考点 完美