使用 Multipath TCP 为 iOS 创建备份连接(转)

本文介绍Multipath TCP (MPTCP)在iOS设备(如iPhone和iPad)上的工作原理,它允许设备通过Wi-Fi和蜂窝移动数据同时建立连接,提高网络连接的可靠性和效率。MPTCP使用TCP选项域30,若网络不支持则回退到标准TCP连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章的英文版如下:

https://support.apple.com/en-us/HT201373

这里咱们采用苹果手机打开测试网站,发现没有检测到MPTCP,初步猜想可能需要打开什么设置,后续补上。参考下https://developer.apple.com/documentation/foundation/urlsessionconfiguration/improving_network_reliability_using_multipath_tcp

如果您是网络管理员,您可以将 Multipath TCP 与 iOS 搭配使用,以加强与您的目标主机的连接。 

 

iOS 支持 Multipath TCP (MPTCP),并且允许 iPhone 或 iPad 通过蜂窝移动数据连接建立与目标主机的备份 TCP 连接。

网络管理员可能需要使用 MPTCP。使用标准家庭网络的客户无需启用 MPTCP。

关于 Multipath TCP

MPTCP 是对传输控制协议 (TCP) 规范的一组扩展。凭借 MPTCP,客户端可以通过不同网络适配器连接到有多个连接的同一目标主机。这可在各主机间建立强大而高效的数据连接,并且与现有的网络基础设施兼容。 

iPhone 或 iPad 上的 Mulitpath TCP

iPhone 和 iPad 在具有活跃的蜂窝移动数据连接的情况下使用 MPTCP 来建立两个连接:

  • 通过 Wi-Fi 的主要 TCP 连接
  • 通过蜂窝移动数据的备用连接

如果 Wi-Fi 不可用或无响应,iOS 会使用蜂窝移动数据连接。

MPTCP 使用 TCP 选项域 30,这是互联网编号分配机构 (IANA) 专为此用途而保留的。如果 iOS 设备与服务器之间的任何中间盒(如路由器或交换机)都不支持 MPTCP,则 iOS 会建立标准的 TCP 连接。

例如,当您向 Siri 提问时,Siri 会尝试通过 Wi-Fi 建立 MPTCP 连接。如果连接成功,Siri 会通过蜂窝移动数据建立备用连接。如果 Wi-Fi 不可用或不可靠,则 MPTCP 会立即在后台切换到蜂窝移动数据。

为网络开启 MPTCP

MPTCP 与现有网络兼容。如果某个网络不支持 MPTCP,则客户端会使用标准的 TCP 连接。不过,网络管理员必须查看其防火墙政策,以确保所有介入设备都允许 TCP 选项 30,才能以未修改的方式传递信号。

很多商用路由器会将未知的 TCP 选项替换为 NOOP 数据。询问您的供应商如何开启 TCP 选项。

有关非 Apple 制造的产品或非 Apple 控制或测试的独立网站的信息仅供参考,不代表 Apple 的任何建议或保证。Apple 对于第三方网站或产品的选择、性能或使用不承担任何责任。Apple 对于第三方网站的准确性和可靠性不作任何担保。互联网的使用具有一定风险。请联系供应商以了解其他信息。其他公司和产品名称可能是其各自所有公司的商标。

转载于:https://www.cnblogs.com/lanjianhappy/p/9812516.html

