什么是socket
Socket,又称套接字,最常见的socket类型是AF_INET,代表着协议族IPv4,这种socket指的是应用程序进程与传输层协议之间的接口。
根据socket的类型不同,用来标识socket的address也有所不同。对于AF_INET类型的socket来说,它的地址是由(hostname, port)所构成的一个tuple。hostname可以是任意的由DNS解析的名字,也可以是一个IP地址,需要注意的是,如果将hostname指定为'',则其代表着INADDR_ANY,即用来绑定所有的网络接口(网卡),假如一个host安装有多个网卡,如果这个host想同时监听所有网卡上某个port的数据包,针对每一个网卡单独创建一个socket就稍显繁琐,而使用''则很好地解决来这个问题,所有发往或离开这个host的所有网卡的某个port的数据包都会经过这一个socket。
至于为什么可以用(hostname, port)的组合来识别一个socket呢?
首先,hostname会被DNS解析成一个IP地址,那么它就代表着网络上的某一个特定的host,其次我们使用socket的目地是为了在不同的hosts之间传递消息,那么就涉及到消息最终是传递给目标主机的哪个应用程序进程。而port就是用来判断传递来的消息是由哪个进程所接收。正如我们刚才所提到的,socket是应用程序进程与传输层协议之间的接口,我们可以想象每一个socket都与一个特定的进程所绑定,透过绑定的socket进程可以向位于其他host上的进程发送消息或接收消息。既然socket是与一个进程所绑定,而进程又是通过port来识别的,同时我们还要区分处在不同的host上的socket,所以socket的address是由(hostname, port)组成的。