TCP 与 UDP 是网络传输层的两大核心协议,它们以截然不同的方式定义了数据在应用程序间的传输。TCP 如同一次通话,追求可靠与完整;UDP 则像一张明信片,主张高效与迅捷。正是这两种设计哲学的差异,决定了它们在网页浏览、文件传输、视频会议、在线游戏等不同场景下的应用。本文将深入解析二者的核心机制与关键差异。
本系列的前几篇文章中,我们已经探讨了设备如何通过 IP 地址获得身份、如何通过 DNS 将域名解析为地址,以及如何通过 DHCP、NAT 和 VPN 等技术接入并穿梭于复杂的网络环境。至此,我们的设备已经具备了“定位”并“连接”到目标服务器的能力。
本文将深入探讨这个连接建立之后,应用程序之间进行通信所使用的“语言”——HTTP 协议,以及其安全版本 HTTPS。这两种协议构成了现代万维网的基石。
最近读到喵神的《编译器,靠你了!使用类型改善状态设计》,深受启发。这篇文章让我意识到,我在设计 RaAPIWrapper 时,为了解决一些工程问题而采用的方案,在不经意间与“类型即状态”的设计思想不谋而合。
我之前还没有正式介绍过这个库,所以借此机会,正式与大家分享 RaAPIWrapper 的设计,特别是它为了解决特定问题而采用的架构,以及这些决策在事后看来,是如何“碰巧”实现了更先进的设计模式。
在上一篇文章的结尾,我们探讨了多种内网穿透技术,并初步介绍了 WireGuard 作为一种现代化 VPN 解决方案的优势。其实在更早之前,我们就亲手编译过 WireGuard 在 iOS 端的 SDK,也使用 WireGuard 实现过群晖 NAS 的公网访问。
本文将以 macOS 环境为基础,深入 WireGuard 内部,从内核交互的底层细节出发,解构虚拟网卡的实现机制,并详细剖析其密码学和路由设计。
mise 是一款高性能的开发工具管理器,旨在通过单一工具和单一配置文件,实现对所有开发环境的统一管理。它能有效解决多项目开发中环境配置的复杂性,提升开发效率。
作为 Swift 开发者,我们都热爱这门语言提供的优雅和简洁性,尤其是它的函数式编程能力。
Swift 原生提供了一些高阶函数,常见的比如 map、filter、reduce 等。这些优雅的高阶函数能够极大的简化我们的代码,但是一个不小心也会报一个让你困扰一整天的错误。
今天,我们就来看看其中一种情况。
最近在研究 Surge,众所周知主包这方面知识贼差,几乎可以算是从零开始学起,所以也想借这个机会好好补一下相关知识。
预计会写一系列文章,从计算机网络的基础概念开始,后续会包含常见的接口请求流程以及 WireGuard 等相关内容。
本篇就是系列的第一篇。
CombineCocoa 已有一段时间未更新,但其中许多代码仍能正常工作,比如 Delegate 的这部分。
今天我们先从这部分代码入手,看看如何使用 Combine 拦截 UIKit 中的各类 delegate 对象,再深入探讨其背后的 Runtime 实现。
在 Swift 开发中,我们常常利用 extension 和 // MARK: 来划分代码逻辑,比如划分出 “Config”、“Life cycle” 等模块。然而,在使用扩展时却常常会遇到方法覆写的问题,尤其是在定义基类的“框架方法”后,子类无法正确覆写的问题。
本文将通过覆写方法,深入探讨 Swift 中的方法派发机制,并讨论如何在代码设计时规避常见坑点。
问 ChatGPT 写了一个 shell 脚本,可以在命令行中按照从大到小,递归地输出除了 .json 文件外的文件,包含文件大小和文件名。可用于辅助筛查项目中哪些图片过大。
最近项目有了国际化(i18n)的需求,正好 WWDC23 上 Apple 推出了 String Catalog 功能。趁此机会尝试一下,并将一些经验记录下来。
本文持续记录一些使用 ArkTS 进行 HarmonyOS 开发时遇到的一些问题以及解决方案。以及一些可能称不上是问题,但是在我看来有必要记录一下的点。
之前的文章中介绍过,iOS 常用的 Gitlab-CI 执行器是 shell,因为打包时只能使用这个。
今天将包管理工具迁到 mise 时遇到了一些和 shell 有关的问题,涉及到一些之前的知识盲区,遂记录一下。
如何正确的刷新 Epoxy 列表可以说是熟练使用这个框架的关键,初上手时总会有 “为什么列表刷新后数据没变” 和 “为什么它刷新后数据就变了” 的疑惑。
本文从源码分析的角度,带大家来梳理 Epoxy 列表刷新的原理,并学会如何正确刷新 Epoxy 列表。
常规的在扩展中定义存储属性的方法是借助 Objective-C 的 runtime 进行属性关联。但是这个方法仅限于 ObjC 类,那么纯 Swift 类,比如结构体该怎么办呢?
在 epoxy 这个库中发现了解决办法。