当前位置:   article > 正文

TCP/IP网络编程 第四章 第五章 习题解答_tcp是可靠传输协议,但在网络通信过程中可能丢失数据,通过ack和seq说明tcp

tcp是可靠传输协议,但在网络通信过程中可能丢失数据,通过ack和seq说明tcp

1.说明TCP/IP 的四层协议栈,并说明TCP / UDP 套接字经过的层级结构差异

从上到下

应用层->tcp->ip->链路层

应用层->udp->ip->链路层

2.请说出TCP /IP中链路层和IP层的作用,并给出两者的关系

数据链路层通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路,为IP 层提供数据传送服务。(链路层是网络通信的物理基础)

网络层通过路由选择算法,为分组选择最适当的路径,实现两个端系统之间的数据透明传送。

3.为什么要把TCP/IP分为四层和七层,并给出两者关系

ARPANET 的研制经验表明,对于复杂的计算机网络协议,其结构应该是层次式的。
分层的好处:隔层之间是独立的,灵活性好,结构上可以分隔开,易于实现和维护,能促进标准化工作。

4.listen()调用后才可以accept

5.什么时候创建连接请求队列,有何作用,和accept什么关系

调用listen函数时创建了连接请求等待队列。它是存储客户端连接请求信息的空间。accept函数调用后,将从连接请求队列中取出连接请求信息,并与相应客户端建立连接。

6.客户端为什么不需要调用bind()函数分配地址,如果不调用bind()函数,如何向套接字分配 IP 和端口

客户端是请求连接的程序,不是一个接收连接的程序。所以,服务器的地址信息是更重要的因素,没有必要通过bind函数明确地分配地址信息。但是,要想和服务器通信,必须将自己的地址信息分配到套接字上,因此,在connect函数调用时,自动把IP地址和端口号输入到套接字上。

7.

第五章

1.TCP套接字连接设置的三次握手过程,尤其是三次数据交换过程中每次收发的数据内容

网上很多,就不一一赘述了

2.TCP是可靠的数据传输协议,但是在网络通信过程中可能丢失数据,请通过ACK和SEQ说明TCP是通过何种机制保证丢失数据的可靠传输

seq用于给数据字节编号,ack用于确认收到编号的信息。每次传输信息时同时发送seq(表示发送数据最后一个字节的编号),收到数据的主机以seq为基础回复发送数据的主机ack(表示已收到数据的最后一个字节的编号+1)。通过这种机制,传输数据的主机就知道数据是否被正确接收。在不正确传输时,可以重传数据。  


3.TCP套接字中调用write函数和read函数时数据如何移动,结合I/O缓冲说明.

TCP调用write时数据就向端口的输出缓冲区移动。然后经过网络传输传输到对方主机套接字的输入缓冲。这样,输入缓冲中存储的数据通过read函数的响应来读取。

4对方主机的输入缓冲剩余50字节空间时,若本方主机通过write函数请求传输70字节,问TCP如何处理这种情况?

TCP通过滑动窗口协议,保证有剩余缓冲空间时继续接受数据

