你好,来自遥远的未来,即 2018 年,到 2012 年。
其实背后是有原因的connect()
在实践中使用 UDP 套接字(尽管有幸 POSIX及其实现 http://man7.org/linux/man-pages/man7/udp.7.html#DESCRIPTION理论上不需要你这样做)。
普通的 UDP 套接字不知道其未来目的地的任何信息,因此它每次都会执行一次路由查找sendmsg()叫做 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/udp.c#L1073.
然而,如果connect()
预先使用特定远程接收者的 IP 和端口调用,操作系统内核将能够记下对路由的引用并将其分配给套接字 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/datagram.c#L23,如果随后发送消息,则显着加快发送消息的速度sendmsg()
calls 不指定接收者 (否则之前的设置将被忽略 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/udp.c#L957),选择默认值。
看着那(这lines 1070通过1171 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/udp.c#L1070:
if (connected)
rt = (struct rtable *)sk_dst_check(sk, 0);
if (!rt) {
[..skip..]
rt = ip_route_output_flow(net, fl4, sk);
[..skip..]
}
在 Linux 内核 4.18 之前,此功能主要仅限于 IPv4 地址族。然而,从 4.18-rc4 开始(希望 Linux 内核版本 4.18 也是如此),它也具有 IPv6 套接字的完整功能 https://github.com/torvalds/linux/commit/96818159c3c08911330e84f86b3becf71aeeaac8#diff-7694f9a90076d47dc99a635be4a4409b.
它可能是一个来源显着的性能优势 https://www.ietf.org/mail-archive/web/quic/current/msg03721.html,尽管这在很大程度上取决于您所使用的操作系统。至少,如果您使用 Linux 并且不将套接字用于多个远程处理程序,那么您应该尝试一下。