选择题
1.TCP叫做传输控制协议,它是一种( d )
A 传输层的,不可靠的协议
B 应用层的,可靠的协议
C 应用层的,不可靠的协议
D 传输层的,可靠的协议
2. IP地址(IPv4)由多少位二进制数组成( c )
A 128
B 48
C 32
D 4
3. IP地址的子网掩码由多少位二进制数组成( c )
A 128
B 48
C 32
D 4
4.IP地址的子网掩码的作用是什么( d )
A 区分IP地址的大小
B 用来标识IP地址属于哪一类
C 标识IP地址中的网络位和主机位
D 用于屏蔽IP地址的一部分以区别网络标识和主机标识
5. 某公司网络的地址是202.110.128.0/17,下面的选项中,( b ) 属于这个网络。
A. 202.110.44.0/17
B. 202.110.162.0/20
C. 202.110.144.0/16
D. 202.110.24.0/20
6.在多进程并发服务器中,通常需要解决的一个问题是:如何控制和处理不同进程之间的通信和数据交换。以下哪种手段不是Unix系统主要提供的手段 d
A 管道
B 套接字
C 消息队列
D 互斥锁
7. 下列不属于应用层协议的是( a )
A UDP
B SNMP
C TELNET
D HTTP
8. htonl的表示含义( b )
A 将本机的长整数转换成网络上的长整数
B 将本机的短整数转换成网络上的短整数
C 将网络上的长整型转换成本机的长整数
D 将网络上的短整数转换成本机的短整数
9.172.16.1.1/14这个IP地址属于哪一类( b )
A A类
B B类
C C类
D 哪类都不属于
10.物理层中,指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等的特性是哪种( c )
A 电气特性
B 功能特性
C 机械特性
D 过程特性
11.通信的双方可以同时发送和接收信息的通信是哪种通信( b )
A 单工通信
B 全双工通信
C 半双工通信
D 管道通信
12. 下面哪个基本问题不是数据链路层的基本问题( c )
A 封装成帧
B 透明传输
C 差错控制
D 流量控制
13. 管道是常见的IPC机制,是单工的。若两个进程要做双向传输则需要( a )个管道
A 两个
B 三个
C 四个
D 一个
14. IP 数据报由哪两部分组成。( b )
A 首部和尾部
B 首部和数据
C 数据和尾部
D 报头和尾部
15. ftp协议绑定的端口号是( c )。
A.151
B. 23
C. 21
D. 8080
16. 下面哪个不是子网掩码的重要属性( d )
A 路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
B 路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
C 若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。
D 子网掩码可以促进数据流向的稳定性。
17. Unix系统提供的三种方式支持并发技术,下面哪一种不是这三种方式( d )
A 进程
B 线程
C I/O多路复用
D FIFO
18.在网络边缘的端系统中运行的程序之间的通信方式通常可划分为哪两大类( a )
A C/S 方式和B/S方式
B C/S方式和M2M方式
C C/S 方式和P2P 方式
D M2M方式和P2P 方式
19. TCP/IP 是四层的体系结构,下面哪一层不是该体系结构中的层次结构( d )
A 应用层
B 运输层
C 网际层
D 数据链路层
20.下面哪一层在发送数据的时候需要加尾部( c )
A 运输层
B 网络层
C 数据链路层
D 物理层
21.以下对信号的理解不正确的是( b )
A 信号是一种异步通信方式
B 信号只用在用户空间进程通信,不能和内核空间交互
C 信号是可以被屏蔽的
D 信号是通过软中断实现的
22.在Internet中用一个三元组可以在全局中唯一标识一个应用层进程,这不包括下列哪一种( a )
A.网络层协议
B.地址
C.端口号
D.传输层协议
23.TCP的特点不包括如下哪一点( c )
A.面向连接
B.全双工数据传送
C.传输速度快
D.面向字节流
25.HTTP请求方法不包括如下哪一种 ( b )
A.Post
B.Update
C.Get
D.Head
26.P2P的设计架构不包含以下哪一种?( c )
A.集中式架构
B.完全分布式架构
C.点对点架构
D.混合型架构
27.测试网络设备间的连通命令是( a )。
A :ping
B: ifconfig
C :traceroute
D: netstat
填空题
1. URL通信使用( URL )协议,TCP通信使用( TCP )协议。UDP通信使用( UDP )协议。
2.bind函数原型为 ( Function构造函数 ),参数说明( SOCKET s, const struct sockaddr FAR *addr, int namelen ),功能作用是( 将套接字绑定一个IP地址和端口号 )。
3. socket函数原型int socket(intdomain,int type,int protocol);,domain参数为协议簇和地址簇,确定socket使用的一组协议。这与三个符号常数有关,解释三个符号常数含义,PF_UNIX代表的是( 接字族协议族 ),PF_INET是( protocol family ),PF_INET6是( 地址族定义 )。
4. 对于TCP套接字,地址信息包括 ( ip )和( 端口号 ) 。
5. 补充对应的空缺,在TCP通信下if ((listenfd = socket(AF_INET, ( SOCK_STREAM ), 0)) == -1){….}
6.下面三个语句分别的作用
server.sin_family=AF_INET; ( 服务器端开始建立socket描述符 )
server.sin_port=htons(PORT); ( 保证字节顺序 )
server.sin_addr.s_addr = htonl (INADDR_ANY); ( 监听客户端的所有地址 )
7.线程中为了保证数据完整性,我们通常采用一种( 数据完整性 )机制。
8.多进程服务器中,请补充该段程序空缺部分
pid_t pid;
…………
if (( PID=FORK() )>0) {
close(connectfd);
continue;
}
else if ( ( PID )= =0) {
close(listenfd);
process_cli(connectfd, client);
exit(0);
}
else {
printf("fork error\n");
exit(0);
}
9. 每个线程具有独立的:线程ID,堆栈, 实体 , 对象 。
10.传输协议不需要连接( UDP )速度比TCP快。
11. 数字签名是私钥加密,( 公钥 ) 解密 。
12.本机回送地址是( 127.x.x.x ) 。
13.在SMTP中,电子邮件由( 信封、首部和正文 )3部分组成。
简答题
1.简述TCP套接字通讯的结构流程(分服务器和客户端阐述)
服务器:
1. 创建监听套接字
2. 将监听的套接字和本地的IP和端口绑定
3. 设置监听
4. 等待并接受连接请求 -> 默认阻塞函数
5. 通信;
6. 关闭套接字
客户端:
1. 创建通信的套接字
2. 连接服务器
3. 通信
4. 关闭连接
2.简述线程和进程之间的区别。
进程:狭义定义:进程就是一段程序的执行过程,是系统进行资源分配和调度的基本单位。
线程:是进程中的一条执行路径,是操作系统能够进行运算调度的最小单位。
3.简述TCP和UDP的主要区别。
TCP面向连接,UDP是无连接的
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。
TCP传输效率相对较低。UDP传输效率高
TCP连接只能是点到点、一对一的。UDP都支持
4.列举IP地址的一些重要特点。
一种分等级的地址结构
IP 地址是标志主机和链路的接口
一个主机可以连上多个不同的网络时,那这个主机有多个ip地址
ip地址由网络号和主机号组成,路由器转发分组
5. 什么是端口,网络通信中为什么要引入端口。
端口是TCP/IP协议簇中,应用层进程与传输层协议实体间的通信接口
在网络通信过程中,需要唯一识别通信两端的端点,就是使用端口识别运行于某主机中的应用程序。
6. 什么是套接字?
网络中不同主机上的应用进程之间进行双向通信的端点的抽象
是应用程序与网络协议根进行交互的接口
综合应用题
1.设计一个基于Linux系统下的TCP双向通信程序
#define IPADDRESS "127.0.0.1"
#define PORT 8848
#define BUF_SIZE 1024
//发送消息
void* SendMes_Thread(void* Arg)
{
puts("Thread created.");
//类型转换
int* Client_Socket=(int*)Arg;
char Mes_Buf[BUF_SIZE]={0};
while(1)
{
scanf("%s",Mes_Buf);
send(*Client_Socket,Mes_Buf,strlen(Mes_Buf)+1,0);
bzero(Mes_Buf,BUF_SIZE);
}
close(*Client_Socket);
return NULL;
}
int main(int Argc,char** Argv)
{
//创建服务器套接字
int Server_Socket=socket(AF_INET,SOCK_STREAM,0);
if(-1==Server_Socket)
{
perror("Server socket creation failed!");
return -1;
}
//服务器的网络信息
struct sockaddr_in Server_NetInfo={0};
Server_NetInfo.sin_family=AF_INET;
Server_NetInfo.sin_addr.s_addr=inet_addr(IPADDRESS);
Server_NetInfo.sin_port=htons(PORT);
//绑定IP和端口
if(-1==bind(Server_Socket,(const struct sockaddr*)&Server_NetInfo,sizeof(struct sockaddr)))
{
perror("Binding failure!");
return -1;
}
//监听服务器
if(-1==listen(Server_Socket,6))
{
perror("Linstening the to failure!");
return -1;
}
socklen_t Client_NetInfoSize=sizeof(struct sockaddr_in);
//客户端的网络信息
struct sockaddr_in Client_NetInfo={0};
//创建客户端套接字
int Client_Socket=-1;
//接受请求
Client_Socket=accept(Server_Socket,(struct sockaddr*)&Client_NetInfo,&Client_NetInfoSize);
if(-1==Client_Socket)
{
perror("Accepting fainure!");
}
//创建线程,用于发送消息
pthread_t Thread_ID=-1;
if(-1==pthread_create(&Thread_ID,NULL,SendMes_Thread,(void*)&Client_Socket))
{
puts("Create thread falied!");
return -1;
}
char Mes_Buf[BUF_SIZE]={0};
while(1)
{
if(0==recv(Client_Socket,Mes_Buf,BUF_SIZE,0))
{
puts("Client is desconnected!");
break;
}
printf("Client: %s\n",Mes_Buf);
}
close(Server_Socket);
return 0;
}
#define IPADDRESS "127.0.0.1"
#define PORT 8848
#define BUF_SIZE 1024
void* RecvMes_Thread(void* Arg)
{
int* Client_Socket=(int*)Arg;
char Mes_Buf[BUF_SIZE]={0};
while(1)
{
if(0==recv(*Client_Socket,Mes_Buf,BUF_SIZE,0))
{
perror("Server is disconnected!");
break;
}
printf("Server: %s\n",Mes_Buf);
}
close(*Client_Socket);
return NULL;
}
int main(int Argc,char** Argv)
{
//创建客户端套接字
int Client_Socket=socket(AF_INET,SOCK_STREAM,0);
if(-1==Client_Socket)
{
perror("Client socket creation failed!");
return -1;
}
printf("Client_Socket==%d\n",Client_Socket);
//设置服务器网络信息
struct sockaddr_in Server_NetInfo={0};
Server_NetInfo.sin_family=AF_INET;
Server_NetInfo.sin_addr.s_addr=inet_addr(IPADDRESS);
Server_NetInfo.sin_port=htons(PORT);
//连接服务器
if(-1==connect(Client_Socket,(const struct sockaddr*)&Server_NetInfo,sizeof(struct sockaddr_in)))
{
perror("Connecting failure!");
return -1;
}
pthread_t Thread_ID=-1;
if(0==pthread_create(&Thread_ID,NULL,RecvMes_Thread,(void*)&Client_Socket))
{
puts("Create thread failed!");
}
char Mes_Buf[BUF_SIZE]={0};
while(1)
{
scanf("%s",Mes_Buf);
if(-1==send(Client_Socket,Mes_Buf,strlen(Mes_Buf)+1,0))
{
perror("Sending failure!");
break;
}
bzero(Mes_Buf,BUF_SIZE);
}
close (Client_Socket);
return 0;
}
2. 设计一个基于Linux系统下的多线程服务器程序
//核心业务逻辑
thread_func()
{
while(1) {
recv(...);
process(...);
send(...);
}
close(...);
}
main(
socket(...);
bind(...);
listen(...);
while(1) {
accept(...);
pthread_create();
}
}
3. 设计一个基于Linux系统下的UDP双向通信程序
#define PORTNO 60000
#define PORTS 56666
#define MSGSIZE 128
int main( void )
{
int sfd,ret,len,sfd1;
struct sockaddr_in st, cst;
char msg[MSGSIZE];
len = sizeof(struct sockaddr);
sfd = socket( AF_INET, SOCK_DGRAM, 0);
memset( &st, 0x0, len );
st.sin_family = AF_INET; //IPV4协议族
st.sin_addr.s_addr = inet_addr("192.168.36.129");
st.sin_port = htons(PORTNO);
ret = bind( sfd, (struct sockaddr *)&st, len );
len = sizeof(struct sockaddr);
sfd1 = socket( AF_INET, SOCK_DGRAM, 0);
memset( &cst, 0x0, len );
cst.sin_family = AF_INET; //IPV4协议族
cst.sin_addr.s_addr = inet_addr("192.168.36.129");//ip地址
cst.sin_port = htons(PORTS); //设定端口号
//接受客户端的数据
while(1){
ret = recvfrom( sfd, msg, MSGSIZE, 0, (struct sockaddr *)&st, (socklen_t *)&len );
msg[ret]=0x0;
printf("服务器从客户端接收的数据为:[%s]\n", msg);
//发送服务端的数据
char BUFF;
scanf("%s",&BUFF);
strcpy(msg,&BUFF);
sendto( sfd1, msg, strlen(msg),0, (struct sockaddr *)&cst, (socklen_t)len );
}
return 0;
}
#define PORTNO 60000
#define PORTS 56666
#define MSGSIZE 128
int main( void )
{
int sfd,sfd1,ret,ret1;
struct sockaddr_in st,cst;
size_t len;
char msg[MSGSIZE];
len = sizeof(struct sockaddr);
sfd = socket( AF_INET, SOCK_DGRAM, 0);
memset( &st, 0x0, len );
st.sin_family = AF_INET; //IPV4协议族
st.sin_addr.s_addr = inet_addr("192.168.36.129");
st.sin_port = htons(PORTNO); //设定端口号
len = sizeof(struct sockaddr);
sfd1 = socket( AF_INET, SOCK_DGRAM, 0);
memset( &cst, 0x0, len );
cst.sin_family = AF_INET; //IPV4协议族
cst.sin_addr.s_addr = inet_addr("192.168.36.129");
cst.sin_port = htons(PORTS);
ret = bind( sfd1, (struct sockaddr *)&cst, len );
char BUFF;
while(1){
scanf("%s",&BUFF);
strcpy(msg,&BUFF);
sendto( sfd, msg, strlen(msg),0, (struct sockaddr *)&st, (socklen_t)len );
ret = recvfrom( sfd1, msg, MSGSIZE, 0, (struct sockaddr *)&cst, (socklen_t *)&len );
msg[ret]=0x0;
printf("results:[%s]\n", msg);
}
return 0;
}