福州大学网络程序设计考点完美版Word下载.docx
《福州大学网络程序设计考点完美版Word下载.docx》由会员分享,可在线阅读,更多相关《福州大学网络程序设计考点完美版Word下载.docx(40页珍藏版)》请在冰豆网上搜索。
提供非面向连接的和不可靠的简单的数据报服务
不可用于使用虚电路的面向连接的服务
主要用于面向查询/应答的服务
具有较高的效率,不须要花费开销建立连接;
常用于交换量较少的服务如:
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);
argv:
%s"
,argv[0]);
}
第二章基于TCP套接口的编程
2.2套接口和套接口地址
1、linux系统的套接口
套接口是两个通信通道上的端节点
套接口函数可以用来产生通信信道,通过信道两个应用程序间可以传送数据
Linux系统的套接口
网络编程接口,支持多种协议
套接口地址结构“sockaddr_”开头,并以对应协议族的唯一后缀结束
sockaddr_in、sockaddr_in6、sockaddr_un
通用的套接字地址结构
<
linux/sock.h>
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<
sys/socket.h>
netinet/in.h>
arpa/inet.h>
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函数,指定期望的通信协议
sys/types.h>
intsocket(intdomain,inttype,intprotocol);
socketpair()
socketpair()产生两个套接口,并连接这两个套接口,返回这两个套接口描述字
3、connect()
三种出错返回
状态转换:
CLOSED状态—SYN_SENT状态—ESTABLISHED状态
connect函数
TCP客户端与服务器建立连接用connect函数
未连接的套接口à
主动连接套接口
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前调用
intlisten(intsockfd,intbacklog)
功能:
监听本地地址和端口
参数:
sockfd-已绑定的socket描述符
backlog-已完成连接、等待接收的队列长度
返回值
0-成功,-1-失败
5、等待队列
当客户SYN到达时,若队列是满的·
·
如果返回RST·
等待队列
未完成连接队列:
客户端发来的SYN分节对应其中一项;
服务器正等待完成相应TCP三次握手。
服务端为SYN_RCVD状态
已完成连接队列:
每个已完成三次握手的客户对应其中一项。
服务端为ESTABLISHED状态
未完成队列+完成队列<
backlog
当客户SYN到达时,若队列是满的,TCP就忽略该分节,不发送RST分节。
客户端会重发SYN,期望不久在队列中找到可用空间
如果返回RST则出现:
connect立即返回错误,客户端也不知是“端口没有监听”还是“端口在监听,而队列满了”
6.accept()(完成三次握手)
TCP服务器调用
从已完成连接队列头返回下一个已完成连接
已完成队列为空,则进程睡眠
执行步骤:
(1)服务请求到达accept()函数监视的socket(监听套接口)
(2)socket执行体将自动建立一个新的socket(已连接套接口)
(3)并将此socket和客户进程连接起来
(4)监听套接口继续接收到达的服务请求
intaccept(intsockfd,sockaddr*cliaddr,int*addrlen);
非负套接字;
7、套接口的生存期
套接口的生存期
监听套接口(socket创建)
在服务器的生命期内一直存在
已连接套接口(accept创建)
服务器完成该客户端进程服务时,关闭该套接口
8、close()
考虑计数器
注意
close()函数
用来关闭套接口,终止TCP连接
unistd.h>
intclose(intfd);
注意:
close引发相应套接口描述字的引用计数器减一
若引用计数器值仍大于0,该close不引发TCP的四分组连接终止序列
只有在引用计数器=0时,才关闭套接口
例如:
并发服务器中,父进程close已连接套接口,不影响子进程对该套接口的使用
close的两个限制
仅当计数器=0时,才关闭套接口
Close终止数据发送的两个方向:
读与写;
TCP是全双工的
9、并发服务器(实验)fork的典型用法
fork函数:
pid_tfork(void);
fork的两个典型用法:
(1)进程创建一个自身的拷贝,该拷贝都可以在另一个拷贝执行其他任务的时候处理各自的操作
如:
网络服务器
(2)一个进程要执行另一个程序
创建自身拷贝后,其中一个拷贝调用exec吧自身换成新的程序
2.4高级套接口函数
9、send()、recv()
send()和recv()
与write函数和read函数类似,用来发送数据
可用于TCP或者UDP通信协议
采用数据报传送方式时,应利用connect()函数给出所连接的套接口地址
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通信协议
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()
终止网络连接并停止所有信息的发送与接收
不管引用计数器为何值
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:
指定让内核测试的读、写和异常条件到达的描述字
每个描述字集合指定一个或多个描