socket进程通信机制以及应用了解下

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luyaran/article/details/84821165

socket通常被称为套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通过套接字向网络发出请求或者应答网络请求,它既不是一个程序,也不是一种协议,它只是操作系统提供的通信层的一组抽象API。

关于它的进程通信的概念,最初是来源于单机系统,由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互相不干扰,又能协调一致的工作,操作系统为进程通信提供了相应的设施,像Unix BSD中的管道(pipe)、命名管道(named pipe)、软中断信号(signal)、Unix system V的消息(message)、共享存储区(shared memory)、信号量(semaphore)等,但是这些都仅限于用在本机进城之间的相互通信,网络间进程通信要解决的是不同主机进程间的相互通信问题(同机进程间的相互通信可看做特例),为此我们首先要解决的就是网络间进程的标识问题。

同一主机上,不同的进程可以使用唯一进程号(process ID)标识,在网络环境下,各个主机独立分配的进程号不能唯一标识该进程,像主机A赋予某进程号5,在B主机也可以存在进程号5,这样一来这个5就没什么用了,并且操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不尽相同,所以呢,网络间进程通信还需要解决多重协议的识别问题。

为了解决我们之间讨论的两个问题,TCP/IP协议引入了端口、地址、连接这三个概念,下面我们来简单看下。

首先就是端口,网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源,按照OSI七层协议的描述,传输层和网络层在功能上最大的区别在于传输层提供了进程通信的能力,从这个意义上来看的话,网络通信的最终地址就不仅仅是主机地址了,还可以包括描述进程的某种标识符,所以呢,TCP/IP协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。

端口是一种抽象的软件接口(包括一些数据结构和I/O缓冲区),应用程序(也就是进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应的进程发给传输层的数据都通过该端口输出,在TCP/IP协议的实现中,操作端口类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的原语访问。

类似于文件描述符,每个端口都拥有一个端口号,都是整数型标识符,用于区别不同的端口,由于TCP/IP传输层的TCP协议和UDP协议是完全独立的两个软件模块,因此各自的端口号也是相对的独立,像TCP有一个255的端口号,UDP也有一个255的端口号,二者并不冲突,它们的端口地址都是16比特,有0---65535个端口号。

我们对于这些端口的使用有着如下规定:

  1. 端口号小于256的定义为常用端口,服务器一般都是通过常用端口来识别,任何由TCP/IP实现的服务都是用1---1023之间的端口号,这是由IANA管理的
  2. 客户端只需要保证该端口号在本机上是唯一的就好,因为客户端的端口号存在时间很短,所以又可以称为临时端口号
  3. 大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号,大于5000的端口号是给其他的服务器预留的
  4. 常见的端口号有FTP的21号端口,HTTP服务的80端口,SMTP的25号端口等,要记得避免占用问题

再来就是地址这个概念了,网络通信中通信的两个进程分别处在不同的主机上,需遵循如下原则:

  1. 某台主机可与多个网络相连,必须制定一个特定的网络地址
  2. 网络上,每台主机应有其唯一的地址
  3. 每台主机上的每个进程应该有在该主机上的唯一标识符 

通常呢,主机地址是由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示,TCP和UDP均使用16位端口号标识用户进程。

接下来就是连接的概念了,我们把两个进程之间的通信链路称为连接,这个连接表现为一些缓冲区和一组协议机制。

之前有了解过socket的伙计应该知道,socket就是一种通信机制,类似于银行、电信这些公司的客服,我们打电话的时候,对方会分配一个客服来接听,这个客服的部门就相当于socket的服务器端,我们就相当于客户端,在我们和客服代表通话结束前,有人想给我们或者正在跟我们通话的客服打电话,是不可能的,至于为什么,相信不需要赘述了。

还有就是关于socket的内部实现机制,可能有的人很好奇,因为本人并不是做底层开发的,所以呢,只是会调用socket的一系列函数,有兴趣的童鞋可以去关注下socket的内部实现机制,还有就是PHP中socket的函数咱也不废话了,这个网上遍地都是,咱们这里只是简单了解下概念和原理就好。

另外呢,我们还可以使用PHP客户端的socket函数像fsockopen等来实现post提交等。

过多的咱也不赘述了啊。

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

猜你喜欢

转载自blog.csdn.net/luyaran/article/details/84821165