5.TCP_SERVER.C

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <arpa/inet.h>
  8. void error_handing( char * message);
  9. int main(int argc,char * argv[]){
  10. int serv_sock,clnt_sock;
  11. int str_len,i;
  12. struct sockaddr_in servaddr;
  13. struct sockaddr_in clntaddr;
  14. socklen_t clnt_addr_size;
  15. char read_buf[100];
  16. char meg1[]="hello client";
  17. char meg2[]="i'm server";
  18. char meg3[]="nice to meet you";
  19. char * str_arr[]={meg1,meg2,meg3};
  20. if(argc!=2){
  21. printf("Usage: %s <port> \n",argv[0]);
  22. exit(1);
  23. }
  24. serv_sock=socket(PF_INET,SOCK_STREAM,0);
  25. if(serv_sock==-1)
  26. error_handing("socket() error");
  27. memset(&servaddr,0,sizeof(servaddr));
  28. servaddr.sin_family=AF_INET;
  29. servaddr.sin_port= htons(atoi(argv[1]));
  30. servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  31. if(bind(serv_sock,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
  32. error_handing("bind() error");
  33. if(listen(serv_sock,5)==-1)
  34. error_handing("listen() error");
  35. clnt_addr_size=sizeof(clntaddr);
  36. clnt_sock=accept(serv_sock,(struct sockaddr*)&clntaddr,&clnt_addr_size);
  37. if(clnt_sock==-1)
  38. error_handing("accept() error");
  39. for(i=0;i<3;i++){
  40. str_len=strlen(str_arr[i])+1;
  41. // write(clnt_sock,(char *)(&str_len),4);
  42. write(clnt_sock,str_arr[i],str_len);
  43. // read(clnt_sock,(char *)(&str_len),4);
  44. read(clnt_sock,read_buf,str_len);
  45. puts(read_buf);
  46. }
  47. close(clnt_sock);
  48. close(serv_sock);
  49. return 0;
  50. }
  51. void error_handing(char * message){
  52. fputs(message,stderr);
  53. fputc('\n',stderr);
  54. exit(1);
  55. }

TCP_CLIENT.C

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <arpa/inet.h>
  8. void error_handing( char * message);
  9. int main(int argc, char * argv[]){
  10. int sock;
  11. char read_buf[100];
  12. struct sockaddr_in serv_addr;
  13. int str_len,i;
  14. char meg1[]="hello server";
  15. char meg2[]="i'm client";
  16. char meg3[]="nice to meet you";
  17. char * str_arr[]={meg1,meg2,meg3};
  18. if(argc!=3){
  19. printf("Usage: %s <IP> <port> \n",argv[0]);
  20. exit(1);
  21. }
  22. sock=socket(PF_INET,SOCK_STREAM,0);
  23. if(sock==-1){
  24. error_handing("socker() error");
  25. }
  26. memset(&serv_addr,0,sizeof(serv_addr));
  27. serv_addr.sin_family=AF_INET;
  28. serv_addr.sin_port= htons(atoi(argv[2]));
  29. serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
  30. if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)
  31. error_handing("connect() error");
  32. for(i=0;i<3;i++){
  33. // read(sock,(char *)&str_len,4);
  34. read(sock,read_buf,str_len);
  35. puts(read_buf);
  36. str_len=strlen(str_arr[i])+1;
  37. //write(sock,(char *)&str_len,4);
  38. write(sock,str_arr[i],str_len);
  39. }
  40. close(sock);
  41. return 0;
  42. }
  43. void error_handing( char * message){
  44. fputs(message,stderr);
  45. fputc('\n',stderr);
  46. exit(1);
  47. }

6.收发文件的服务端实现

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <netdb.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <arpa/inet.h>
  9. #define BUFSIZE 30
  10. void error_handing(char * message);
  11. int main(int argc,char *argv[]){
  12. int serv_sock,clnt_sock;
  13. socklen_t clnt_addr_sz;
  14. FILE * fp;
  15. int read_cnt;
  16. char buf[BUFSIZE];
  17. struct sockaddr_in serv_addr,clnt_addr;
  18. if(argc!=2){
  19. printf("Usage %s <port>",argv[0]);
  20. exit(1);
  21. }
  22. fp=fopen("file_server.cc","rb");
  23. serv_sock=socket(PF_INET,SOCK_STREAM,0);
  24. if(serv_sock==-1){
  25. error_handing("socker() error");
  26. }
  27. memset(&serv_addr,0,sizeof(serv_addr));
  28. serv_addr.sin_port=htons(atoi(argv[1]));
  29. serv_addr.sin_family=AF_INET;
  30. serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  31. if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1){
  32. error_handing("bind() error");
  33. }
  34. listen(serv_sock,5);
  35. clnt_addr_sz=sizeof(clnt_addr);
  36. clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz);
  37. if(clnt_sock==-1){
  38. error_handing("accept() error");
  39. }
  40. while(1){
  41. read_cnt=fread((void *)buf,1,BUFSIZE,fp);
  42. if(read_cnt<BUFSIZE)
  43. {
  44. write(clnt_sock,buf,read_cnt);
  45. break;
  46. }
  47. write(clnt_sock,buf,BUFSIZE);
  48. }
  49. shutdown(clnt_sock,SHUT_WR);
  50. read(clnt_sock,buf,BUFSIZE);
  51. printf("message from server: %s \n",buf);
  52. fclose(fp);
  53. close(clnt_sock);
  54. close(serv_sock);
  55. return 0;
  56. }
  57. void error_handing(char * message){
  58. fputs(message,stderr);
  59. fputc('\n',stderr);
  60. exit(1);
  61. }

FILE_CLIENT.C

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <netdb.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <arpa/inet.h>
  9. #define BUFSIZE 30
  10. void error_handing(char * message);
  11. int main(int argc,char *argv[]){
  12. int serv_sock;
  13. FILE * fp;
  14. char buf[BUFSIZE];
  15. int read_cnt;
  16. struct sockaddr_in serv_addr;
  17. if(argc!=3){
  18. printf("Usage %s <ip> <port> ",argv[0]);
  19. exit(1);
  20. }
  21. fp=fopen("receive.dat","wb");
  22. serv_sock=socket(PF_INET,SOCK_STREAM,0);
  23. if(serv_sock==-1){
  24. error_handing("socket() error");
  25. }
  26. memset(&serv_addr,0,sizeof(serv_addr));
  27. serv_addr.sin_family=AF_INET;
  28. serv_addr.sin_port=htons(atoi(argv[2]));
  29. serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
  30. connect(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
  31. while(read_cnt=read(serv_sock,buf,BUFSIZE)!=0){
  32. fwrite((void *)buf,1,read_cnt,fp);
  33. }
  34. puts("Received file data");
  35. sprintf(buf,"that's all");
  36. write(serv_sock,buf,10);
  37. fclose(fp);
  38. close(serv_sock);
  39. return 0;
  40. }
  41. void error_handing(char * message){
  42. fputs(message,stderr);
  43. fputc('\n',stderr);
  44. exit(1);
  45. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/158739
推荐阅读
相关标签
  

闽ICP备14008679号