Internet/Unix socket

socket是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。socket实现了网络协议栈的网络层和传输层。

UNIX/Linux 中的一切都是文件,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。

为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如:

  • 通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;
  • 通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。

UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。

通过 socket() 函数可以创建一个网络连接,或者说打开一个网络文件,socket() 的返回值就是文件描述符。剩下的操作就是对这个文件的操作了。

Internet套接字用于网络上两个主机之间的交互,Unix套接字用于单个主机上两个进程之间的交互。

Internet socket通过监听ip和端口号,而Unix socket是通过监听socket类型的文件在文件系统上的路径。

两种传输方式:

  • SOCK_STREAM
    传输层使用TCP连接,可靠、按序、异步
  • SOCK_DGRAM
    传输层使用UDP连接,快速、非顺序、同步