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