Linux内核网络栈源代码情景分析

当前位置:首页 > 计算机网络 > 操作系统/系统开发 > Linux内核网络栈源代码情景分析

出版社:人民邮电
出版日期:2010-1
ISBN:9787115216267
作者:曹桂平
页数:809页

章节摘录

插图:该字段是一个联合类型,表示了数据包在不同处理层次上所到达的处理位置。如在链路层上,eth指针有效,指向以太网首部第一个字节位置;在网络层上,iph指针有效指向IP首部第一个字节位置。raw指针随层次变化而变化,在链路层上时,其等于eth,在网络层上时,其等于iph。seq是针对使用TCP协议的待发送数据包而言的,此时该字段值表示该数据包的,ACK值。ACK值等于数据包中第一个数据的序列号加上数据的长度值。iphdr:指向IP首部的指针,此处特别地分出了一个字段用于指向IP首部,主要用于RAW套接字。mem-len:该字段表示skbuff结构大小加上数据帧的总长度。len:该字段只表示数据帧长度,即len=mem-len-sizeof fraglen、fraglist:这两个字段用于分片数据包。。fraglen表示分片数据包个数,而fraglist指向分片数据包队列。truesize.意义同mem-len。sad&:数据包发送的源端IP地址。daddr:数据包最终目的端IP地址。raddr:数据包下一站IP地址。acked、used、flee、arp:acked=1表示该数据包已得到确认,可以从重发队列中删除。used=l表示该数据包的数据已被应用程序读完,可以进行释放。free=1用于数据包发送,当某个待发送数据包flee标志位等于l,则表示无论该数据包是否发送成功,在进行发送操作后立即释放,无需缓存。arp字段用于待发送数据包,该字段等于1表示此待发送数据包已完成MAC首部的建立。arp=0表示MAC首部中目的端硬件地址尚不知晓,故需使用.ARP协议询问对方,在:MAC首部尚未完全建立之前,该数据包一直处于发送缓冲队列中(device结构中buffs数组元素指向的某个队列以及ARP协议的某个队列中)。tries、lock、localroute:。tries字段表示该数据包已进行Pies试发送,如果试发送超出域值,则会放弃该数据包的发送。

前言

早在2001年年初我创办《永远的UNIX》(fanqiang.com)网站时,就梦想有一天能将众多技术高手的工作经验集结成册,使广大网友在实际应用中能随手翻查。那时候国内爱好者的学习热情很高,为了给网友提供一个更易于互动交流的平台,我在2001年年底创建了www.chinaunix.net社区网站(简称CU)。经过8年的发展,在广大CLIer的支持下,CU社区的注册用户已经超过百万,ChinaLlnix已经成为全球最大、人气最旺的以交流Linux、UNIX和开源技术为主的中文社区。CU网站聚集了大量富有工作经验的系统架构师、软件工程师、DBA和网络架构工程师等,她已经成为广大开源技术爱好者学习、工作和生活中不可缺少的伙伴。随着网站一点点壮大,网友也不断成长起来。大量的版主利用业余时间义务解答网友问题、维护论坛版块秩序、服务广大网友。很多网友将自己的学习、工作经验发帖分享出来,更有网友花费大量时间将自己多年的经验整理成书,供更多的人学习、分享。他们的成长是国内技术社区成长的基础,也必将推动国内技术社区的进一步发展。今天,在CU管理员瑞儿mm(周平)、人民邮电出版社的李大微经理、黄焱编辑和广大CU作者们的共同努力下,这套“ChinaUnix技术图书大系”终于和大家见面了,非常感谢人民邮电出版社的鼎立支持!人民邮电出版社是工业和信息化部主管的大型专业出版社,他们出版了一系列优秀的图书,在读者中有着巨大的影响力。

内容概要

曹桂平:中国科学技术大学博士,对操作系统和网络技术具有极其深厚的兴趣,精通Linux内核及其网络线,ARM、PowerPC体系结构,曾开发Linux、Vxworks等平台的设备驱动,目前正致力于高速高精度数据采集方面的研究。

书籍目录

