本机起服务调试,还会建立 TCP 连接吗?

2021-09-10 11:03:43 +08:00
 palemoky

最近在看 TCP 方面的书,如果客户端与服务端不在同一主机可以理解数据包的链路,突然有个疑问,如果我在本机开启服务调试请求,数据包链路是怎样的呢?还会进行 TCP/IP 封包到网卡兜一圈吗?

1138 次点击
所在节点    问与答
15 条回复
iBugOne
2021-09-10 11:09:38 +08:00
该有的封包、路由、防火墙等当然还是有,一层层下去直到 IP 层,但是不会上物理网卡,本机流量有个专属端口叫回环( loopback ),可以当做在内存里绕了一圈
iBugOne
2021-09-10 11:12:40 +08:00
对于 TCP 服务,端口、连接、滑动窗口、拥塞控制一样都不会少,不过因为“内存里绕一圈”的这个“链路”不会丢包,这些东西基本上没啥影响
datoujiejie221
2021-09-10 11:40:29 +08:00
装个 wireshark 抓 loopback 的包
cubecube
2021-09-10 11:42:32 +08:00
会走一遍协议栈,所以端口流量都会有,最后不真上网卡。
数据在 hard_start_xmit 往设备上发的时候,被 loopback_dev 设备拦截就往回走了。

内核里面有源码,如果按照 tcpip 去理解,就是除了物理层都会走
jasonyang9
2021-09-10 11:53:16 +08:00
回环的设计真的很棒
chairuosen
2021-09-10 11:54:25 +08:00
@iBugOne 学习了,如果访问的是本机的外网 ip 监听的端口,也会被 loopback 拦截么?
warcraft1236
2021-09-10 12:29:11 +08:00
@chairuosen 坐等答案,感觉会
palemoky
2021-09-10 12:55:37 +08:00
@iBugOne @cubecube @datoujiejie221 感谢三位的解答,我用 wireshark 抓个包研究下
iBugOne
2021-09-10 13:12:40 +08:00
@chairuosen 看你说的是哪个“外网”,如果是操作系统里登记在网卡上的 IP 地址,那么一样是走 loopback ( Linux 运行 ip r s t local 查看回环路由表),如果是经过层层 NAT 的“真 · 外网”,那还是要从网卡出去的,因为操作系统不知道你 NAT 后的 IP 地址
iBugOne
2021-09-10 13:14:14 +08:00
@cubecube 取决于 iface 类型,链路层也不一定会走,比如 loopback 和三层隧道( GRE / WireGuard )就没有链路层,所以我前面说封包只说封到 IP 层
lysS
2021-09-10 14:52:50 +08:00
@datoujiejie221 早就试过了,这种抓不到
zhoudaiyu
2021-09-10 17:54:07 +08:00
Unix Domain Socket 就不会🐶
cubecube
2021-09-11 16:10:37 +08:00
@iBugOne 我之所以没说链路层这个茬,就是因为现实中不存在呀。没必要硬去套 7 层模型
iBugOne
2021-09-11 18:28:26 +08:00
@zhoudaiyu UDS 只是一种承载方式,而且如果你用了 UDS 应该就没有 TCP 这个概念了吧。

AF_UNIX 本质上是 Unix IPC,不经过网络栈,有独立于 TCP/UDP 的两套面向数据流和数据包的“协议”,并且 API 甚至一些行为也和 T/U 不完全一致。
julyclyde
2021-09-13 14:33:21 +08:00
TCP/IP 其实和网卡没啥关系,谈不上“去网卡”绕一圈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/800999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX