福州大学网络程序设计考点完美版Word格式文档下载.docx

上传人:b****5 文档编号:19455810 上传时间:2023-01-06 格式:DOCX 页数:34 大小:67.39KB
下载 相关 举报
福州大学网络程序设计考点完美版Word格式文档下载.docx_第1页
第1页 / 共34页
福州大学网络程序设计考点完美版Word格式文档下载.docx_第2页
第2页 / 共34页
福州大学网络程序设计考点完美版Word格式文档下载.docx_第3页
第3页 / 共34页
福州大学网络程序设计考点完美版Word格式文档下载.docx_第4页
第4页 / 共34页
福州大学网络程序设计考点完美版Word格式文档下载.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

福州大学网络程序设计考点完美版Word格式文档下载.docx

《福州大学网络程序设计考点完美版Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《福州大学网络程序设计考点完美版Word格式文档下载.docx(34页珍藏版)》请在冰豆网上搜索。

福州大学网络程序设计考点完美版Word格式文档下载.docx

提供非面向连接的和不可靠的简单的数据报服务

不可用于使用虚电路的面向连接的服务

主要用于面向查询/应答的服务

具有较高的效率,不须要花费开销建立连接;

常用于交换量较少的服务如:

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:

指定让内核测试的读、写和异常条件到达的描述字

每个描述字集合指定一个

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1