简介

之前的文章咱们讲到了Socket中的Stream Socket和Datagram Socket,这两种Socket通常别离是基于tcp和udp协定来进行数据的传输。这两种Socket都有一个独特的特点,那就是须要一个IP地址和端口来建设客户端和服务器端的连贯。

那么明天咱们会来解说一个非凡的socket,这个socket不须要应用传统的IP地址和端口,而是应用文件系统来进行程序之间的数据交互,并且这样的socket只能应用在unix零碎上。这样的socket就是明天咱们要解说的Unix domain Socket。

什么是Unix domain Socket

什么是Unix domain Socket呢? 咱们从名字就可以看进去,这个Socket是和unix domain有关系的,也就是说这个socket须要用到unix上面的一些非凡性能。

咱们思考下罕用的windows零碎和unix零碎,他们最大的区别在哪里呢?

其实最大的区别就是unix操作系统中所有都能够看做是文件,包含程序运行的一些信息。

那么咱们是不是能够间接借助于这些程序运行时产生的文件来进行不同程序之间数据的交互呢?答案是必定的。这就是咱们明天要探讨的Unix domain Socket。

Unix domain Socket能够简称为UDS,不同程序间的数据能够在操作系统层,借助于文件系统来进行数据交换。

对于程序自身来说,只须要读取和写入共享的socket文件即可,也就是说不同的程序之间通过socket文件来进行数据交互。

和基于IP和端口的Socket一样,Unix domain Socket也能够分为Stream Socket和Datagram Socket。

咱们最多看到Unix domain socket的中央可能就是docker了,作为一种容器技术,docker须要和实体机进行疾速的数据传输和信息替换,个别状况下UDS的文件是以.socket结尾的,咱们能够在/var/run目录上面应用上面的命令来查找:

find . -name "*.sock"

如果你有docker在运行的话,能够失去上面的后果:

./docker.sock./docker/libnetwork/6d66a24bfbbfa231a668da4f1ed543844a0514e4db3a1f7d8001a04a817b91fb.sock./docker/libcontainerd/docker-containerd.sock

能够看到docker是通过下面的3个sock文件来进行通信的。

应用socat来创立Unix Domain Sockets

之前提到了socat这个万能的工具,不仅能够创立tcp的监听服务器,还能创立udp的监听服务器,当然对于UDS来说也不在话下。咱们来看下应用socat来创立UDS服务器所须要用到的参数:

      unix-listen:<filename>    groups=FD,SOCKET,NAMED,LISTEN,CHILD,RETRY,UNIX      unix-recvfrom:<filename>  groups=FD,SOCKET,NAMED,CHILD,RETRY,UNIX

这里咱们要应用到unix-listen和unix-recvfrom这两个参数,unix-listen示意的是创立stream-based UDS服务,而unix-recvfrom示意的是创立datagram-based UDS。

能够看到两个参数前面都须要传入一个文件名,示意UDS socket的地址。

咱们能够这样应用:

socat unix-listen:/tmp/stream.sock,fork /dev/null&socat unix-recvfrom:/tmp/datagram.sock,fork /dev/null&

这里咱们应用/tmp/datagram.sock来示意这个socket信息。

其中fork参数示意程序在接管到程序包之后持续运行,如果不必fork,那么程序会主动退出。

socat前面原本要接一个bi-address,这里咱们应用/dev/null,示意抛弃掉所有的income信息。

运行后咱们可能失去上面的后果:

[1] 27442[2] 27450

示意程序曾经胜利执行了,返回的是程序的pid。

应用ss命令来查看Unix domain Socket

在应用ss命令之前,咱们先来看下应用socat生成的两个文件:

srwxrwxr-x   1 flydean flydean    0 Mar  2 21:58 stream.socksrwxrwxr-x   1 flydean flydean    0 Mar  2 21:59 datagram.sock

能够看到这两个文件的权限,rwx大家都懂,别离是read,write和执行权限。那么最后面的s是什么呢?

最后面的一位示意的是文件类型,s示意的就是socket文件。

扩大一下,这个地位还能够有其余几种选项:p、d、l、s、c、b和-:

其中p示意命名管道文件,d示意目录文件,l示意符号连贯文件,-示意一般文件,s示意socket文件,c示意字符设施文件,b示意块设施文件。

接下来咱们应用ss命令来查看一下之前建设的UDS服务。

这里须要应用到上面几个参数:

   -n, --numeric       don't resolve service names   -l, --listening     display listening sockets   -x, --unix          display only Unix domain sockets

这里咱们须要应用到下面3个选项,x示意的是显示UDS,因为是监听,所以应用-l参数,最初咱们心愿看到具体的数字,而不是被解析成了服务名,所以这里应用-n参数。

咱们能够尝试执行一下上面的命令:

ss -xln

输入会很多,咱们能够grep咱们须要的socket如下所示:

ss -xln | grep tmpu_str  LISTEN     0      5      /tmp/stream.sock 11881005              * 0                  u_dgr  UNCONN     0      0      /tmp/datagram.sock 11882190              * 0  

u_str示意的是UDS stream socket,而u_dg示意的是UDS datagram socket。

咱们能够应用stat命令来查看socket文件的具体信息:

stat /tmp/stream.sock /tmp/datagram.sock  File: ‘/tmp/stream.sock’  Size: 0               Blocks: 0          IO Block: 4096   socketDevice: fd02h/64770d    Inode: 134386049   Links: 1Access: (0775/srwxrwxr-x)  Uid: ( 1002/    flydean)   Gid: ( 1002/    flydean)Access: 2022-03-01 22:33:21.533000000 +0800Modify: 2022-03-01 22:33:21.533000000 +0800Change: 2022-03-01 22:33:21.533000000 +0800 Birth: -  File: ‘/tmp/datagram.sock’  Size: 0               Blocks: 0          IO Block: 4096   socketDevice: fd02h/64770d    Inode: 134386050   Links: 1Access: (0775/srwxrwxr-x)  Uid: ( 1002/    flydean)   Gid: ( 1002/    flydean)Access: 2022-03-01 22:33:22.306000000 +0800Modify: 2022-03-01 22:33:22.306000000 +0800Change: 2022-03-01 22:33:22.306000000 +0800 Birth: -

应用nc连贯到Unix domain Socket服务

nc是一个十分弱小的工具,除了能够进行TCP,UDP连贯之外,还能够进行UDS的连贯,咱们须要应用到上面的参数:

  -U, --unixsock             Use Unix domain sockets only  -u, --udp                  Use UDP instead of default TCP  -z                         Zero-I/O mode, report connection status only

-U示意连贯的是一个unixsocket。-u示意是一个UDP连贯。

默认状况下nc应用的是TCP连贯,所以不须要额定的参数。

另外咱们间接建设连贯,并不发送任何数据,所以这里应用-z参数。

先连贯Stream UDS看看:

nc -U -z /tmp/stream.sock

如果没有输入任何异样数据,阐明连贯胜利了。

而后再连贯Datagram UDS看看:

nc -uU -z /tmp/datagram.sock

同样的,如果没有任何异样数据,阐明Socket连贯胜利了。

总结

在本章咱们具体介绍了Unix Domain Socket的含意,并且应用了unix中的一些工具实现了UDS的建设,检测和连贯。基本上形容了UDS的应用状况。

本文已收录于 http://www.flydean.com/17-unix-domain-socket/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!