<think>我们正在处理用户关于MyBatis插入返回主键的问题。根据引用[1][2][3],我们可以看到在MyBatis中有两种主要方式来实现这个需求:使用`@SelectKey`注解(注解方式)或使用`<selectKey>`标签(XML方式)。两种方式的核心都是执行一个数据库函数来获取最后插入的自ID。 用户的需求是:在执行新语句后返回主键的值。 根据引用内容,我们可以总结如下: 1. 对于MySQL数据库,常用的函数是`LAST_INSERT_ID()`(引用[1][2])或`@@IDENTITY`(引用[3])。 2. 使用`<selectKey>`标签时,需要设置`order`属性为`AFTER`(表示在insert语句之后执行),`keyProperty`指定将返回的值设置到参数的哪个属性中,`resultType`指定返回值的类型。 3. 在注解方式中,使用`@SelectKey`注解,并设置`before=false`表示在insert之后执行。 因此,我们可以提供两种方式的示例: 方式一:XML映射文件方式 ```xml <insert id="insertUser" parameterType="User"> <!-- 在插入之后,获取自主键并设置到参数的id属性中 --> <selectKey keyProperty="id" resultType="long" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user (username, password) VALUES (#{username}, #{password}) </insert> ``` 方式二:注解方式(在Mapper接口的方法上使用) ```java @Insert("INSERT INTO user (username, password) VALUES (#{username}, #{password})") @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = long.class) int insertUser(User user); ``` 注意:在调用insert方法后,传入的参数对象(例如User对象)的id属性就会被自动赋值为自主键的值。 另外,引用[3]中使用了`SELECT @@IDENTITY`,但需要注意,`@@IDENTITY`和`LAST_INSERT_ID()`在MySQL中都可以获取自ID,但`LAST_INSERT_ID()`是基于当前连接的,不会受到其他连接的影响,更安全。而`@@IDENTITY`是获取当前数据库最后一次插入的自ID,如果有其他连接插入数据,可能会获取到错误的ID。所以推荐使用`LAST_INSERT_ID()`。 因此,我们给出推荐做法:使用`LAST_INSERT_ID()`。 引用[1][2][3]都提供了类似的方法,我们可以参考。 最后,我们还需要注意,不同的数据库获取自主键的方式可能不同,例如Oracle需要使用序列。但用户明确提到MySQL,所以这里只考虑MySQL。 根据以上分析,我们给出回答。</think>### MyBatis 插入操作后返回主键值的方法 在 MyBatis 中获取插入操作后的自主键值,主要通过 `<selectKey>` 标签或 `@SelectKey` 注解实现。以下是两种常用方法: #### 方法一:XML 映射文件配置(推荐) ```xml <insert id="insertUser" parameterType="User"> <!-- 核心配置:插入后获取自ID --> <selectKey keyProperty="id" <!-- 将返回值绑定到实体类的id属性 --> order="AFTER" <!-- 在INSERT语句执行后执行 --> resultType="java.lang.Long" statementType="PREPARED"> SELECT LAST_INSERT_ID() <!-- MySQL函数获取最新自ID --> </selectKey> INSERT INTO user (name, email) VALUES (#{name}, #{email}) </insert> ``` **调用方式**: ```java User user = new User("张三", "zhangsan@example.com"); mapper.insertUser(user); // 插入后自动填充主键 System.out.println("生成的主键ID:" + user.getId()); // 直接获取实体对象的id ``` #### 方法二:注解方式配置 ```java @Insert("INSERT INTO user (name, email) VALUES (#{name}, #{email})") @SelectKey( statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", // 绑定到实体类的id属性 before = false, // 在INSERT之后执行 resultType = Long.class ) int insertUser(User user); ``` #### 关键配置说明: 1. **`keyProperty`** 指定实体类中接收主键值的属性名(如 `id`) 2. **`order`** - `AFTER`:适用于 MySQL 自主键插入后获取) - `BEFORE`:适用于 Oracle 序列(插入前获取) 3. **数据库函数** - MySQL:`SELECT LAST_INSERT_ID()` (确保同连接内立即获取,不受其他会话影响[^2][^3]) - SQL Server:`SELECT SCOPE_IDENTITY()` - PostgreSQL:`RETURNING id` > ⚠️ **注意事项** > - 需确保数据库表主键设置为 `AUTO_INCREMENT`(MySQL) > - 批量插入时 `LAST_INSERT_ID()` 仅返回第一条数据的ID > - 高并发场景建议使用 `@@IDENTITY`(但需注意触发器影响)[^3] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值