linux 中 socket 文件是什么?和 socket 编程有什么关系?和 TCP/IP 协议栈又有什么关系?
要理解 linux 中的 socket 文件,以及什么是socket 编程,首先需要知道两个知识点:
1、什么是进程,进程名又是什么?
2、进程之间是如何通信的?
问题1:什么是进程,以及进程名是什么
进程是一个过程,简单理解就是将存放到外部存储(硬盘)上的内容加载到内部存储(内存中),然后经 CPU 的处理来完成某个操作,这个完整的过程就叫做进程。
linux 中常说的进程名其实就是指启动进程的可执行文件的名称。例如:我再终端执行 sleep 100;也可以理解为我启动了一个 sleep 进程,这个进程名就叫作 sleep 100;
问题2:进程之间是如何通信的
进程间通信方式很多,比如管道、共享内存、消息队列等,这里讨论的是通过 TCP/IP 协议栈 的通信方式。
从 TCP/IP 五层模型上理解,进程位于应用层,假设 A进程 要和 B进程 通信,按照网络中的封装和解封装来说。A进程产生的数据报文会先经过传输层、网络层、数据链路层封装,然后通过物理层以比特流(0和1)的形式传递给进程B。
进程B要收到这个数据,在物理层收到后,经数据链路层、网络层、传输层一路解包,然后根据特定的应用层协议指定的格式来解析数据,从而就得到了A发送的数据。
所以即使是同一个主机上的两个进程通信,也需要经过TCP/IP协议栈(这个就是主机实现数据链路层、网络层、传输层相关功能的内置程序)处理,也就是两个进程之间通信,双方都要开放一个端口来实现端到端传输。
所以为了优化同一个主机上不同进程之间的通信,也就有了 socket 文件
在 Linux 中,如果两个进程使用 TCP socket(使用 TCP 协议的 socket 编程) 通信,即使位于同一台主机,也要经过传输层和网络层,传输层使用端口标识上层应用层的进程,网络层使用IP地址来寻址,也就是找到和哪个主机通信。所以传统通信模式下,需要知道对方的:IP + 端口。
但是同一个主机上的不同进程间通信,大家都是在同一个主机上的,数据还要通过TCP/IP五层模型,还要经过TCP/IP协议栈来处理,效率不高,所以就出现了 socket 文件。
linux 中 socket 文件的文件类似为s,有了 socket 文件后,同一主机上的socket 文件通信就不走协议栈了,而是将 socket 文件作为通信地址,以前是需要 IP+端口 才能找到对方,现在直接通过 socket 文件就找到对方了。
这种方式因为减少了协议栈封装/解包,而且服务端还不用暴露端口了,就更高效、更快、更安全。
知道了 socket 文件,那什么是 socket 编程?
socket 是操作系统在 TCP/IP 协议栈之上提供的一组通信接口,它屏蔽了网络协议处理的底层细节,应用程序不需要实现 TCP、UDP、IP 等协议,只需要通过 socket API 函数就可以使用网络通信功能。
例如:开发一个服务需要监听 8080 端口,只需要调用 socke提供的接口即可,无需自己实现 TCP 连接建立、重传机制、ACK、拥塞控制,以及网络层寻址等复杂逻辑。
什么是 TCP/IP 协议栈,和 TCP socket 有啥关系?
TCP/IP 协议栈是集成在操作系统内核中的程序代码,作用就是实现网络层、传输层等相关的网络协议(协议栈就是 TCP/IP 协议的具体实现)。例如:TCP 如何三次握手建立连接,IP数据包如何分片、IP如何寻址等。
因为 TCP/IP 协议栈本身就是由操作系统内核实现的,所以一台主机其内部包含完整的 TCP/IP 协议栈。
TCP socket 就是访问 TCP/IP 的接口,因为进程都是用编程语言写的程序嘛,程序的编写者会调用 socket API 来实现网络通信。
浙公网安备 33010602011771号