-
第 1 章 简介
- note
- 获取时间客户端程序 IPv4 版本 GetServerDaytimeClient.c
- 获取时间客户端程序 IPv6 版本 GetServerDaytimeClient_IPv6.c
- 获取时间服务器程序 DaytimeServer.c
- 习题
-
第 2 章 传输层: TCP、UDP 和 SCTP
- note
- 向 TCP 发送缓冲区注入大量数据 - 阻塞直到全部发出 SendBigDataByTCP.c
- 向 UDP 发送缓冲区注入大量数据 - 返回 EMSGSZIE 错误 SendBigDataByUDP.c
- 习题
-
第 3 章 套接字编程简介
- IP 字符串数值互转旧版本 API 的问题 BugOfAddressTransform.c
- 大小端判断 BigEndianOrLittleEndian.c
- 套接字结构体中存放的 IP 和端口默认被解释为大端存储 AddressTransformFunctionUseBigEndianByDefault.c
- 实现 IP 地址字符串和数值的互相转换 ImplementationOfAddressTransformFunction.c
- 一次性读取指定 n 个字节 ReadNBytes.c
- 一次性写入指定 n 个字节 WriteNBytes.c
- 一次性读取一行 (非常慢版本) VerySlowReadLine.c
- 一次性读取一行 (快速版本-预读技术) QuickReadLine.c
- 习题
-
第 4 章 基本 TCP 套接字编程
- note
- TCP 多进程时间获取服务器 ConcurrentMultiProcessesDaytimeServer.c
- TCP 多进程时间获取服务器壳子 - fork 然后 exec echo 程序 ConcurrentMultiProcessesDaytimeServerHandleByNewProgram.c
- TCP 多进程时间获取服务器 - echo 程序 - 调用 getpeername 显示源 IP 和源端口 RunByExecFunctionServer.c
- TCP 时间获取客户端 - 调用 getsockname 显示源 IP 和源端口 GetServerDaytimeClientDisplayAddress.c
- 习题
-
第 5 章 TCP 客户/服务器程序示例
- note
- fgets 和 fputs 对比 fgetsAndfputs.c
- TCP 多进程回显服务器 ConcurrentMultiProcessEchoServer.c
- TCP 回显客户端 EchoClient.c
- connect 是否在 accept 之前返回 : YES
- Wait 和 WaitPid 的测试客户端 (for 中调用 5 次 connect 引发服务器创建 5 个子进程) WaitAndWaitpidTestClient.c
- TCP 多进程回显服务器 - 使用 wait 只回收了部分僵尸进程 ❌ ConcurrentMultiProcessEchoServerHandleZombieBug.c
- TCP 多进程回显服务器 - 使用 waitpid 成功回收所有僵尸进程 ✅ ConcurrentMultiProcessEchoServerHandleZombieCorrect.c
- TCP 多进程回显服务器 - 服务器进程终止情形 (用来为 tcpdump 抓包提供情景) ServerProcessTerminated.c
-
第 6 章 简介
- 客户端缓冲区改进,I/O 多路复用 SelectEchoClient.c
- 客户端缓冲区改进,I/O 多路复用,半关闭 SelectEchoClientHalfClose.c
- 服务器使用 I/O 多路复用替代多进程 - select SelectEchoServer.c
- 服务器使用 I/O 多路复用替代多进程 - poll PollEchoServer.c
- 习题
-
第 7 章 套接字选项
- note
- 展示 TCP 套接字选项的默认值 TCPDisplayDefaultValue.c
- 展示 UDP 套接字选项的默认值 UDPDisplayDefaultValue.c
- linger 对 close 的影响 - 丢弃发送缓冲区数据,发送 RST CloseTestClientLinger0.c
- linger 对 close 的影响 - 直到接收到对端对 FIN 的 ACK 才返回 CloseTestClientLinger30.c
- 通常的 close - 立即返回,尝试发送发送缓冲区中剩余数据,若文件计数为 0 发送 FIN CloseTestClientNormal.c
- 上面三个测试客户端使用的 server CloseTestServer.c
- 不使用
SO_REUSEADDR
选项的 serverNotUseOptionSO_REUSEADDR.c
- 使用
SO_REUSEADDR
选项的 serverUseOptionSO_REUSEADDR_BindDifferentIp.c
- 查看
TCP_NODELAY
选项的影响的客户端TCP_NODELAYClient.c
- TCP_KEEPALIVE TCP_KEEPINTVL TCP_KEEPCNT 等选项的测试 TCPKeepAliveClient.c
- Nagle 算法测试 NagleTest.c
- 习题
-
第 8 章 基本 UDP 套接字编程
- note
- UDP 回显服务器 UDPEchoServer.c
- UDP 回显客户端 - 检查返包来源是否正确
UDPEchoClient_CheckServerIP.c
- UDP 回显客户端 - 未连接套接字 UDPEchoClient.c
- UDP 回显客户端 - 未连接套接字 - 使用 NULL 的 sendto 调用
UDPEchoDisconnectedClient_EDSTADDRREQ.c
- UDP 回显客户端 - 已连接套接字 - 使用传非 NULL 参的 sendto 调用
UDPEchoConnectedClient_EISCONN.c
- UDP 回显客户端 - 已连接套接字 UDPEchoConnectedClient.c
- UDP 通过已连接套接字和 getsockname 获取源 IP 和源端口 UDPGetSourceAddrByConnectAndGetSockName.c
- UDP 缺乏流量控制实验 - 服务器 - 读取速率可调节 UDPLackFlowControlServer.c
- UDP 缺乏流量控制实验 - 服务器 - 读取速率可调节 - 发送缓冲区很大 UDPLackFlowControlServer_BiggerBufferSpace.c
- UDP 缺乏流量控制实验 - 客户端 - 发送速率可调节 UDPLackFlowControlClient_DelaySend.c
- 使用 select,对相同端口同时绑定 UDP 和 TCP 的回显服务器 UDPTCPSelectEchoServer.c
- 习题
-
第 11 章 名字与地址转换
- 用主机名或域名获取 IP GetHostByName.c
- 用 IP 获取主机名或域名 - 获取域名需要 PTR 记录支持 GetHostByAddr.c
- 使用服务名和套接字类型获取端口,基于 /etc/services 的配置 GetHostByAddr.c
- 使用端口和套接字类型获取服务名,基于 /etc/services 的配置 GetServByPort.c
- TCP 时间获取服务器 - 使用 getaddrinfo TCPDaytimeServerUseGetAddrInfo.c
- TCP 时间获取客户端 - 使用 getaddrinfo TCPDaytimeClientUseGetAddrInfo.c
- UDP 时间获取服务器 - 使用 getaddrinfo TCPDaytimeClientUseGetAddrInfo.c
- UDP 时间获取客户端 - 使用 getaddrinfo UDPDaytimeClientUseGetAddrInfo.c
- UDP 时间获取客户端 - 使用 getaddrinfo - 使用已连接套接字 UDPDaytimeClientUseGetAddrInfo_Connected.c
- TCP 回显客户端 - 使用 getaddrinfo TCPEchoClientUseGetAddrInfo.c
- 习题
-
第 13 章 守护进程和 inetd 超级服务器
- note
- 创建守护进程:演示了所有步骤 CreateDaemonProcess.c
- 同时支持 TCP 和 UDP 的时间获取服务器守护进程 TCPUDPDaytimeServerWithDaemonProcess.c
- TCP 时间获取客户端 TCPDaytimeClientUseGetAddrInfo.c
- UDP 时间获取客户端 UDPDaytimeClientUseGetAddrInfo.c
- 通过 xinetd 启动的 TCP 时间获取服务器 TCPDaytimeServerExecByXinetd.c
- 通过 xinetd 启动的 UDP 时间获取服务器 UDPDaytimeServerExecByXinetd.c
- 习题
-
第 14 章 高级 IO 函数
- note
- 使用 SIGALRM 给 connect 设置超时 - 有缺陷 TimeoutConnectClientBySignal.c
- 使用 SIGALRM 给 recvfrom 设置超时 TimeoutRecvfromClientBySignal_UDPDaytimeClient.c
- 使用 select 给 recvfrom 设置超时 TimeoutRecvfromClientBySelect.c
- 使用套接字选项 SO_RCVTIMEO 给 recvfrom 设置超时 TimeoutRecvfromClientBySockOpt.c
- 测试超时 API 的服务器 - 可以指定推迟几秒给回包 UDPDaytimeServer_Delay.c
- writev 测试客户端 TCPWritevTestClient.c
- writev 测试服务器 TCPWritevTestServer.c
- readv 测试客户端 - 每次循环写一个字节 - 禁用 Nagle 算法 TCPReadvTestClient_EveryLoopOneByte_TCP_NODELAY.c
- readv 测试客户端 - 一次写完所有数据 TCPReadvTestClient_WriteAllOneTime.c
- readv 测试服务器 TCPReadvTestServer.c
- recv flag 测试服务器 - MSG_PEEK TCPRecvFlagTestServer_MSG_PEEK.c
- recv flag 测试服务器 - MSG_WAITALL TCPRecvFlagTestServer_MSG_WAITALL.c
- recv flag 测试客户端 - 每次循环写一个字节 - 禁用 Nagle 算法 - 每次循环睡 0.5 秒 TCPRecvTestClient_EveryLoopOneByte_TCP_NODELAY_Delay.c
- 查看 TCP 套接字排队数据量 - 客户端 client_TCP_EveryLoopOneByte_TCP_NODELAY_Delay.c
- 查看 UDP 套接字排队数据量 - 客户端 client_UDP_EveryLoopOneByte_Delay.c
- 查看 TCP 套接字排队数据量 - 服务器 - ioctl server_TCP_LookHowManyInRecvBufferButNotRead_ioctl.c
- 查看 TCP 套接字排队数据量 - 服务器 - MSG_PEEK server_TCP_LookHowManyInRecvBufferButNotRead_MSG_PEEK.c
- 查看 UDP 套接字排队数据量 - 服务器 - ioctl server_UDP_LookHowManyInRecvBufferButNotRead_ioctl.c
- 查看 UDP 套接字排队数据量 - 服务器 - MSG_PEEK server_UDP_LookHowManyInRecvBufferButNotRead_MSG_PEEK.c
- 对套接字使用标准 IO 库的缓冲问题 - 服务器 TCPEchoServer_StandardIO.c
- 对套接字使用标准 IO 库的缓冲问题 - 客户端 - 使用半关闭修复了 close 的 bug TCPEchoClientUseGetAddrInfo.c
- 对 sendmsg 的使用 - 客户端 UDPClientUseSendmsg.c
- 对 recvmsg 的使用 - 服务器 - 【额外】通过设置 IP_RECVORIGDSTADDR 套接字选项获取 UDP 目的 IP 地址 UDPServerUseRecvmsg.c
- 习题
-
第 15 章 Unix 域协议
- note.c
- 给 Unix 域套接字绑定一个路径 BindPathForUnixFd.c
- Unix 域套接字版本 - TCP 回显客户端 TCPEchoClient_UnixFd.c
- Unix 域套接字版本 - TCP 回显服务器 TCPEchoServer_UnixFd.c
- Unix 域套接字版本 - UDP 回显客户端 UDPEchoClient_UnixFd.c
- Unix 域套接字版本 - UDP 回显服务器 UDPEchoServer_UnixFd.c
- socketpair 测试 SocketPairTest.c
- backlog 和已连接数的关系 - 可以分别在 Mac 和 Linux 上测试 GetRatioOfConnectionsByBacklog.c
- 描述符传递 - 被传递描述符的读取端 - 父进程 FdTransfer_Read_End.c
- 描述符传递 - 被传递描述符的写入端 - 子进程 FdTransfer_Write_End.c
- 习题
-
第 16 章 非阻塞式 IO
- 非阻塞 connect 测试 NonblockConnect.c
- 读写非阻塞 TCP 回显客户端 - 2 个缓冲区,4 个读写控制游标 NonblockTCPEchoClient.c
- 读写非阻塞 TCP 回显客户端 - 一次运行的时序日志 - 合并了 tcpdump 日志 analyze
- 分成两个进程的 TCP 回显客户端 - 代码超简单 TCPEchoClientByFork.c
- 简单的多进程 Web 服务器 - 只能处理 GET 请求 - 请求路径必须和执行程序处于同一目录下 WebServer.c
- Web 客户端 - 批量下载文件 - 每次阻塞型 connect,发送下载请求,接收响应写文件 WebClientMultiConnectDownload_Block.c 编译 + 运行脚本 run_block.sh
- Web 客户端 - 批量下载文件 - 可以指定最大连接数 - 先创建若干连接 - 然后轮询下载 WebClientMultiConnectDownload_Nonblock.c 编译 + 运行脚本 run_nonblock.sh
- 客户端 - 阻塞型 accept 可能会引发的阻塞 BUG 验证 - connect 返回后睡 1 秒然后发送 RST - 然而并没有得到书上所述的结果 💔 BlockAcceptBug_TCPClient.c
- 服务器 - 阻塞型 accept 可能会引发的阻塞 BUG 验证 - select 可读事件后睡 5 秒然后 accept - 然而并没有得到书上所述的结果 💔 BlockAcceptBug_TCPServer.c
- 阻塞型 accept 可能会引发的阻塞 BUG 验证 - 合并了 tcpdump 的时序日志 timeline.c
- 习题
-
第 17 章 ioctl 操作
- note
- ioctl - SIOCGARP 获取指定 IP 的 ARP 表项 - (MAC 没有 SIOCGARP/linux 总是报错) ARPOperation.c
- ioctl - SIOCGIFCONF 获取全部接口 - 分配较小缓冲区 - (MAC/linux 皆可) AssignMemoryForIfconfTooLess.c
- ioctl - SIOCGIFCONF - 获取网络接口的工具 InterfaceTool.h InterfaceTool.c
- 测试 - 获取网络接口工具 TestInterface.c
- 写一个完善的 writen - 客户端 - 子进程不断对父进程发送中断信号 - 考虑非阻塞描述符 WriteNClient.c
- 写一个完善的 writen - 服务器 WriteNServer.c
- 习题
-
第 18 章 路由套接字 (
⚠️ linux 系统不支持 sysctl 和路由套接字, 以下代码均在 Mac OSX 运行测试)- sysctl 检查 UDP 校验和是否开启 CheckIfUDPChecksumEnable.c
- sysctl 获取全部 ARP 表项 GetARPTable_BySysctl.c
- sysctl 获取全部路由表项 GetRouteTable_BySysctl.c
- 路由套接字 获取指定路由表项 - (
⚠️ 路由套接字无法获得整个路由表,只能获得指定地址的那一个表项) GetRouteTableEntry_BySockfd.c - 禁用 SO_USELOOPBACK 使得内核不会向进程发送数据 Practise_02.c
- sysctl 获取网络接口工具 InterfaceTool_v2.h InterfaceTool_v2.c
- sysctl 获取网络接口工具 - 测试 TestInterface.c
- 向 2^n 字节对齐 - 宏的测试 RoundUpTest.c
- 获取接口索引 - by 接口名 GetInterfaceIndexByName.c
- 获取接口名 - by 接口索引 GetInterfaceNameByIndex.c
- 习题
-
第 22 章 高级 UDP 套接字编程
- 服务器端获取 UDP 目的 IP - SO_RECVORIGDSTADDR - recvmsg - 服务器 GetUDPIP_server.c
- 服务器端获取 UDP 目的 IP - SO_RECVORIGDSTADDR - recvmsg - 客户端 GetUDPIP_client.c
- UDP 回显客户端 - 验证 UDP 会丢包 UDPEchoClient_TimeoutRecv_TestPacketLoss.c
- 可靠 UDP - 超时重传 - 动态估计 RTO - 指数退避 - 避免重传二义性 - 序号确认 reliable_udp.h reliable_udp.c
- 可靠 UDP - select 版 UDPEchoClient_Reliable_select.c
- 可靠 UDP 测试客户端 UDPEchoClient_Reliable.c
- 并发的 UDP 回显服务器 - 模拟 TCP : 监听套接字收到请求连入, 创建新套接字用于通信 ConccurentUDPEchoServer.c
- 并发的 UDP 回显客户端 - 模拟 TCP : 发送三次握手分组 ConccurentUDPEchoClient.c
- 创建一个指定字节文件 - 填充任意字符 CreateData.c
-
第 24 章 带外数据
- 带外数据 - 发送 SendOutOfBandData_TCPClient.c
- 带外数据 - 接收 - select 异常事件 SendOutOfBandData_TCPSelectServer.c
- 带外数据 - 接收 - SIGURG 信号触发 SendOutOfBandData_TCPServer.c
- 读函数会在带外数据前停下 - 客户端 StopAtOOBMarkTest_client.c
- 读函数会在带外数据前停下 - 服务器 StopAtOOBMarkTest_server.c
- 用 sockatmark 判断下一个待读取字节是否是带外数据 - sockatmark 的 ioctl 实现 - 设置套接字选项 SO_OOBINLINE 则带外数据不使用 MSG_OOB flag 就能读到 StopAtOOBMarkTest_server.c
- 旧的带外数据若不读取,则带外标记会被新的带外标记覆盖 OOBMarkCover_client.c
- 验证在对端 TCP 通告滑动窗口为 0 时,也能把紧急状态通知给对端 - 客户端 FlowControlTestClient.c
- 验证在对端 TCP 通告滑动窗口为 0 时,也能把紧急状态通知给对端 - 命令行参数设置接收缓冲区大小 (KB) - 服务器 FlowControlTestServer.c
- 客户端心跳保活 client_heartbeat_helper.h | client_heartbeat_helper.c
- 服务器心跳保活 server_heartbeat_helper.h | server_heartbeat_helper.c
- 习题
-
第 25 章 信号驱动式 IO
- SIGIO 实现的 UDP recv_and_send udp_echo_driven_by_sigio.h | udp_echo_driven_by_sigio.c
- SIGIO 实现的 UDP 回显服务器 UDPEchoServer_BySIGIO.c
-
第 26 章 线程
- 两个线程无锁递增静态变量 - BUG IncorrectOfMultiThreadIncreaseStaticVar.c
- pthread_join 功能测试 PthreadJoinTest.c
- 线程安全的 readline ReadWriteTool_safe.h | ReadWriteTool_safe.c
- 多线程回显客户端 MultiThreadTCPEchoClient.c
- 多线程回显服务器 MultiThreadTCPEchoServer.c
- 多线程下载客户端 - 轮询 MultiThreadWebClient.c
- 多线程下载客户端 - 条件变量 MultiThreadWebClient_ByCondition.c
- 下载客户端 - 非阻塞 NonblockWebClient.c
-
第 28 章 原始套接字
- struct icmp 不是 8 字节 LookHowManyBytesOfStructICMP.c
- 文件描述符传递 - 读取从服务器传递回的描述符 - 客户端 ReadClient.c
- 文件描述符传递 - 打开文件然后把描述符传递给客户 - 服务器 OpenServer.c
- 看书上的 cksum 对疑惑地方的测试 SignBitExpendTest.c
- ping ping.c
- traceroute - BUG traceroute.c
- traceroute - book traceroute_book.c
- ICMP 守护进程 icmp_daemon.c
- UDP 回显客户端 - 使用 ICMP daemon 接收 ICMP 错误 comm.h | UDPEchoClient.c
-
第 30 章 客户服务器程序设计范式
- 文件锁测试 FileLockTest.c
- TCP 客户端 - 用于测试服务器性能 TCPClient_ForBenchmark.c
- TCP 服务器 - 临时创建子进程 TCPServer_Fork.c
- TCP 服务器 - 进程池 - 各子进程无上锁竞争 accept TCPServer_ForkPool.c
- TCP 服务器 - 进程池 - 各子进程上文件锁 accept TCPServer_FileLockForkPool.c
- TCP 服务器 - 进程池 - 各子进程上 Pthread 锁 accept TCPServer_PthreadLockForkPool.c
- TCP 服务器 - 进程池 - 主进程统一 accept 然后描述符传递给子进程 TCPServer_FdTransmitForkPool.c
- TCP 服务器 - 线程池 - 各子线程无上锁竞争 accept TCPServer_ThreadPool.c
- TCP 服务器 - 线程池 - 主线程统一 accept 后分发给子线程 TCPServer_MainThreadAccept_ThreadPool.c
- TCP 服务器 - 线程池 - 主线程统一 accept 后分发给子线程 - BUG TCPServer_MainThreadAccept_ThreadPool_BUG.c
-
第 1 章 计算机网络和因特网
-
第 2 章 应用层
-
第 3 章 运输层
- note ✅
- 复习题 3.1 ~ 3.3 ✅
- 复习题 3.4 ✅
- 复习题 3.5 ✅
- 复习题 3.7 ✅
- 习题 P1 ~ P2 【目的端口、源端口理解】 ✅
- 习题 P3 ~ P5 【校验和计算】 ✅
- 习题 P6 ~ P16 【可靠传输协议原理】 ✅
- 习题 P17 ~ P21 【设计可靠传输协议】 ✅
- 习题 P22 ~ P24 【GBN、SR】 ✅
- 习题 P25 ~ P28 【TCP 报文段相关计算】 ✅
- 习题 P29 & P55 【SYN cookie】 ✅
- 习题 P30 ~ P33 【TCP 超时时间计算】 ✅
- 习题 P34 ~ P56 【TCP 拥塞控制算法: 理解 & 计算】 ✅
- 编程作业
- 实验
-
第 4 章 网络层
- note ✅
- 复习题 4.1 ~ 4.2 ✅
- 复习题 4.3 ~ 4.4 ✅
- 复习题 4.5 ~ 4.7 ✅
- 习题 P1 ~ P6 【虚电路】 ✅
- 习题 P7 ~ P9 【路由器交换结构】 ✅
- 习题 P10 ~ P18 【前缀匹配、IPv4 编址】 ✅
- 习题 P19 ~ P20 【IP 数据报分片】 ✅
- 习题 P21 ~ P23 【NAT】 ✅
- 习题 P24 ~ P27 【链路状态路由选择算法】 ✅
- 习题 P28 ~ P34 【距离向量路由选择算法】 ✅
- 习题 P35 ~ P43 【BGP】 ✅
- 习题 P44 ~ P55 【广播、多播、生成树】 ✅
- 编程作业
- 分布式距离向量算法
- Ping
- 实验
-
第 5 章 链路层
- note
- 复习题 5.1 ~ 5.2 ✅
- 复习题 5.3 ✅
- 复习题 5.4
- 习题 P1 ~ P7 【奇偶校验、校验和、CRC】
- 习题 P8 ~ P13 【时隙 ALOHA、纯 ALOHA、轮询多路访问】 ✅
- 习题 P14 ~ P16 & P21 ~ P22 & P26 【ARP、MAC 地址、交换机寻址】 ✅
- 习题 P17 ~ P20 【CSMA/CD】 ✅
- 习题 P23 ~ P25 【交换机对比集线器】 ✅
- 习题 P27【IP 语音应用】 ✅
- 习题 P28 ~ P30【VLAN、MPLS】 ✅
- 习题 P31【从打开电脑到获取 Web 页面都发生了什么?】
- 习题 P32 ~ P33【等级体系结构--数据中心】 ✅
- 实验
-
第 8 章 计算机网络中的安全
- note ✅
- 复习题 8.1 ✅
- 复习题 8.2 ✅
- 复习题 8.3 ~ 8.4 ✅
- 复习题 8.5 ~ 8.8 ✅
- 复习题 8.9 ✅
- 习题 P1 ~ P6【对称加密】 ✅
- 习题 P7 ~ P8【非对称加密 RSA】 ✅
- 习题 P9【Diffie-Hellman 协商密钥算法】 ✅
- 习题 P10【使用 KDC 给 Alice 和 Bob 分发对称密钥】 ✅
- 习题 P11 ~ P12【书上内容理解:校验和为什么不好,提供机密性和完整性】 ✅
- 习题 P13【BitTorrent 中的完整性校验】 ✅
- 习题 P15 ~ P16【使用端点鉴别的注意事项】 ✅
- 习题 P17 ~ P18【安全电子邮件和 PGP】 ✅
- 习题 P19 ~ P21【SSL】 ✅
- 习题 P22 ~ P23【IPsec】 ✅
- 习题 P24【WEP】 ✅
- 习题 P25【传统分组过滤器,状态分组过滤器】 ✅
- 习题 P26【匿名与隐私】 ✅
- 实验