《TCPIP⽹络编程》课后练习答案第⼀部分1~5章尹圣⾬
第⼀章理解⽹络编程和套接字
1. 套接字在⽹络编程中的作⽤是什么?为什么称它为套接字?
P2,⽹络编程就是编写程序让两台联⽹的计算机相互交换数据。在我们不需要考虑物理连接的情况下,我们只需要考虑如何编写传输软件。操作系统提供了名为“套接字”,套接字是⽹络传输传输⽤的软件设备
socket英⽂原意是插座:我们把插头插到插座上就能从电⽹获得电⼒供给,同样,为了与远程计算机进⾏数据传输,需要连接到Internet,⽽变成中的“套接字”就是⽤来连接该⽹络的⼯具
2. 在服务器端创建套接字后,会依次调⽤listen函数和accept函数。请⽐较并说明两者作⽤
tcpip路由协议listen:将套接字转为可接受连接⽅式
accept:受理连接请求,并且在没有连接请求的情况调⽤该函数,不会返回。直到有连接请求为⽌。⼆者存在逻辑上的先后关系
3. Linux中,对套接字数据进⾏I/O时可以直接使⽤I/O相关函数;⽽在Windows中则不可以。原因为何?
Linux把套接字也看作是⽂件,所以可以⽤⽂件I/O相关函数;⽽Windows要区分套接字和⽂件,所以设置了特殊的函数
4. 创建套接字后⼀般会给它分配地址,为什么?为了完成地址分配需要调⽤哪些函数?
要在⽹络上区分来⾃不同机器的套接字,所以需要地址信息。分配地址是通过bind()函数实现
5. Linux中的⽂件描述符与Windows的句柄实际上⾮常类似。请以套接字为对象说明他们的含义。
Linux的⽂件描述符是为了区分指定⽂件⽽赋予⽂件的整数值(相当于编号)。Windows的⽂件描述符其实也是套接字的整数值,其⽬的也是区分指定套接字。
6. 底层⽂件I/O函数与ANSI标准定义的⽂件I/O函数之间有何区别?
ANSI标准定义的输⼊、输出函数是与操作系统(内核)⽆关的以C标准写成的函数。相反,底层⽂件I/O函数是直接提供的。理论上ANSI标准I/O提供了某些机制,性能上由于底层I/O
7. 参考本书给出的⽰例low_open.c和low_read.c,分别利⽤底层⽂件I/O和ANSI标准I/O编写⽂件复制程序。可任意指定复制程序的使⽤
⽅法
第⼆章:套接字类型与协议设置
1. 什么是协议?在收发数据中定义协议有何意义?
协议就是为了完成数据交换⽽定好的约定。因此,定义协议意味着对数据传输所必需的的承诺进⾏定义。
2. ⾯向连接的TCP套接字传输特性有3点,请分别说明。
1. 传输过程中数据不会丢失
2. 按序传输数据
3. 传输的数据不存在数据边界(Boundary)
3. 下⾯哪些是⾯向消息的套接字的特性?a、c、e
4. UDP 、TCP 、TCP
5. 何种类型的套接字不存在数据边界?这类套接字接收数据时需要注意什么?
连接指向型TCP套接字不存在数据边界。因此输⼊输出函数的响应次数不具有意义。重要的不是函数的响应次数,⽽是数据的收发量。因此,必须将传输数据的量和接收数据的量制作成编码,保证发送数据的量和接收数据的量是⼀致的,特别要注意是制作依赖函数响应次数判断代码
6. 修改代码
/*****************************tcp_serv.c*********************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
void error_handling(char*message);
int main(int argc,char*argv[])
{
int serv_sock;
int clnt_sock;
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size;
char message[]="Hello World!";
if(argc!=2){
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
serv_sock=socket(PF_INET, SOCK_STREAM,0);
if(serv_sock ==-1)
error_handling("socket() error");
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(atoi(argv[1]));
if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)
error_handling("bind() error");
if(listen(serv_sock,5)==-1)
error_handling("listen() error");
clnt_addr_size=sizeof(clnt_addr);
clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size); if(clnt_sock==-1)
error_handling("accept() error");
write(clnt_sock, message,4);
write(clnt_sock, message+4,4);
write(clnt_sock, message+8,4);
write(clnt_sock, message+12,sizeof(message)-12);
close(clnt_sock);
return0;
}
void error_handling(char*message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
/*****************************tcp_clnt.c*********************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
void error_handling(char*message);
int main(int argc,char* argv[])
{
int sock;
struct sockaddr_in serv_addr;
char message[30];
int str_len=0;
int idx=0, read_len=0, i;
if(argc!=3){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock=socket(PF_INET, SOCK_STREAM,0);
if(sock ==-1)
error_handling("socket() error");
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
serv_addr.sin_port=htons(atoi(argv[2]));
if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) error_handling("connect() error!");
for(i=0; i<100; i++)// busy waiting!!
printf("Wait time %d \n", i);
read(sock, message,sizeof(message));
printf("Message from server: %s \n", message);
close(sock);
return0;
void error_handling(char*message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
第三章地址族与数据序列
1. IP地址族IPv4和IPv6有何区别?在何种背景下诞⽣了IPv6?
IPV4是4字节地址族,IPV6是16字节地址族。IPV6的诞⽣是为了应对2010年前后IP地址耗尽的问题⽽提出的标准
2. 通过IPV4⽹络ID、主机ID及路由器的关系说明向公司局域⽹中的计算机传输数据的过程
⾸先数据传输的第⼀个环节是向⽬标IP所属的⽹络传输数据。此时使⽤的是IP地址中的⽹络ID。传输的数据将被传到管理⽹络的路由器,接受数据的路由器将参照IP地址的主机号⾃⼰保存的路由表,到对应的主机发送数据
3. 套接字地址分为IP地址和端⼝号。为什么需要IP地址和端⼝号?或者说,通过IP可以区分哪些对象?通过端⼝号可以区分哪些对象?
IP地址是为了区分⽹络上的主机。端⼝号是区分同⼀主机下的不同的SOCKET,以确保软件准确收发数据。
4. CAB
5. 计算机通过路由器或交换机连接到互联⽹。请说出路由器和交换机的作⽤
路由器是帮助数据传输到⽬的地的中介。不仅如此,还起到帮助连接本地⽹络的电脑和互联⽹的作⽤
6. 什么是知名端⼝?其范围是多少?知名端⼝中具有代表性的HTTP合同FTP端⼝号各是多少?
“知名端⼝(Well-known PROT)”是指预定分配给特定操作的端⼝。其范围是0~1023,其中最知名的端⼝是HTTP:80端⼝和TCP:21
7. 题⽬⼤概意思是:为什么bind中第⼆个参数是sockaddr,但是传⼊的是sockaddr_in
bind函数第⼆个参数类型是sockaddr结构体,很难份分配IP地址和端⼝号,因此IP地址和PORT号的分配是通过sockaddr_in完成的。因为该结构体和sockaddr结构体的组成字节序和⼤⼩完全相同,所以可以强转
8. 请解释⼤端序、⼩端序、⽹络字节序,并说明为何需要⽹络字节序
⼩端序是把⾼位字节存储到⾼位地址上;⼤端序是把⾼位字节存储到低位地址上。因为保存栈的⽅式有差异,所以对⽹络传输数据的过程制定了标准,这就是“⽹路字节序”。⽽且,在⽹络字节序中,数据传输的标准是“⼤端序”
9. ⼤端计算机希望将4字节整型数据12传到⼩端序计算机。请说出数据传输过程中发⽣的字节序变换过程
因为⽹络字节序的顺序标准是“⼤端序”,所以⼤端序的计算机在⽹络传输中不需要先转换字节顺序,直接传输。但是接受数据的是⼩端序计算机,因此,要经过⽹络转本地序的过程,再保存到存储设备上
10. 怎么表⽰回送地址?其含义是什么?如果向回送地址传输数据将会发⽣什么情况?
回送地址表⽰计算机本⾝,为127.0.0.1。因此,如果将数据传送到IP地址127.0.0.1,数据会不会通过传输到⽹络的其他设备上⽽直接返回。
第四章基于TCP的服务器端/客户端(1)
1. 请说明TCP/IP的4层协议栈,并说明TCP和UDP套接字经过的层级结构差异
链路层—>IP层—>TCP层—>应⽤层
链路层—>IP层—>UDP层—>应⽤层
2. 请说出TCP/IP协议栈中链路层和IP层的作⽤,并给出两者关系。
链路层是LAN、WAN、MAN等⽹络标准相关的协议栈,是定义物理性质标准的层级。相反,IP层是定义⽹络传输数据标准的层级。
即IP层负责以链路层为基础的数据传输
3. 为何需要把TCP/IP协议栈分成4层(或7层)?结合开放式系统回答
将复杂的TCP/IP协议分层化的话,就可以将分层的层级标准发展成开放系统。实际上,TCP/IP是开放系统,各层级都被初始化,并
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论