- Java633
- Distributed189
- Tool133
- Spring102
- MQ89
- Netty88
- Log86
- File72
- RPC65
- SOFA65
- Concurrency60
- IM55
- Memory51
- Apache50
- Engine49
- Net49
- Design Pattern45
- Schedule40
- Lock33
- Basic32
- java31
- JVM26
- Dev24
- Protocol23
- Thread23
- System18
- Network17
- Web17
- SQL11
- Github10
- JMM10
- Jvm10
- Programming Language10
- SSO10
- Safe10
- System-Design10
- ORM10
- Base9
- Go9
- Maven9
- Pattern8
- Theory8
- WEB8
- TOOL7
- Auth6
- Architecture6
- HTTP6
- Python6
- CS4
- Mybatis4
- Concurrent3
- Exception3
- source-code3
- Framework2
- Gateway2
- Http2
- JMS2
- Security2
- Cache2
- DEV1
- Dotnet1
- IO1
- IOC1
- IOS1
- IoT1
- JDBC1
- Best Practice1
- Mybaits1
- PHP1
- Source Code1
- Dubbo1
- MVC1
当然,也适合面试突击网络知识时拿来看。
比如 HTTP、HTTPS、TCP、UDP、IP 等等,也有很多面试常问的问题,比如:
-
TCP 为什么三次握手?四次挥手?
-
TCP 为什么要有 TIME_WAIT 状态?
-
TCP 为什么是可靠传输协议,而 UDP 不是?
-
键入网址到网页显示,期间发生了什么?
-
HTTPS 握手过程是怎样的?
要怎么阅读?
《图解网络》不是教科书,而是我写的图解网络文章的整合,所以肯定是没有教科书那么细致和全面,当然也就不会有很多废话,都是直击重点,不绕弯,而且有的知识点书上看不到。
问大家,为什么要有 TCP/IP 网络模型?
对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。
这个网络协议是分层的,每一层都有各自的作用和职责,接下来就根据「 TCP/IP 网络模型」分别对每一层进行介绍。

为了使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference Model),也就是 OSI 网络模型,该模型主要有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层。
每一层负责的职能都不同,如下:
-
应用层,负责给应用程序提供统一的接口;
-
表示层,负责把数据转换成兼容另一个系统能识别的格式;
-
会话层,负责建立、管理和终止表示层实体之间的通信会话;
-
传输层,负责端到端的数据传输;
-
网络层,负责数据的路由、转发、分片;
-
数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址;
-
物理层,负责在物理网络中传输数据帧;
想必不少小伙伴面试过程中,会遇到「当键入网址后,到网页显示,其间发生了什么」的面试题。
还别说,这问题真挺常问的,前几天坐在我旁边的主管电话面试应聘者的时候,也问了这个问题。
接下来以下图较简单的网络拓扑模型作为例子,探究探究其间发生了什么?


TCP 基本认识
TCP 头格式有哪些?
我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。
天下没有不散的宴席,对于 TCP 连接也是这样, TCP 断开连接是通过四次挥手方式。
双方都可以主动断开连接,断开连接后主机中的「资源」将被释放,四次挥手的过程如下图:
相信大家都知道 TCP 是一个可靠传输的协议,那它是如何保证可靠的呢?
为了实现可靠性传输,需要考虑很多事情,例如数据的破坏、丢包、重复以及分片顺序混乱等问题。如不能解决这些问题,也就无从谈起可靠传输。
那么,TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。
今天,将重点介绍 TCP 的重传机制、滑动窗口、流量控制、拥塞控制。

为了让大家更容易「看得见」 TCP,我搭建不少测试环境,并且数据包抓很多次,花费了不少时间,才抓到比较容易分析的数据包。
接下来丢包、乱序、超时重传、快速重传、选择性确认、流量控制等等 TCP 的特性,都能「一览无余」。
没错,我把 TCP 的"衣服扒光"了,就为了给大家看的清楚,嘻嘻。

网上许多博客针对增大 TCP 半连接队列和全连接队列的方式如下:
-
增大 TCP 半连接队列的方式是增大 /proc/sys/net/ipv4/tcp_max_syn_backlog;
-
增大 TCP 全连接队列的方式是增大 listen() 函数中的 backlog;
这里先跟大家说下,上面的方式都是不准确的。
“你怎么知道不准确?”
很简单呀,因为我做了实验和看了 TCP 协议栈的内核源码,发现要增大这两个队列长度,不是简简单单增大某一个参数就可以的。