请问如何学习网络编程?该怎么入门呢?
的有关信息介绍如下:
你需要掌握基础的如三次握手和四次挥手的过程以及各个状态值,我建议使用 tcpdump 命令实际抓下包就一目了然了,然后就是网络分层,各层的用途,重点熟悉下 TCP/IP 层相关的知识,还有就是 TCP/UDP 的区别,TCP 的滑动窗口机制、拥塞控制算法、TCP 的保序、重传、确认机制。
学习这些知识的时候,一定不要死记硬背,注重理解。我近来面试了一部分学历学校非常好的同学,然而,在问到这块的知识时却大失所望。例如,有的同学只是单纯把三次握手背下来了,我稍微变通一下他就不知道怎么回答了:
2 Socket 编程本身
Socket 编程你需要先掌握常用的 Socket API,包括但不局限于:
常用 Berkeley Sockets API 一览表
学习这些 Socket API 的时候,不是让你单纯地记忆这些函数的参数,而是掌握每一个函数的重难点。
例如:
接着要重点学习下常用的网络模型:
当然,也建议一定要理解,不要死记硬背。C++ 的同学来面试的时候,我会给他们准备如下面试题:
接着还要熟悉 TCP 协议的流式特性,如何解决粘包问题;还要掌握常见的网络协议格式,像 HTTP、FTP、POP3/SMTP/WebSocket协议的格式都建议熟练掌握。
以 HTTP 协议为例,HTTP 协议包的格式是什么样的,包头和包体如何分界的,GET 与 POST 请求的数据分别放在 HTTP 包的什么位置,如果放在包体中,如何知道包体的数据有多长。
学习了常用的网络命令,可以用来排查网络故障与定位问题,反过来,也可以加深对网络理论知识的理解,建议掌握以下命令:ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump。
掌握了这些命令要做到学以致用,例如现在某个服务器连接不上,如何使用这些命令判断是自己网络的问题还是目标主机的问题;开发了一个服务器程序,手头上没有可用的客户端,如何使用 nc 命令模拟一个;或者反过来,开发了一个客户端程序,如果用 nc 模拟一个服务器端用于测试。
例如你可以使用 nc 和 tcpdump 命令抓取三次握手过程,这样可以加深对三次握手的理解,理论结合实践就更容易理解透彻:
利用 nc 命令创建一个客户端去连接服务器:
效果如下:
我们抓到的包如下:
由于我们没有在客户端和服务器之间发送任何消息,其实抓到的包就是 TCP 连接的三次握手数据包,分析如下:
三次握手过程是客户端先给服务器发送一个 SYN ,然后服务器应答一个 SYN + ACK ,应答的序列号是递增 1 的,表示应答哪个请求,即从 4004096087 递增到 4004096088 ,接着客户端再应答一个 ACK 。这个时候,我们发现发包序列号和应答序列号都变成 1 了,这是 tcpdump 使用相对序号,我们加上 -S 选项后就变成绝对序列号了。
我们按 Ctrl + C 中断 tcpdump 抓包过程,并停止用 nc 开启的客户端和服务器程序,然后在前面的 tcpdump 命令后面加上 -S 选项重新开启抓包,使用命令如下:
然后再按顺序用 nc 命令再次启动下服务器和客户端程序。再次得到抓包结果:
这次得到的包的序号就是绝对序号了。
2. 计算机网络理论的书推荐《计算机网络:自顶向下方法》
3. 网络编程方面的实战书来,我推荐韩国人尹圣雨写的这本《TCP/IP 网络编程》,这本书也适合无任何 Socket API 编程经验的小白,这本书涵盖从基础的 Socket API 到高级的 IO 网络模型,有非常详细和生动的例子。
4. 等你有了一定的网络编程以后(熟练使用常见 Socket API),你可以看看游双的《Linux 高性能服务器编程》(链接: https:// pan.baidu.com/s/1sbYi11 QJRkB9rjdD9lqNng 提取码: cjb7 ),这本书给没有基础的人或者基础不扎实的人的感觉是,尤其是书的前三章,这书怎么这么垃圾,又把网络理论书上面的东西搬过来凑字数,但是如果你有基础再按照书上的步骤在机器上实践一遍,你会发现,真是一本难得的、良心的书,桃李不言下自成蹊吧。如果你掌握了这本书上说的这些知识,你再看陈硕老师的《Linux 多线程服务端编程》或者去看像 libevent 这样的开源网络库,你会进一步的得到提升。
完整的书单在这里:
GitHub - balloonwj/WebSocketServer: A light and high performance WebSocket Server.
2. 一个轻量级的即时通讯软件
GitHub - balloonwj/flamingo: flamingo 一款高性能轻量级开源即时通讯软件
我为 Flamingo 专门录制了 3 部高清技术讲解视频以方便读者学习,视频中介绍了 Flamingo 的编译和部署方法、整体架构、各个模块的技术实现细节以及如何学习 Flamingo 的方法,视频获取链接(高清录像):
原创不易,帮忙点个赞呗,欢迎关注 @张小方 ~~
不知道你说的是Web编程还是基于TCP编程。Web编程要学习HTTP协议。基于TCP协议实际上是学习Socket接口,要看具体在哪个操作系统了。不过都需要了解TCP/IP协议,这是基本功。
我本身是全栈工程师,我的实战学习法你可以借鉴一下,你真的能够照做,大概3个月就算是入门了。
Step1:先快速过一下前后端的基本语言知识,这个大概2周就看完了。前端一周多,后端大概5天。千万记住不要去看书籍或者课程,因为一般课程和书籍都讲的特别详细,但是实际工程使用不需要知道的那么多。你只需要简单的了解个大概,心里有个框架图就可以了。我们做工程开发的时候,都会去查这些细节的知识点的,所以并不需要记,而是让实际工作来帮你筛选哪些是常用需要记的。
Step2:直接跟一个实战课程,最好是付费的课,涉及到前后端开发的(付费的课因为有老师教,学的真的快得多)。跟着老师一起做一个项目,这第一遍完全照抄老师的代码,学习进度慢都没关系,但是一定要学的透,有任何问题都要去思考和解决,笔记要记全。
这一遍下来,就算是基本入门了。我本身是全栈工程师,我的实战学习法你可以借鉴一下,你真的能够照做,大概3个月就算是入门了。
Step1:先快速过一下前后端的基本语言知识,这个大概2周就看完了。前端一周多,后端大概5天。千万记住不要去看书籍或者课程,因为一般课程和书籍都讲的特别详细,但是实际工程使用不需要知道的那么多。你只需要简单的了解个大概,心里有个框架图就可以了。我们做工程开发的时候,都会去查这些细节的知识点的,所以并不需要记,而是让实际工作来帮你筛选哪些是常用需要记的。
Step2:直接跟一个实战课程,最好是付费的课,涉及到前后端开发的(付费的课因为有老师教,学的真的快得多)。跟着老师一起做一个项目,这第一遍完全照抄老师的代码,学习进度慢都没关系,但是一定要学的透,有任何问题都要去思考和解决,笔记要记全。
这一遍下来,就算是基本入门了。

