深入理解 TCP 协议:从原理到实战--掘金小册课程推荐/优惠
版权声明
本站非掘金小册官网,与官方无任何关系。我们不提供课程下载或详细内容,仅作为课程分享和推荐平台。我们鼓励大家支持正版,尊重创作者的劳动成果,这样不仅能帮助创作者持续产出优质内容,也能让自己获得更好的学习体验。请通过官方渠道购买和学习课程,感谢您的理解与支持。
课程详情
课程介绍
小册介绍
TCP 协议是我一直很想写的一个主题,因为 TCP 学起来实在是太痛苦了。刚参加工作时,TCP 协议一直是一个心头痛,知道皮毛,但是始终无法深入。在阅读了大量相关的书籍、做了很多网络编程方面的工作以后觉得掌握的过程太过曲折,这本小册并不是想重复阐述一些书上都能找到的 TCP 的理论,更多的是想跟大家分享一些学习和探究的方法,授之以渔,让大家少走一些弯路,知道从哪些方面下手来学习和分析问题。
写这本小册所花的精力比上一本 JVM 字节码多了很多,越写发现水越深,想说服自己实在是太难了。有时候找一个问题的原因看 RFC 看到想吐,用 keynote 画了 100 多张图,所以看这本小册会发现图特别多。
作者介绍
我是挖坑的张师傅,vim 爱好者。从事 Java 开发六年多,做过安卓、写过 Node,现在深耕后台开发,在 CVTE 担任高级技术经理,带一个 20 多人的开发团队做教育相关的产品。
维护了一个微信公众号「张师傅的博客」,主要写偏底层原理的分布式理论、网络协议、架构设计、Go 语言汇编相关的东西,随缘。
2010 年大三的时候,阴差阳错学习了当时还是 1.5 版本的安卓开发。恰逢 Google 在大陆举办了首届 Android 应用开发中国大学生挑战赛。当时穷学生买不起安卓真机,在模拟器上运行写了一个界面比较炫酷的音乐播放器就去参赛了,结果拿了个三等奖,也是湖北赛区唯一获奖的作品。奖品是一部 HTC G7 手机和几千块的奖金,拿奖以后就应邀去参观了 Google 上海的办公室,安排我们在上海浪了三天。
毕业以后就真的去做了安卓开发,做了大半年的安卓 framework
移植和手写笔记软件,期间大量接触 linux
、vim
、git
等工具。
后面的一年多就是我最高速成长的一段时期了,内部转岗去做了后台开发。因为喜欢保持简单,自己花了一些时间造了很多轮子,比如 REST 服务端框架、数据库连接池、SQL 执行框架、类 Dubbo 的 RPC 调用框架、基于 RocksDB 的延时消息队列、Gossip 协议框架等。
那段时间遇到了非常多网络相关的问题,于是对 TCP
协议做了深入的学习,现在条件反射一上来就可以 tcpdump
抓包开始分析问题了。当组员遇到问题,三下五除二帮忙找到根本原因的感觉真不错。
为什么网络协议如此重要?
之前腾讯过来的带我们部门的后端大牛 ernest 就说过一句话我觉得很经典:「我们做的事情说到底无非是给用户交付一个网络包,你有什么理由不学好呢?」。
识别一个码农能力的好坏很大程度上是取决于他解决问题的能力。
我们面对的很多系统都是黑盒系统(MySQL、Nginx 等),几乎每隔一段时间都会遇到网络相关的问题,Redis 连接超时、请求第三方平台连接被重置、系统的吞吐量上不去等。我们没有精力去把每个组件的源码都读通读透,如果不懂网络协议,尤其是 TCP 协议,将无从下手分析。遇到第三方服务有问题时,没有一些抓包现场的分析证据,对方是不会接锅的,只有无休止的扯皮。
如果你想成为技术牛人,网络协议绝对是一道很高的门槛。 随着开发年限的增加,越发觉得计算机底层的原理才是最有价值的。技术浪潮一波接着一波,只有掌握了操作系统、计算机网络、分布式理论等基础知识,才能在浪潮之巅游刃有余。
纸上得来终觉浅,绝知此事要躬行
TCP 协议的学习非常枯燥,尤其大部分资料都是讲原理没有什么实操的东西。如果平时工作只是写写业务代码很少有机会去深入理解 TCP 协议,也不知道学了 TCP 协议以后可以用在什么地方。所以我想写这本小册,大部分理论相关的内容我都尽量会 packetdrill、scapy、防火墙等工具构造实验可以抓包查看实际的效果,真正可以看到超时重传、零窗口探测、Nagle 算法等实际的效果。
这本小册并不是为了单纯介绍一些协议的理论知识,这些《TCP/IP 详解》这本书已经足够好了,更多的是想授之以渔,跟大家一起分享自己一些思路和方法,如何去研究 TCP 中的一些复杂的问题,相信掌握了这些方法和工具,一定可以助力你后续的技术提升。
你会学到什么
- 为什么握手是三次,挥手要四次,挥手变成三次可以吗
- 为什么 SYN/FIN 不包含数据却要消耗一个序列号
- 如何用脚本复现同时关闭
- TCP 的十一种状态如何模拟以及如何互相转换
- 半连接、全连接队列是什么,backlog 参数有什么作用
- 快速打开的原理是什么
- TCP SYN Flood 攻击背后的原理
- TCP 最不好理解的 TIME_WAIT 状态是什么
- SO_REUSEADDR、SO_LINGER 选项对网络编程有什么影响
- TCP 有 7 个定时器是哪些,分别在什么条件下起作用
- 发送窗口、接收窗口、拥塞窗口的区别是什么
- 流量控制、滑动窗口、拥塞控制、快重传、慢启动等概念
- keepalive 机制
- Nagle 算法、延迟确认的相爱相杀
- 网络学习相关的工具介绍:telnet、nc、tcpdump、wireshark、lsof、iptables、scapy 等
- 协议栈测试工具 packetdrill 的使用
- RST 复位攻击是什么,如何杀掉一条 TCP 连接
- 什么是 TCP 的自连接
- TCP 临时端口号的分配算法是什么
- 常见网络面试题分析
- 实际案例分享
我列了一个这本小册的思维导图
适宜人群
- 学习 TCP 协议多次从入门到放弃的同学
- 想通过实验方法学习 TCP 协议的同学
- 对于前端工程师,学完可以快速辨识开发中遇到的问题是前端还是后端的问题,对页面性能优化有更深的理解
- 对于后端工程师,TCP 协议可以说是必须要掌握的技能,学完能从协议和网络层面快速分析后端诸多分布式组件的问题,对提升接口的性能和分布式系统的可靠性会更有把握
- 对于测试工程师,对网络协议理解的越深,越能发现隐藏很深的 Bug,对性能测试、压力测试会有更深的理解
阅读这本小册需要哪些必备条件
- 一台 Linux 虚拟机,最好是 Centos
- 自己动手抓包而不是只看看文章内容
更新进度
- 2019.06.31:已全部更新完毕
- 2020.01.31:添加《聊聊 TCP 自连接那些事 》章节,已经写作完毕;
- 2020.01.31:添加《临时端口号是如何分配的 》章节,已经写作完毕;
- 2020.01.31:添加《一台主机上两个进程可以同时监听同一个端口吗》章节,已经写作完毕;
课程目录
- 开篇词 —— 小册食用指南
- TCP/IP 历史与分层模型
- TCP 概述 —— 可靠的、面向连接的、基于字节流、全双工的协议
- 来自 Google 的协议栈测试神器 —— packetdrill
- 支撑 TCP 协议的基石 —— 剖析首部字段
- 数据包大小对网络的影响 —— MTU 与 MSS 的奥秘
- 临时端口号是如何分配的
- 繁忙的贸易港口 —— 聊聊端口号
- TCP 恋爱史第一步 —— 从三次握手说起
- 聊聊 TCP 自连接那些事
- 相见时难别亦难 —— 谈谈四次挥手
- 时光机 —— TCP 头部时间戳选项
- 原始但德高望重的 DDoS 攻击方式 —— SYN Flood 攻击原理
- 状态机魔鬼 —— TCP 11 种状态变迁及模拟重现
- 另辟蹊径看三次握手 —— 全连接队列和半连接队列与 backlog
- 优雅关闭连接 —— Socket 选项之 SO_LINGER
- 一台主机上两个进程可以同时监听同一个端口吗
- 嫌三次握手太慢 —— 来快速打开吧
- Address already in use —— 聊聊 Socket 选项之 SO_REUSEADDR
- 一个神奇的状态 —— TIME_WAIT
- 爱搞事情的 RST 包 —— 产生场景、Connection reset 与 Broken pipe
- 重传机制 —— 超时重传、快速重传与 SACK
- TCP流量控制 —— 滑动窗口
- 重传间隔有讲究 —— 多久重传才合适
- 有风度的 TCP —— 拥塞控制
- TCP 发包的 hold 住哥 —— Nagle 算法那些事
- 兄弟你还活着吗 —— keepalive 原理
- TCP 回包的磨叽姐 —— 延迟确认那些事
- TCP RST 攻击与如何杀掉一条 TCP 连接
- ESTABLISHED 状态的连接收到 SYN 会回复什么?
- 定时器一览 —— 细数 TCP 的定时器们
- 网络工具篇(一) —— telnet、nc、netstat
- 网络工具篇(二) —— 网络包的照妖镜 tcpdump
- 案例分析 —— TCP RST 包导致的网络血案
- 网络命令篇(三) —— 网络分析屠龙刀 wireshark
- 案例分析 —— JDBC 批量插入真的就批量了吗
- 案例分析 —— 一次百万长连接压测 Nginx OOM 的问题排查分析
- 作业题和思考题解析
- 网络学习一路困难,与君共勉
- 案例分析 —— 一次 Zookeeper Connection Reset 问题排查