Linux网络编程基础 --- IP地址和端口号

1. 引言

网络通信的本质仍然是进程间通信。

以前,我们在学习进程间通信的时候(共享内存、管道、以及用于同步的信号量),并没有提到过网络 IPC,那时候是因为基础不太够。另一方面,之前讲的进程间通信,所有的进程都位于同一个操作系统上。

然而网络通信跨越了这条“鸿沟”,穿越了世俗的界限,将进程间通信扩展到了不同的计算机上。

在同一个操作系统上,不同进程之间可以使用进程的 pid 号进行唯一标识。但是如果在不同计算机上,这种方法就行不通了,因为不同计算机上,也会有两个一样的进程 id 号。

所以在网络 ipc 中,为了标识目标的通信进程,只能使用 ip 地址,但是光有 ip 地址也是不够的啊!有人想到 ip 地址 + 进程 pid 两者联合起来,好吧。。。 这种方法确实可行,但是它用起来并不是那么爽,因为每次你要和另一台电脑上的程序通信,你都得知道它的 pid,这一次它的 pid 2000,说不定一次重新启动后,就变成了 2017.


2. IP 地址 + 端口号(port)

实际上,标识目标进程的方案是使用 IP 地址 + 端口号的方式,那端口号有是什么呢?端口号是一个新概念。实际上它就是一个 unsigned short 类型(2字节)的整数,所以说,最大的端口号是 65535.

首先,端口号首先是稳定的,进程每次启动,都可以使用固定的端口号。端口号可以唯一标识当前操作系统的一个进程,或者说,一个端口号只能被一个进程使用。

如果要进行网络通信的话,就可以使用 IP 地址 + 端口号)来唯一的标识这个世界上的任何一个进程。(但是有些 IP 地址是私有地址,不能出现在公网上,这种 IP 地址就是我们常用的局域网 IP 地址,比如 192.168.XXX.XXX 这些。如果你是局域网内的计算机,你的计算机是无法被外网所访问到的)

 

3. 套接字地址

在网络编程中,把(IP 地址 + 端口号)这样的一对值称呼为套接字地址,新名词套接字又是啥?

套接字的英文原文 socket,看看 有道 的解释:

Linux网络编程基础 --- IP地址和端口号_第1张图片

所以这里的套接字,实质上应该是类似一种插槽的东西,不如就说是插座吧。那么,套接字地址就是“插座”地址了。再者,是谁的“插座”?没错,是这个进程上的插座。

在计算机中,通常使用 192.168.166.5:80 这种以 ip:port 的形式来表示套接字地址。

Linux网络编程基础 --- IP地址和端口号_第2张图片

在上图所示中的进程,就安装了 3 个插座,什么意思呢?就是说这个进程它使用了 3 个端口号,我们使用这三个套接字地址中的任何一个都可以联系这个进程。

所以,有了套接字地址了,和进程通信也不是什么难事了。不过,值得一提的是,这些插座,是本来就有的,还是需要自己去安装的?这个问题我们下一次再讨论。

 

4. 套接字地址在程序中的表示

刚刚用 ip:port 的方式来表示套接字地址,实际上这只是给人类看的,容易看的明白,在程序中,显然就是结构体了。

这个结构体的样子如下:

 

struct sockaddr_in {
  sa_family_t    sin_family; /* 这个值固定写 AF_INET */
  in_port_t      sin_port;   /* 网络字节序的端口号 */
  struct in_addr sin_addr;   /* in_addr 类型的 ip 地址 */
};


第一个字段现在我先不解释,以后再说。

 

5. 总结

v 网络通信使用套接字地址唯一的标识进程

v 知道套接字地址是什么

你可能感兴趣的:(Linux网络编程基础 --- IP地址和端口号)