最近在看 TCP 方面的书,如果客户端与服务端不在同一主机可以理解数据包的链路,突然有个疑问,如果我在本机开启服务调试请求,数据包链路是怎样的呢?还会进行 TCP/IP 封包到网卡兜一圈吗?
1
iBugOne 2021-09-10 11:09:38 +08:00 via Android 1
该有的封包、路由、防火墙等当然还是有,一层层下去直到 IP 层,但是不会上物理网卡,本机流量有个专属端口叫回环( loopback ),可以当做在内存里绕了一圈
|
2
iBugOne 2021-09-10 11:12:40 +08:00 via Android
对于 TCP 服务,端口、连接、滑动窗口、拥塞控制一样都不会少,不过因为“内存里绕一圈”的这个“链路”不会丢包,这些东西基本上没啥影响
|
3
datoujiejie221 2021-09-10 11:40:29 +08:00
装个 wireshark 抓 loopback 的包
|
4
cubecube 2021-09-10 11:42:32 +08:00
会走一遍协议栈,所以端口流量都会有,最后不真上网卡。
数据在 hard_start_xmit 往设备上发的时候,被 loopback_dev 设备拦截就往回走了。 内核里面有源码,如果按照 tcpip 去理解,就是除了物理层都会走 |
5
jasonyang9 2021-09-10 11:53:16 +08:00
回环的设计真的很棒
|
6
chairuosen 2021-09-10 11:54:25 +08:00
@iBugOne 学习了,如果访问的是本机的外网 ip 监听的端口,也会被 loopback 拦截么?
|
7
warcraft1236 2021-09-10 12:29:11 +08:00
@chairuosen 坐等答案,感觉会
|
8
palemoky OP |
9
iBugOne 2021-09-10 13:12:40 +08:00 via Android
@chairuosen 看你说的是哪个“外网”,如果是操作系统里登记在网卡上的 IP 地址,那么一样是走 loopback ( Linux 运行 ip r s t local 查看回环路由表),如果是经过层层 NAT 的“真 · 外网”,那还是要从网卡出去的,因为操作系统不知道你 NAT 后的 IP 地址
|
10
iBugOne 2021-09-10 13:14:14 +08:00 via Android
@cubecube 取决于 iface 类型,链路层也不一定会走,比如 loopback 和三层隧道( GRE / WireGuard )就没有链路层,所以我前面说封包只说封到 IP 层
|
11
lysS 2021-09-10 14:52:50 +08:00
@datoujiejie221 早就试过了,这种抓不到
|
12
zhoudaiyu 2021-09-10 17:54:07 +08:00 via iPhone
Unix Domain Socket 就不会🐶
|
14
iBugOne 2021-09-11 18:28:26 +08:00 via Android
@zhoudaiyu UDS 只是一种承载方式,而且如果你用了 UDS 应该就没有 TCP 这个概念了吧。
AF_UNIX 本质上是 Unix IPC,不经过网络栈,有独立于 TCP/UDP 的两套面向数据流和数据包的“协议”,并且 API 甚至一些行为也和 T/U 不完全一致。 |
15
julyclyde 2021-09-13 14:33:21 +08:00
TCP/IP 其实和网卡没啥关系,谈不上“去网卡”绕一圈
|