当前位置:   article > 正文

计算机网络方面有哪些书籍值得推荐?_关于计算机网络方面的书籍

关于计算机网络方面的书籍

首先奉上思维导图

如果你学习计算机网络不想只停留在理论上,希望可以能够达到自己编写一些网络通信程序,那我建议你这么学:

1 学习计算机网络理论知识

你需要掌握基础的如三次握手和四次挥手的过程以及各个状态值,我建议使用 tcpdump 命令实际抓下包就一目了然了,然后就是网络分层,各层的用途,重点熟悉下 TCP/IP 层相关的知识,还有就是 TCP/UDP 的区别,TCP 的滑动窗口机制、拥塞控制算法、TCP 的保序、重传、确认机制。

学习这些知识的时候,一定不要死记硬背,注重理解。我近来面试了一部分学历学校非常好的同学,然而,在问到这块的知识时却大失所望。例如,有的同学只是单纯把三次握手背下来了,我稍微变通一下他就不知道怎么回答了:

1. 如果连接一个目标主机不存在的 IP 地址握手过程是怎样的?连接一个目标 IP 存在但是端口号不存在的主机又是怎样的握手过程呢? 2. A 机器上的进程与 B 机器上的进程进行网络通信,分别经历了哪些网络层。

我整理一些常见的网络面试题,放在这里:

经典面试题(三)之网络通信题目集锦

我在知乎上也开过一个 Live 详细讲解了常见的网络面试题:

轻松搞定技术面试中常见的网络通信问题 - 知乎 Live

2 学习Socket 编程

Socket 编程你需要先掌握常用的 Socket API,包括但不局限于:

常用 Berkeley Sockets API 一览表

学习这些 Socket API 的时候,不是让你单纯地记忆这些函数的参数,而是掌握每一个函数的重难点。

例如:

1. 如何将一个 socket 设置成非阻塞模式 2. 阻塞模式下,send 和 recv 函数行为是什么样子的?非阻塞模式下 send/recv 的返回值分别是什么? 3. 客户端发起连接时,如何主动指定通过本地某个端口号去连接?bind 函数如果端口号设置为 0 是什么行为? 4. listen 函数的 backlog 参数用途是什么? 5. 如何实现异步的 connect 函数? 6. accept 函数调用时,三次握手是否已经完成? 7. 如何实现半关闭状态? 8. nagle 算法的用途是什么? 9. select 函数的第一个参数怎么设置?select 函数的超时参数如果设置为 NULL 是什么行为?

接着要重点学习下常用的网络模型:

  1. Windows 上常用的网络模型有 select、WSAEventSelect、WSAAsyncSelect、完成端口模型;

  2. Linux 上常用的网络模型 select、poll、epoll,epoll 需要重点关注的是水平模式和边缘模式。

当然,也建议一定要理解,不要死记硬背。C++ 的同学来面试的时候,我会给他们准备如下面试题:

1. epoll 边缘模式下,某次读取了某个 socket 上的部分数据,下次是否会出发读事件?如果此时又来了一个字节的新数据,是否会触发读事件? 2. epoll 边缘模式建议尽量一次把数据读完,怎样判断当前数据已经读完? 3. epoll 边缘模式下,对于写事件应该如何处理?

接着还要熟悉 TCP 协议的流式特性,如何解决粘包问题;还要掌握常见的网络协议格式,像 HTTP、FTP、POP3/SMTP/WebSocket协议的格式都建议熟练掌握。

以 HTTP 协议为例,HTTP 协议包的格式是什么样的,包头和包体如何分界的,GET 与 POST 请求的数据分别放在 HTTP 包的什么位置,如果放在包体中,如何知道包体的数据有多长。

我写过一系列相关的网络重难点解析的文章在这里:

3 学习常用网络命令

学习了常用的网络命令,可以用来排查网络故障与定位问题,反过来,也可以加深对网络理论知识的理解,建议掌握以下命令:ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump。

掌握了这些命令要做到学以致用,例如现在某个服务器连接不上,如何使用这些命令判断是自己网络的问题还是目标主机的问题;开发了一个服务器程序,手头上没有可用的客户端,如何使用 nc 命令模拟一个;或者反过来,开发了一个客户端程序,如果用 nc 模拟一个服务器端用于测试。

学习网络命令时,一定要多联系,比如如果你总是记不住三次握手四次挥手的过程,你可以使用 tcpdump 命令练习一下抓三次握手四次挥手的数据包,操作如下:

4. 推荐的书籍

1. 计算机网络理论的书推荐《计算机网络:自顶向下方法》

链接: https://pan.baidu.com/s/1I7mEX4IFPkWrL-wgNETyLw 提取码: 33hy

2. 网络编程方面的实战书来,我推荐韩国人尹圣雨写的这本《TCP/IP 网络编程》,这本书也适合无任何 Socket API 编程经验的小白,这本书涵盖从基础的 Socket API 到高级的 IO 网络模型,有非常详细和生动的例子。

链接: https://pan.baidu.com/s/1Z_0Co6tx1CwAawtnJiOOew 提取码: n4pr

3. 等你有了一定的网络编程以后(熟练使用常见 Socket API),你可以看看游双的《Linux 高性能服务器编程》(链接: https://pan.baidu.com/s/1izuExZzvJvko_LJZl0xIiw 提取码: se2u ),这本书给没有基础的人或者基础不扎实的人的感觉是,尤其是书的前三章,这书怎么这么垃圾,又把网络理论书上面的东西搬过来凑字数,但是如果你有基础再按照书上的步骤在机器上实践一遍,你会发现,真是一本难得的、良心的书,桃李不言下自成蹊吧。如果你掌握了这本书上说的这些知识,你再看陈硕老师的《Linux 多线程服务端编程》或者去看像 libevent 这样的开源网络库,你会进一步的得到提升。

注意:对于一些大部头经典的书籍,例如《TCP/IP 协议详解》这样的书,你开始阅读可能会觉得很吃力,不过没关系的,这样的书本来就适合长期收藏,有需要就可以拿出来读一读,不同阶段读的感受和收获是不一样的。

工作许多年之后,我再次读这本书,感觉真的不一样,这几卷书被我翻的很破。

4. 《C++ 服务器开发精髓》一书第四章详细地总结了网络编程的二十多个重难点知识,他们可以帮你搞清楚了百分之九十以上的 socket 编程问题,在该书的第五章详细地介绍了ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump 这些网络的用户,推荐一下。在线阅读链接:第 5 章 网络通信故障排查常用命令

5. 福利

我目前在大厂做开发,也是大厂技术面试官,我分享一下我的算法题库 + 整理了一些常见的大厂算法题与面经:

链接: https://pan.baidu.com/s/1GkDsmdn7JZ-BY6K2cF7_2A 提取码: t5wd

大厂算法是硬性要求,虽然通常算法这块的题目并不难,但是一定要在面试前好好准备一下。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/616895
推荐阅读
相关标签
  

闽ICP备14008679号