本机 Socket 进程间通信时数据包是否经过网卡

目录


在进行 socket 通信的时候突然想到一个问题:自身既作为 client 又作为 server 时,数据包在传递过程中是否会经过网卡呢?

先说结论:不经过

下面通过实验验证此结论。

实验

  • 设计实验:在一台设备上进行 socket 通信,并抓包查看数据包是否存在 MAC 地址,因为如果经过网卡的话,一定是有 MAC 地址的。

1. 编写 socket 代码

编写 TCP 通信代码,如下。

client

# coding:utf-8

from socket import *

tcp_client = socket(AF_INET, SOCK_STREAM)
addr = ("", 7788)  # 服务器地址
tcp_client.connect(addr)  # 连接到服务器

# while True:
send_data = "Hello World"
tcp_client.send(send_data.encode("utf-8"))  # 向服务器发送数据

recv_data = tcp_client.recv(1024)  # 接收服务器发过来的数据
print(recv_data.decode("utf-8"))

tcp_client.close()

server

# coding:utf-8

from socket import *

tcp_server = socket(AF_INET, SOCK_STREAM)

addr = ("", 7788)  # 接收数据的端口
tcp_server.bind(addr)  # 绑定地址

while True:

    tcp_server.listen(128)  # 监听连接

    client_socket, client_addr = tcp_server.accept()  # 创建新的套接字为客户端服务
    print(client_addr)  # 打印客户端地址

    recv_data = client_socket.recv(1024).decode("utf-8")  # 接收客户端信息
    print(recv_data)

    send_data = "ok."
    client_socket.send(send_data.encode("utf-8"))

    client_socket.close()

tcp_server.close()

2. 抓包

启动 server 和 client 进行 tcp 通信,使用 wireshark 抓包,如下:

在这里插入图片描述

从图中可以看出,client 和 server 有完整的三次握手和四次挥手。

如果为了验证所抓的包是否真的是我们编写的 socket 通信代码产生的数据包,可以查看此数据包:

在这里插入图片描述

从上图可以看到我们确实捕获了正确的数据包。

3. 分析包结构

随便选中一个数据包,在 wireshark 下方窗口查看其包结构,如下:

在这里插入图片描述

可以看到此数据包并没有 MAC 地址,这个 「Null/Loopback」是什么呢?

博客 说 Loopback 接口是一种纯软件性质的虚拟接口,任何送达该接口的网络数据报文都会被认为是送往设备自身的,所以数据包并没有经过网卡。

结论

所以本机 Socket 进程间通信时,数据包并不经过网卡。

报文经过的路径是这样的:

应用层 —— Socket 接口 —— 传输层 —— 网络层 —— 传输层 —— Socket 接口 —— 应用层。

即,先从上而下到网络层,然后随即再向上到应用层。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值