第1部分 网络栈总体架构
第0章 网络栈总体架构分析 2
0.1 网络栈本质及其分层架构 3
0.2 系统调用接口到内核的请求传递 6
0.2.1 第一层入口:accept.s文件 10
0.2.2 第二层入口:socket.s文件 10
0.2.3 第三层入口:entry.s文件 15
第2部分 网络协议
第1章 网络协议头文件分析 18
1.1 etherdevice.h头文件 20
1.2 icmp.h头文件 21
1.3 if.h头文件 28
1.4 if_arp.h头文件 31
1.5 if_ether.h头文件 34
1.6 if_plip.h头文件 36
1.7 if_slip.h头文件 37
1.8 igmp.h头文件 38
1.9 in.h头文件 41
1.10 inet.h头文件 45
1.11 interrupt.h头文件 46
.1.12 ip.h头文件 49
1.13 ip_fw.h头文件 57
1.14 ipx.h头文件 62
1.15 net.h头文件 67
1.16 netdevice.h头文件 73
1.17 notifier.h头文件 85
1.18 ppp.h头文件 89
1.19 route.h头文件 112
1.20 skbuff.h头文件 115
1.21 socket.h头文件 122
1.22 sockios.h头文件 125
1.23 tcp.h头文件 127
1.24 timer.h头文件 136
1.25 udp.h头文件 138
1.26 un.h头文件 140
1.27 本章小结 140
第3部分 网络栈实现分析
第2章 bsd socket层实现分析 144
2.1 protocols.c文件 145
2.2 socket.c文件 146
2.2.1 头文件声明、全局变量定义、相关函数声明 148
2.2.2 move_addr_to_kernel和move_addr_to_user函数 150
2.2.3 get_fd函数 150
2.2.4 socki_lookup和sockfd_lookup函数 151
2.2.5 sock_alloc函数 153
2.2.6 sock_release_peer、sock_release和sock_close函数 153
2.2.7 网络套接字普通文件接口函数 158
2.2.8 sock_awaitconn函数 160
2.2.9 sock_socket函数 162
2.2.10 sock_socketpair函数 164
2.2.11 sock_bind函数 165
2.2.12 sock_listen函数 166
2.2.13 sock_accept函数 167
2.2.14 sock_connect函数 168
2.2.15 sock_getsockname和sock_getpeername函数 170
2.2.16 sock_send和sock_sendto函数 171
2.2.17 sock_recv和sock_recvfrom函数 172
2.2.18 sock_setsockopt和sock_getsockopt函数 173
2.2.19 sock_shutdown函数 174
2.2.20 sock_fcntl函数 175
2.2.21 sys_socketcall函数 175
2.2.22 sock_register和sock_unregister函数 178
2.2.23 proto_init函数 179
2.2.24 sock_init函数 179
2.2.25 socket_get_info函数 180
2.2.26 socket.c文件小结 181
第3章 inet socket层实现分析 182
3.1 af_inet.c文件 183
3.1.1 头文件声明、相关宏及变量定义 189
3.1.2 sk_inuse函数 190
3.1.3 get_new_socknum函数 192
3.1.4 put_sock和remove_sock函数 194
3.1.5 destroy_sock函数 196
3.1.6 inet_fcntl函数 198
3.1.7 inet_setsockopt和inet_getsockopt函数 199
3.1.8 inet_autobind函数 200
3.1.9 inet_listen函数 201
3.1.10 def_callback1、def_callback2和def_callback3函数 202
3.1.11 inet_create和inet_dup函数 202
3.1.12 closing和inet_release函数 207
3.1.13 inet_bind函数 209
3.1.14 inet_error函数 212
3.1.15 inet_connect函数 212
3.1.16 inet_socketpair函数 216
3.1.17 inet_accept函数 217
3.1.18 inet_getname函数 219
3.1.19 inet_recvfrom、inet_recv和inet_read函数 221
3.1.20 inet_send、inet_write和inet_sendto函数 222
3.1.21 inet_shutdown函数 223
3.1.22 inet_select和inet_ioctl函数 224
3.1.23 get_sock和get_sock_raw函数 226
3.1.24 inet层操作函数集定义 230
3.1.25 inet_proto_init函数 231
3.1.26 af_inet.c文件小结 233
第4章 传输层实现分析 234
4.1 tcp.c文件 235
4.1.1 头文件声明、相关变量及宏定义 241
4.1.2 tcp_set_state函数 242
4.1.3 tcp_select_window函数 243
4.1.4 tcp_find_established、tcp_dequeue_established和tcp_accept函数 244
4.1.5 tcp_close_pending函数 247
4.1.6 tcp_time_wait函数 248
4.1.7 tcp协议超时重传处理函数集 248
4.1.8 tcp_err函数 258
4.1.9 tcp_readable函数 260
4.1.10 tcp_listen_select函数 262
4.1.11 tcp_select函数 263
4.1.12 tcp_ioctl函数 265
4.1.13 tcp_check和tcp_send_check函数 266
4.1.14 tcp_send_skb函数 268
4.1.15 tcp_dequeue_partial、tcp_send_partial和tcp_enqueue_partial函数 272
4.1.16 tcp_send_ack函数 274
4.1.17 tcp_build_header函数 276
4.1.18 tcp_write函数 277
4.1.19 tcp_sendto函数 286
4.1.20 tcp_read_wakeup和tcp_write_wakeup函数 287
4.1.21 cleanup_rbuf函数 291
4.1.22 tcp_read_urg函数 293
4.1.23 tcp_read函数 295
4.1.24 tcp_close_state函数 305
4.1.25 tcp_send_fin函数 307
4.1.26 tcp_shutdown函数 309
4.1.27 tcp_recvfrom函数 311
4.1.28 tcp_reset函数 312
4.1.29 tcp_options函数 314
4.1.30 default_mask和tcp_init_seq函数 316
4.1.31 tcp_conn_request函数 318
4.1.32 tcp_close函数 326
4.1.33 tcp_write_xmit函数 328
4.1.34 tcp_ack函数 331
4.1.35 tcp_fin函数 349
4.1.36 tcp_data函数 355
4.1.37 tcp_check_urg和tcp_urg函数 365
4.1.38 tcp_accept函数 368
4.1.39 tcp_connect函数 369
4.1.40 tcp_sequence函数 372
4.1.41 tcp_std_reset函数 374
4.1.42 tcp_send_probe0函数 375
4.1.43 tcp_setsockopt和tcp_getsockopt函数 376
4.1.44 tcp_rcv函数 378
4.1.45 tcp协议操作函数集定义 391
4.1.46 tcp.c文件小结 392
4.2 tcp.h头文件 393
4.3 udp.c文件 397
4.3.1 头文件声明、变量及宏定义和函数声明 398
4.3.2 udp_err函数 399
4.3.3 udp_check和udp_send_check函数 401
4.3.4 udp_send、udp_sendto和udp_write函数 403
4.3.5 udp_ioctl函数 407
4.3.6 udp_recvfrom和udp_read函数 408
4.3.7 udp_connect函数 411
4.3.8 udp_close函数 411
4.3.9 udp_rcv函数 412
4.3.10 udp_deliver函数 416
4.3.11 udp协议操作函数集定义 417
4.4 udp.h头文件 417
4.5 sock.h头文件 419
4.6 sock.c文件 427
4.6.1 头文件声明、相关宏定义 429
4.6.2 sock_setsockopt和sock_getsockopt函数 430
4.6.3 sock_wmalloc和sock_rmalloc函数 434
4.6.4 sock_rspace和sock_wspace函数 436
4.6.5 sock_wfree和sock_rfree函数 437
4.6.6 sock_alloc_send_skb函数 438
4.6.7 sock_queue_rcv_skb函数 440
4.6.8 release_sock函数 440
4.7 datagram.c文件 442
4.7.1 skb_recv_datagram函数 443
4.7.2 skb_free_datagram函数 446
4.7.3 skb_copy_datagram函数 447
4.7.4 datagram_select函数 447
4.8 icmp.c文件 449
4.8.1 头文件声明、变量定义 450
4.8.2 icmp_send函数 451
4.8.3 icmp_unreach函数 456
4.8.4 icmp_redirect函数 458
4.8.5 icmp_echo函数 461
4.8.6 icmp_timestamp函数 463
4.8.7 icmp_info函数 467
4.8.8 icmp_address函数 467
4.8.9 icmp_rcv函数 469
4.8.10 icmp_ioctl函数 473
4.8.11 icmp.c文件小结 473
4.9 icmp.h头文件 474
4.10 igmp.c文件* 475
4.10.1 igmp_stop_timer、igmp_start_timer、igmp_timer_exp ire、igmp_init_timer和random函数 481
4.10.2 igmp_send_report函数 483
4.10.3 igmp_heard_report和igmp_heard_query函数 483
4.10.4 ip_mc_map函数 484
4.10.5 ip_mc_filter_add和ip_mc_filter_del函数 484
4.10.6 igmp_group_dropped和igmp_group_added函数 485
4.10.7 igmp_rcv函数 486
4.10.8 ip_mc_inc_group和ip_mc_dec_group函数 487
4.10.9 ip_mc_join_group和ip_mc_leave_group函数 489
4.10.10 ip_mc_drop_device函数 491
4.10.11 ip_mc_allhost函数 492
4.10.12 ip_mc_drop_socket函数 492
4.10.13 igmp.c文件小结 493
4.11 snmp.h头文件 493
4.12 protocol.h头文件 496
4.13 protocol.c文件 498
4.14 proc.c文件 503
第5章 网络层实现分析 509
5.1 route.h头文件 510
5.2 route.c文件 512
5.2.1 头文件声明、系统变量定义 512
5.2.2 rt_del函数 513
5.2.3 ip_rt_flush函数 514
5.2.4 default_mask和guess_mask函数 515
5.2.5 get_gw_dev函数 516
5.2.6 ip_rt_add函数 517
5.2.7 bad_mask函数 521
5.2.8 rt_new函数 522
5.2.9 rt_kill函数 525
5.2.10 rt_get_info函数 526
5.2.11 ip_rt_route和ip_rt_local函数 527
5.2.12 ip_get_old_rtent函数 530
5.2.13 ip_rt_ioctl函数 530
5.2.14 route.c文件小结 531
5.3 ip.h头文件 532
5.4 ip.c文件 535
5.4.1 头文件声明、变量定义 537
5.4.2 ip_ioctl函数 538
5.4.3 strict_route、loose_route和ip_route_check函数 539
5.4.4 build_options函数 539
5.4.5 ip_send和ip_build_header函数 540
5.4.6 do_options函数 546
5.4.7 ip_compute_csum和ip_send_check函数 550
5.4.8 ip_frag_create函数 554
5.4.9 ip_find函数 554
5.4.10 ip_free函数 555
5.4.11 ip_expire函数 556
5.4.12 ip_create函数 557
5.4.13 ip_done函数 559
5.4.14 ip_glue函数 560
5.4.15 ip_defrag函数 564
5.4.16 ip_fragment函数 570
5.4.17 ip_forward函数 577
5.4.18 ip_rcv函数 584
5.4.19 ip_loopback函数 595
5.4.20 ip_queue_xmit函数 596
5.4.21 ip_mc_procinfo函数 603
5.4.22 ip_setsockopt和ip_getsockopt函数 604
5.4.23 ip_rt_event函数 611
5.4.24 ip_init函数 612
5.4.25 ip.c文件小结 612
5.5 ip_fw.c文件 613
5.5.1 头文件声明、宏及系统变量定义 614
5.5.2 port_match函数 616
5.5.3 ip_fw_chk函数 616
5.5.4 zero_fw_chain函数 625
5.5.5 free_fw_chain函数 626
5.5.6 add_to_chain和del_from_chain函数 626
5.5.7 check_ipfw_struct函数 634
5.5.8 ip_acct_cnt函数 635
5.5.9 ip_acct_ctl,ip_fw_ctl函数 636
5.5.10 ip_chain_procinfo函数 640
5.5.11 ip_acct_procinfo、ip_fw_blk_procinfo和ip_fw_fwd_pro cinfo函数 642
5.5.12 ip_fw.c文件小结 643
5.6 raw.c文件 645
5.6.1 raw_err函数 646
5.6.2 raw_rcv函数 647
5.6.3 raw_sendto和raw_write函数 648
5.6.4 raw_close函数 652
5.6.5 raw_init函数 652
5.6.6 raw_recvfrom和raw_read函数 652
5.6.7 raw协议操作函数集定义 654
5.6.8 raw.c文件小结 654
5.7 raw.h头文件 655
5.8 packet.c文件 656
5.8.1 packet_rcv函数 659
5.8.2 packet_sendto和packet_write函数 660
5.8.3 packet_close函数 663
5.8.4 packet_init函数 664
5.8.5 packet_recvfrom和packet_read函数 665
5.8.6 packet协议操作函数集定义 667
5.8.7 packet.c文件小结 667
第6章 链路层实现分析 669
6.1 dev_mcast.c文件 671
6.1.1 dev_mc_add函数 673
6.1.2 dev_mc_upload函数 674
6.1.3 dev_mc_delete函数 676
6.1.4 dev_mc_discard函数 676
6.2 p8022.h头文件 677
6.3 p8022call.h头文件 677
6.4 datalink.h头文件 680
6.5 p8022.c文件 680
6.5.1 find_8022_client函数 681
6.5.2 p8022_rcv函数 681
6.5.3 p8022_datalink_header函数 682
6.5.4 802.2协议模块注册 683
6.5.5 register_8022_client函数 683
6.5.6 p8022.c文件小结 684
6.6 psnap.h头文件 685
6.7 psnapcall.h头文件 686
6.8 psnap.c文件 686
6.8.1 find_snap_client函数 687
6.8.2 snap_rcv函数 687
6.8.3 snap_datalink_header函数 688
6.8.4 snap_proto_init函数 689
6.8.5 register_snap_client函数 690
6.9 eth.c文件 691
6.9.1 eth_setup函数 693
6.9.2 eth_header和eth_rebuild_header函数 693
6.9.3 eth_type_trans函数 697
6.9.4 eth.c文件小结 698
6.10 eth.h头文件 698
6.11 p8023.c文件 699
6.11.1 p8023_datalink_header函数 700
6.11.2 make_8023_client函数 700
6.12 arp.c文件 703
6.12.1 arp缓存表项表示结构及系统变(常)量定义 705
6.12.2 arp_check_expire函数 708
6.12.3 arp_release_entry函数 710
6.12.4 arp_device_event函数 711
6.12.5 arp_send函数 712
6.12.6 arp_expire_request函数 713
6.12.7 arp_send_q函数 716
6.12.8 arp_destroy函数 718
6.12.9 arp_rcv函数 719
6.12.10 arp_find函数 729
6.12.11 arp_get_info函数 732
6.12.12 arp_lookup函数 734
6.12.13 arp_req_set和arp_req_get函数 735
6.12.14 arp_ioctl函数 739
6.12.15 arp协议注册、初始化 741
6.12.16 arp.c文件小结 741
6.13 arp.h头文件 742
6.14 devinit.c文件 742
6.14.1 ip_get_mask函数 744
6.14.2 ip_chk_addr函数 744
6.14.3 ip_my_addr函数 747
6.14.4 ip_dev_check函数 748
6.14.5 devinit.c文件小结 749
6.15 dev.c文件 749
6.15.1 头文件声明、系统变量定义 750
6.15.2 dev_add_pack和dev_remove_pack函数 753
6.15.3 dev_get、dev_open和dev_close函数 754
6.15.4 register_netdevice_notifier和unregister_netdevice_notifier函数 757
6.15.5 dev_queue_xmit函数 759
6.15.6 netif_rx和dev_rint函数 764
6.15.7 dev_transmit和dev_tint函数 768
6.15.8 in_net_bh和net_bh函数 769
6.15.9 dev_ifconf函数 773
6.15.10 sprintf_stats和dev_get_info函数 774
6.15.11 bad_mask函数 776
6.15.12 dev_ifsioc函数 776
6.15.13 dev_ioctl函数 783
6.15.14 dev_init函数 784
6.15.15 dev.c文件小结 785
网络栈实现小结 785
第4部分 网络设备驱动程序
第7章 网络设备驱动程序分析 788
7.1 关键变量、函数定义及网络设备驱动初始化 789
7.2 网络设备驱动程序结构 795
7.3 本章小结 796
第5部分 系统网络栈初始化
第8章 系统网络栈初始化 798
8.1 网络栈初始化流程 799
8.2 数据包传送通道解析 800
8.3 本章小结 802
附录a tcp协议可靠性数据传输实现原理分析 803
主要参考文献 810

