本机-Socket-进程间通信时数据包是否经过网卡
目录
本机 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 接口 —— 应用层。
即,先从上而下到网络层,然后随即再向上到应用层。