chore: 将所有外部图片本地化到仓库

- 下载 110 张外部图片到根目录 images/ 文件夹
- 更新所有 README.md 中的图片引用为统一路径 images/xxx.png
- 55 张图片成功下载(PNG 格式)
- 55 张失效图片创建占位文件(SVG/PNG)
- 移除所有外部图片链接依赖

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
riba2534
2026-01-05 16:34:13 +08:00
parent d44ecdf807
commit 0d17c981ee
128 changed files with 691 additions and 232 deletions

View File

@@ -10,7 +10,7 @@ TCP 是 Transmission Control Protocol (传输控制协议)的简写,意为
#### 4.1.1 TCP/IP 协议栈
![](https://i.loli.net/2019/01/14/5c3c21889db06.png)
![](images/5c3c21889db06.png)
TCP/IP 协议栈共分为 4 层,可以理解为数据收发分成了 4 个层次化过程,通过层次化的方式来解决问题
@@ -40,7 +40,7 @@ IP 层只关注一个数据包(数据传输基本单位)的传输过程。
这就是 TCP 的作用。如果交换数据的过程中可以确认对方已经收到数据并重传丢失的数据那么即便IP层不保证数据传输这类通信也是可靠的。
![](https://i.loli.net/2019/01/14/5c3c268b40be6.png)
![](images/5c3c268b40be6.png)
#### 4.1.5 应用层
@@ -50,7 +50,7 @@ IP 层只关注一个数据包(数据传输基本单位)的传输过程。
#### 4.2.1 TCP 服务端的默认函数的调用程序
![](https://i.loli.net/2019/01/14/5c3c2782a7810.png)
![](images/5c3c2782a7810.png)
调用 socket 函数创建套接字,声明并初始化地址信息的结构体变量,调用 bind 函数向套接字分配地址。
@@ -98,7 +98,7 @@ accept 函数受理连接请求队列中待处理的客户端连接请求。函
#### 4.2.5 TCP 客户端的默认函数调用顺序
![](https://i.loli.net/2019/01/14/5c3c31d77e86c.png)
![](images/5c3c31d77e86c.png)
与服务端相比,区别就在于「请求连接」,它是创建客户端套接字后向服务端发起的连接请求。服务端调用 listen 函数后创建连接请求等待队列,之后客户端即可请求连接。
@@ -138,7 +138,7 @@ addrlen: 第二个结构体参数 servaddr 变量的字节长度
关系图如下所示:
![](https://i.loli.net/2019/01/14/5c3c35a773b8c.png)
![](images/5c3c35a773b8c.png)
- 客户端只能等到服务端调用 listen 函数后才能调用 connect 函数
- 服务器端可能会在客户端调用 connect 之前调用 accept 函数这时服务器端进入阻塞blocking状态直到客户端调用 connect 函数后接收到连接请求。
@@ -151,7 +151,7 @@ addrlen: 第二个结构体参数 servaddr 变量的字节长度
在 Hello World 的例子中,等待队列的作用没有太大意义。如果想继续处理好后面的客户端请求应该怎样扩展代码?最简单的方式就是插入循环反复调用 accept 函数,如图:
![](https://i.loli.net/2019/01/15/5c3d3c8a283ad.png)
![](images/5c3d3c8a283ad.png)
可以看出,调用 accept 函数后,紧接着调用 I/O 相关的 read write 函数,然后调用 close 函数。这并非针对服务器套接字,而是针对 accept 函数调用时创建的套接字。
@@ -189,10 +189,10 @@ gcc echo_server.c -o eserver
在一个服务端开启后,用另一个终端窗口开启客户端,然后程序会让你输入字符串,然后客户端输入什么字符串,客户端就会返回什么字符串,按 q 退出。这时服务端的运行并没有结束,服务端一共要处理 5 个客户端的连接,所以另外开多个终端窗口同时开启客户端,服务器按照顺序进行处理。
server:
![server.png](https://i.loli.net/2019/01/15/5c3d523d0a675.png)
![server.png](images/5c3d523d0a675.png)
client:
![client.png](https://i.loli.net/2019/01/15/5c3d523d336e7.png)
![client.png](images/5c3d523d336e7.png)
#### 4.3.3 回声客户端存在的问题