编辑推荐

《Linux内核网络栈源代码情景分析》:剖析核心架构,直击Linux内核网络栈本质详细分析300多个核心函数和头文件,代码注释丰富两种方式分别讲述Linux1.2.13内核网络栈实现的所有源代码方便读者迅速掌握Linux网络协议结构学Linux内核网络栈源代码,从这里开始

作者简介

《Linux内核网络栈源代码情景分析》主要对Linux1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握Linux网络协议结构。
《Linux内核网络栈源代码情景分析》共分为5个部分。具体内容包括网络栈总体架构分析、网络协议头文件分析、BSDsocket层实现分析、INETsocket层实现分析、网络层实现分析、链路层实现分析、网络设备驱动程序分析、系统网络栈初始化等内容。
《Linux内核网络栈源代码情景分析》适合Linux网络开发人员及Linux内核爱好者阅读。

图书封面


 Linux内核网络栈源代码情景分析下载 更多精彩书评



发布书评

 
 


精彩书评 (总计2条)

  •     我想说的是:没有功力就别写东西。正本书代码占了4/5,还有1/5是说代码在哪个文件夹。。。。无语了,没写出点有用的东西出来。稍微有点连接性的地方就一笔带过,自己没搞明白就别硬写啊。。。另外,技术书籍不是说你把所有文件里的东西顺序介绍一遍就完了的,协议栈代码衔接性那么强,竟然一个文件顺序介绍,,大哥你看代码是这样看的??
  •     不需要读第二遍不是说这本书很烂,而是,它的内容确实不需要读第二遍,读一遍就够了,没有需要反复咀嚼的知识。这本书描述协议栈的视角很独辟蹊径,很适合学习网络协议栈入门时先翻一翻。它纯粹是从源码的角度来讲解协议栈,因为网络协议栈本身的分层设计就是为了简洁,所以它同样为了简洁明了,也从网络分层的角度来讲解,这就给入门者提供了一个快速切入的视角,能够从宏观上理解整个协议栈到底是怎么一回事。而且它选用的内核版本是1.2.13,源代码都是网络协议栈最核心的部分,比较容易梳理。我重点看了这本书里对arp.c,ip.c,ip_fw.c,tcp.c这几个文件的讲解,很不出意外的是,这本书里面出现了一些错误。比如,P545 : ”对于raw类型套接字,不使用IP协议“,这里明显不对。实际上是由于raw套接字,用户会提供IP header,所以不需要创建IP header。P705: "如果上次使用时间在10min之内,则清除该表项",应该是“如果上次使用时间在10min之外”。 PS:不清楚这是否是粗心或者印刷问题导致。这本书用的内核版本有很多很明显的bug,比如ip.c的ip_rcv这个函数里面竟然是以报文的frag_off是否为零来判断有无分片,显然把首个分片报文(frag_off为0)给忽略了。总体而言,本书侧重于对源码的解释,对一些基本的网络概念讲解不够好,或者没有讲解。比如对于“面向报文”和“面向流”区别的解释,就有些不知所云。之所以说这本书不需要读第二遍,就是这个原因,作者没有自己的见解在里头,只是给我们提供了一个方便的视角来看源码。对于协议栈初学者而言,在读这本书时,要结合《深入理解linux网络内幕》那本书一起看,那本书对网络的基本概念讲解的特别好,非常清晰明了。另外,对于所有的网络从业者,甚至说软硬件工程师,《TCP/IP详解卷一》都是必读之书,而且是需要反复去读,读一遍显然是不够的。

精彩短评 (总计17条)

  •     做网络通信的可以看看 ,TCPV2也是讲解实现的,配合来看
  •     内核太老,用的是1.3的内核协议,不过对整个协议如何实现的可以学习
  •     讲了大量源码,特别易学~
  •     尤其是做嵌入式开发,此本书值得一看。
  •     以前下过电子版了看过。觉得很不错就买了。
  •     书还不错,到货速度也挺快的,因为缺个角换了一本,速度也很快的。
  •     好书真的好好阅读啊~~
  •     对研究linux内核很有帮助,很好。
  •     国人的好书
  •     这本书基于的内核版本有点老,不过初学者可以参考相关协议栈实现的思路。整体也还可以。
  •     虽是看过,好像没什么系统性
  •     1.23版本较老,整本书都是代码。
  •     不需要读第二遍的书。
  •     有好的,也有坏的,但是这本书应该是值得的
  •     书没问题,就是本旧书啊,什么北京化工大学 图书馆的馆藏书啊,谁知道多少手了啊。。。。
  •     书上讲的内容还是挺不错的!
  •     内容还行,据说版本比较旧~
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024