新書推薦:

《
清华大学藏战国竹简校释(陆):越公其事
》
售價:HK$
82.5

《
古今英国园林
》
售價:HK$
107.8

《
奇迹时刻:获得全新的认知与领悟,如何爱自己,打破原生家庭限制,找寻真正的自由与自爱
》
售價:HK$
65.8

《
学会卓越
》
售價:HK$
109.9

《
365日自我肯定之书:你是你自己人生的主角!增强自我肯定感
》
售價:HK$
76.8

《
小儿推拿轻松学,脾肺同养百病消
》
售價:HK$
39.6

《
海洋之思:俄罗斯的海洋观(1997~2021)
》
售價:HK$
140.8

《
国语(全二册)(中国古代史学丛书)
》
售價:HK$
140.8
|
| 編輯推薦: |
l 206张手绘插图,完整全面掌握Linux网络编程。 l 结合Linux内核源码,厘清底层技术实现原理。 l 示例代码、配置命令、解决方案完整,可拿来即用。 l 全彩印刷,提供源码下载,配套视频课程。
|
| 內容簡介: |
本书共计14章,介绍Linux网络编程的各个方面。
第1~2章介绍网络编程相关的基础知识,包括计算机网络基础、内核收发数据原理、套接字的概念等。
第3章介绍套接字编程基础知识,包括字节序、套接字地址、IP地址转换、套接字核心函数等。
第4~9章为网络编程实战,包括TCP套接字编程、UDP套接字编程、服务器模型、I/O模型、I/O多路复用、套接字选项。
第10~14章为高级网络编程,包括原始套接字、域套接字、组播和广播、零拷贝技术和百万并发。
|
| 關於作者: |
|
袁菘华,具有十余年Linux研发经验,曾就职于世界500强企业和国内某通讯公司。擅长以图文的形式写作技术文章,将复杂的技术知识讲得通俗易懂。个人微信公众号“物联网心球”深受广大读者的喜欢。
|
| 目錄:
|
第1章 计算机网络基础1 1.1 OSI参考模型1 1.1.1 OSI参考模型介绍2 1.1.2 OSI参考模型的特点3 1.1.3 OSI与TCP/IP模型3 1.1.4 封装和解封4 1.2 TCP/IP6 1.2.1 物理层6 1.2.2 数据链路层6 1.2.3 网络层14 1.2.4 传输层27 1.2.5 应用层29 1.3 两台主机直连29 1.3.1 通信过程29 1.3.2 ARP和ARP表30 1.4 局域网通信33 1.4.1 通信过程33 1.4.2 交换机工作原理34 1.5 跨网段通信35 1.5.1 通信过程35 1.5.2 访问公网服务端37 第2章 认识套接字39 2.1 从不同角度看套接字39 2.1.1 数据加工厂41 2.1.2 不同设备进程间通信41 2.1.3 本机进程间通信42 2.2 从内核看Linux接收数据43 2.2.1 硬中断处理44 2.2.2 软中断处理44 2.3 从内核看Linux发送数据46 2.3.1 传输层处理47 2.3.2 网络层处理47 2.3.3 邻居子系统处理48 2.3.4 网络设备子系统处理48 2.3.5 网卡驱动处理48 2.4 常见套接字介绍48 2.4.1 IPv4套接字49 2.4.2 数据链路层原始套接字51 2.4.3 域套接字52 第3章 套接字编程基础54 3.1 字节序54 3.1.1 字节序的概念54 3.1.2 字节序对通信的影响55 3.1.3 字节序转换函数56 3.1.4 主机字节序判断58 3.2 套接字地址59 3.2.1 通用套接字地址60 3.2.2 新的通用套接字地址61 3.2.3 IPv4套接字地址62 3.3 IP地址转换63 3.3.1 字符串IP地址转二进制 IP地址63 3.3.2 二进制IP地址转字符串 IP地址66 3.3.3 二进制IP地址和网络ID、 主机ID的转换68 3.4 域名与IP地址的转换71 3.4.1 域名系统71 3.4.2 域名和IP地址转换74 3.4.3 获取系统服务77 3.5 套接字核心函数84 3.5.1 socket函数84 3.5.2 bind函数86 3.5.3 listen函数87 3.5.4 connect函数89 3.5.5 accept函数90 3.6 套接字发送函数91 3.6.1 send函数91 3.6.2 sendto函数93 3.6.3 sendmsg函数93 3.6.4 writev函数95 3.7 套接字接收函数95 3.7.1 recv函数96 3.7.2 recvfrom函数96 3.7.3 recvmsg函数97 3.7.4 readv函数98 第4章 TCP套接字编程99 4.1 TCP编程基础99 4.1.1 TCP简介99 4.1.2 TCP状态机102 4.1.3 TCP调试工具104 4.2 TCP套接字编程基础108 4.2.1 TCP编程流程108 4.2.2 正确设置recv函数的 flags标志113 4.2.3 getsockname和 getpeername函数114 4.3 优雅关闭套接字115 4.3.1 close函数关闭套接字116 4.3.2 shutdown函数优雅关闭 套接字117 4.4 TCP连接快速打开121 4.4.1 TFO的工作流程121 4.4.2 TFO编程实战123 4.4.3 验证TFO功能124 4.5 SYN Flood攻击126 4.5.1 什么是SYN Flood攻击126 4.5.2 TCP SYN Cookies简介126 4.5.3 TCP SYN Cookies实战128 第5章 UDP套接字编程130 5.1 UDP编程基础130 5.2 UDP套接字编程基础131 5.2.1 UDP编程流程131 5.2.2 CS网络模型和P2P网络 模型134 5.2.3 深入理解UDP connect 函数135 5.2.4 正确发送和接收数据140 5.3 UDP可靠性编程143 5.3.1 UDP丢包143 5.3.2 UDP乱序145 5.3.3 可靠性编程146 第6章 服务器模型150 6.1 循环服务器150 6.1.1 UDP循环服务器150 6.1.2 TCP循环服务器151 6.2 并发服务器153 6.2.1 多进程并发服务器153 6.2.2 多线程并发服务器159 6.3 I/O多路复用服务器165 6.4 本章小结166 第7章 I/O模型168 7.1 同步I/O和异步I/O的区别168 7.2 阻塞I/O169 7.3 非阻塞I/O170 7.4 I/O多路复用172 7.5 信号驱动I/O173 7.5.1 工作原理173 7.5.2 信号驱动I/O编程174 7.6 异步I/O177 7.6.1 工作原理177 7.6.2 io_uring编程180 第8章 I/O多路复用185 8.1 从内核看select185 8.2 select编程实战187 8.2.1 位图188 8.2.2 select编程流程191 8.3 select小结200 8.4 从内核看poll201 8.5 poll编程实战203 8.6 poll小结209 8.7 从内核看epoll210 8.8 epoll编程实战211 8.8.1 编程接口211 8.8.2 epoll的编程流程214 8.9 epoll小结219 第9章 套接字选项221 9.1 套接字选项简介221 9.2 setsockopt和getsockopt函数224 9.2.1 函数原型224 9.2.2 实现原理224 9.3 sysctl相关知识225 9.3.1 /proc/sys虚拟文件系统225 9.3.2 sysctl命令225 9.4 常用的套接字选项227 9.4.1 SO_SNDBUF和 SO_RCVBUF227 9.4.2 SO_REUSEADDR和 SO_REUSEPORT230 9.4.3 SO_LINGER237 9.4.4 TCP保活机制238 9.4.5 TCP_NODELAY和 TCP_CORK242 第10章 原始套接字247 10.1 从内核看原始套接字247 10.1.1 原始套接字如何发送 数据248 10.1.2 原始套接字如何接收 数据249 10.2 网络层原始套接字251 10.2.1 编程流程251 10.2.2 常见的网络层原始套接字 编程问题254 10.3 链路层原始套接字256 10.3.1 套接字地址256 10.3.2 编程流程257 10.3.3 混杂模式259 10.3.4 常见的链路层原始套接字编程 问题260 10.4 用户层TCP/IP编程262 10.4.1 累加校验和的原理262 10.4.2 以太网帧头264 10.4.3 IP头267 10.4.4 ARP269 10.4.5 ICMP272 10.4.6 UDP274 第11章 域套接字278 11.1 域套接字基础278 11.1.1 域套接字地址279 11.1.2 域套接字的工作原理279 11.2 SOCK_STREAM域套接字280 11.2.1 服务端程序280 11.2.2 客户端程序286 11.2.3 查看域套接字的状态288 11.3 SOCK_DGRAM域套接字288 11.3.1 服务端程序289 11.3.2 客户端程序291 11.4 socketpair域套接字292 11.4.1 socketpair函数292 11.4.2 发送和接收数据293 11.4.3 socketpair函数和pipe函数的 对比294 11.5 传递文件描述符296 11.5.1 实现原理297 11.5.2 编程实战298 第12章 组播和广播301 12.1 组播301 12.1.1 组播系统302 12.1.2 组播路由304 12.1.3 组播地址307 12.1.4 IGMP309 12.2 组播编程313 12.2.1 编程流程313 12.2.2 组播调试320 12.3 广播323 12.3.1 广播类型324 12.3.2 广播的工作原理324 12.4 广播编程325 第13章 零拷贝329 13.1 传统文件传输329 13.2 零拷贝技术330 13.2.1 mmap内存映射331 13.2.2 pipe334 13.2.3 DMA336 13.3 零拷贝网络编程337 13.3.1 mmap+write337 13.3.2 sendfile339 13.3.3 splice342 第14章 百万并发347 14.1 打开百万个套接字文件347 14.1.1 默认情况347 14.1.2 限制条件348 14.1.3 解除限制350 14.2 建立上百万个网络连接359 14.2.1 分析方法359 14.2.2 单机百万网络连接360 14.3 百万并发常见问题365 14.4 Reactor模型366 14.4.1 单Reactor单线程模型367 14.4.2 单Reactor多线程模型368 14.4.3 主从Reactor多线程模型369 14.4.4 Reactor实战370
|
| 內容試閱:
|
网络编程的应用领域非常广泛,几乎涵盖所有与计算机和互联网相关的行业,是每位开发者必备的技能。如果你对网络编程还不了解,那么本书一定能帮你打开网络编程世界的大门。 ☆ 写作背景 网络编程技术是一项偏应用的技术。偏应用的技术有一个特点,就是需要学习的知识点特别多。然而,笔者认为,之所以要学习这么多知识点,是因为开发者对技术的理解浮于表面,不懂得技术实现的底层原理。例如,当我们学习Linux系统中的管道(用于进程间通信)和sendfile(零拷贝技术,用于提高网络传输效率)两个知识点时,需要花费一定的时间。如果你对底层技术很了解(内核源码),就会发现它们都是基于管道(环形缓冲区)实现的,这两个看似毫无关系的知识点,底层实现原理居然是一样的。理解了底层实现原理,再去学习这两个知识点,就可以大大地提高学习效率。 对于Linux开发者来说,最有价值的内容藏在Linux的内核源码中。我们碰到的绝大部分Linux技术问题能从Linux内核源码中找到本质原因。然而,实际情况是,大部分Linux开发者看不懂Linux内核源码,并且认为学习Linux内核源码的难度非常高。于是,笔者萌生了一个想法:结合Linux内核源码分析,把技术知识的本质讲解清楚。目前,市面上的大多数教材偏向于教你如何用,如函数接口如何使用、针对客户端和服务端如何编程等。如果只停留在使用层面,那么当遇到问题或者需要对软件架构进行优化时,往往无能为力。 我们再来聊聊为什么选网络编程这个主题?主要有以下几个原因:网络编程这项技术很重要,每位开发者都需要掌握;很多开发者的网络编程基础比较薄弱,只会照搬别人的代码;笔者一直从事Linux网络开发工作,对网络编程和Linux内核网络协议栈的工作原理非常了解。 ☆ 图书定位 开始写这本书之前,我对这本书就有了明确的定位。 首先,这本书必须具有稀缺性。市面上已经有了很多关于网络编程的书,为什么还要写一本呢?因为市面上还没有一本“有趣”的网络编程书。这种趣味性主要体现在图文并茂的表达方式,本书共有200多张配图,尽量做到每个重要的知识点都配一张图。底层的技术往往是枯燥并且难以理解的,通过图文方式讲解可以降低大家的学习门槛,让大家在轻松愉悦的氛围中学会技术知识。另外,读者的技术水平是参差不齐的,有些问题对于一些读者很简单,但是对于另一些读者来说很难,以图文方式讲解能够最大程度顾及所有的读者。 其次,这本书的内容要过硬。没有硬核的内容,再漂亮的图文也只是花瓶。我希望读者学完本书后,能够真正理解网络编程,所以在图书内容的选择上一直要求很高。这种高要求体现在以下两个方面。 ? 内容全面:本书共14章,覆盖网络编程各个方面的知识点,内容由浅入深,层层递进。全面的内容能够帮助读者建立完整的知识体系并加强系统性思维。相反,碎片化的知识并不会给读者带来多大的提升。 ? 内容有深度:这种深度体现在把知识点讲解透彻,把问题的本质呈现出来。如果笔者的信息来源和读者一样,都是网络上的各种帖子、文章,或者是AI给出的答案,那么笔者输出的内容只能是大众化的,价值一定非常有限。笔者的信息主要来自Linux内核源码,这样能够最大程度保证信息的准确性。同时,直接阅读内核源码,能够屏蔽垃圾信息的干扰,直接揭露问题的本质。 本书能够解决实际问题,每个知识点都配备示例(如示例代码、配置命令、完整解决方案等),这些示例都是完整的,可以直接拿来使用,以便于读者进行调试,通过实践加深对理论知识的理解。 最后,我希望本书能够成为读者的朋友,希望读者能够把这本书摆在书桌上最显眼的位置,当碰到问题或者有空闲时,随手拿起来翻一翻。 ☆ 这本书能给你带来什么 学完这本书,读者的网络编程水平一定会有很大程度的提升。这不仅能够帮你解决实际问题,也会影响你的职业生涯。对于技术人员来说,技术水平不仅直接决定了薪资待遇,还是职位晋升的重要条件,学好网络编程会增加你求职成功的概率。 除了上述实际价值,这本书也会改变你对技术的看法。通过本书,你会发现,技术知识不是一堆难以理解的“八股文”,而是一个个鲜活的生命。学习技术知识就像学习艺术一样,能够让我们的精神愉悦。 最后,我想对读者说,从现在开始,一定要学会做内容输出。我们可以尝试输出一些笔记、文章、视频等,输出的过程其实也是学习的过程,这个过程会让你看到自己的不足,倒逼自己进步。另外,持续输出内容,也会让你慢慢积累自己的影响力,让你变得越来越有价值。
|
|