SOCKET是调用操作系统通信服务的一种机制

有没有SOCKET,网卡都会接收数据。网卡工作在数据链路层,它只认识链路上邻近的点。它甚至不认识它隔壁的隔壁,它又怎么可能知道传输层的信息呢(起点与终点,是传输层的信息)?。。。传输层的信息,只能由传输层来处理!

IP层存在同样的问题。因为它也“活(动)”在网络层。它也不处理,同样地它也不能处理本来位于第四层即传输层的与传输相关的信息。。当然,如果一个网络节点硬要处理它,当然也是可以的。因为高层的信息是被低层的信息所包裹着的。只是恐怕一般的机构没有这样的实力来做这个事情。因为那么多人的信息,凭一己之力,怎么可能或者什么时候才能读得完?!

由此可见,SOCKET只是整个网络系统的附属品。它并没有任何主“动”的能力。主“动”的能力全部把握在第三层以下。第四层及其以上各层,都不具有“动”的能力。。。。一个数据包,如果被传到了第四层,其实也就失去了其的动力,停止了其在网络上的旅行。因为它已经到了。

这意味着,如果从网络上随处给某个“SOCKET”发一个数据包,不管这个SOCKET是否真实存在,即:不管在内存中是否已经建立其对应的SOCKET对象,这个包都会被如期送达(如果至少这个“半相关”存在,并且假设网络通畅的话)。也就是说,以任一SOCKET地址为目标的数据包的到达与否,与在主机中是否建立相关的SOCKET对象是没有关系的。

当然没有关系!

一个SOCKET对象只是活在本地内存中的对象,而真正的数据包却是来自于网络层I/O操作。网络I/O工作在传输层以下,这就决定了网络I/O工作在SOCKET对象所在层即传输层以前,这就决定了与SOCKET工作有关的任何系统级或用户级操作,都是发生在包到达以后(在接收的时候)。

真正的发送工作更与SOCKET对象基本上没有任何关系。因为操作系统只要随便往一个IP包中填入一个地址与端口都可以把包给发出去(也许不填也可以。。。因为源地址显然地并不是路由所需要的必要信息)。

。。。

意思是,SOCKET并不是动者。通信能力的提供者是操作系统。操作系统提供所有的协议服务。这种服务,通过SOCKET暴露给应用程序的开发者。首先,在机器级别是不存在对象这个概念的。机器只知道两样事情:数据与指令。在运行时,SOCKET的代码是不存在的。存在的是SOCKET的代码的编译后指令。方法或函数在二进制世界其实只是指令集的界符。函数的概念其实只是为了区分运行时的指令集。机器需要这样的信息对运行时指令集进行划分。否则机器就只能执行顺序程序了(在原语言不提供其它的代码边界或标识的情况下)。源码的价值也在于其的二进制代表。否则其就不可能具有任何意义。这是可以使用SOCKET API来讨论网络通信的原因。因为它拥有真正的二进制代表。当我使用API这个词的时候,它的背后其实是它所代表的机器级指令。。。但是无论如何,SOCKET的API并不是通信的执行者。通信的执行者是操作系统的协议层。SOCKET API只是应用程序与操作系统的协议层之间的一座桥梁。它可以被看作应用程序与操作系统的通信服务之间的协议。即操作系统的通信服务协议。应用程序通过这种协议调用操作系统的通信服务。这显然意味着SOCKET并不是真正的通信者。真正的通信者是OS。另一个证据是, SOCKET并不执行任何TCP协议操作。所有的协议操作都是操作系统完成的。而应用程序则使用SOCKET调用这些服务。另一种说法它是一种机制,就是这个意思。因为机制意味着手段,渠道,中间者。是一样的意思。操作系统通过这种机制向外提供通信服务。

动者是操作系统(的协议层)。

因此, 说使用SOCKET进行通信是错误的。应该说使用SOCKET调用通信。因为它并不完成真正的通信。它的确通信,但是这种通信是为了与OS的真正通信服务进行通信以告诉OS为之提供服务。另一个方面,它只是个API,所做的全部只是在内存中的一些操作,这些操作如何能够完成任何真正的通信工作?真正的通信工作要求的是端口管理,分配,侦听,以及网络层即IP地址的管理,分配,安全等服务,还有按协议组装数据,路由,寻址及响应服务,和与网卡进行真正的I/O通信以将数据放至网络上传播。。。。。。所有这些工作,SOCKET一点都没有做。

因此,SOCKET,不管是“半相关”还是“全相关”,都只是内存里面的概念。这些概念存在的目的是为了构建整个调用机制。它们是为调用而存在的。它们只活在API里面。调用的目标则是系统的通信服务。 也可以认为这些是对OS服务的封装。但是如JDBC并不进行真正的数据库操作一样,必须清醒地意识到SOCKET只是个API,它也不进行任何真正的通信操作。如果它能进行,那么它就不会存在于JAVA语言中了。因为JAVA语言甚至不能提供对内存的直接存取,更何况对I/O设备(网卡)的直接存取呢?

SOCKET意思是,这么多的程序都要通信。你要插一脚,那好,就给你一个SOCKET。SOCKET在这里的意思是,插孔。槽。当用它来接收信息的时候,它用来区分具体的收信程序;用来发送信息的时候,它就只是个句柄。

如果绑定了地址,那么系统应该会尽可能在进行真正的通信工作时使用这个地址。比如,如果为服务端SOCKET绑定了地址,那么系统将尝试在这个地址上而不是别的地址上进行侦听(对操作系统来说,它将形成一个资源占用------也就是说,一旦绑定成功,其它的程序将不能绑定在相同的地址(网络地址---人为的,虚有的,自称的地址)上)。

原文地址:https://www.cnblogs.com/LewisAAA/p/9248312.html

时间: 2024-10-30 04:54:29

SOCKET是调用操作系统通信服务的一种机制的相关文章

socket编程,简单多线程服务端测试程序

socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.accept.recv.send等函数的介绍,今天写了一个CUI界面的测试程序(依赖MFC)作为补充.程序功能简介如下: 1:一个线程做监听用. 2:监听线程收到客户端连接后,创建新线程接收客户端数据.所有对客户端线程将加入容器,以便管理. 3:服务端打印所有客户端发来的信息. 4:服务端CUI界面输入数字

Java中socket接口调用

最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立连接 当需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序这对其发出连接请求.这一点同电话系统类似--必须有一方拨打电话,而另一方必须等候电话连通. 建立连接的过程为: (1)先在服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求. (2)当客户端需

PHP源码来操作memcached服务

如何使用PHP源码来操作memcached服务 如果管理员不让我们去加载 memcache.dll 文件,我们可以直接通过源码操作 看高手的源代码也很有意思! 特点: 1.不需要开启memcache扩展 2.使用fsockopen()套接字连接memcached 3.同样执行执行CRUD 引用别人写的一个类: memcached-client.php <?php // // +------------------------------------------------------------

C# 玩转计算机系列(二)-操作IIS服务

之前由于工作需要自己做一个一键部署的小工具,实现三个模块的功能:TFS操作创建映射并获取最新源代码:SQL Server数据库注册表配置数据库连接:IIS站点部署,生成可访问的IIS站点.由于是基于自己的工作环境下的开发,所以在TFS和SQL Server配置工具化实现,有一些点是默认按照公司的环境配置参数默认的,虽然不是广泛适用每一种情况的环境部署,但是在学习这三个模块的开发过程中,还是有很多东西是可以值得分享的. 今天先分享一下,如何通过工具化实现IIS站点部署和配置,为了可复用性,IIS操

分享一个Android和java调用RESTful Web服务的利器Resting

分享一个Android和java调用RESTful Web服务的利器Resting 当我们调用Web服务,往往是最终目标是取HTTP响应,将其转化为将在应用中呈现的值对象.Resting可以用来实现这一功能.Resting,在Java的一个轻量级的REST框架,可用于调用一个RESTful Web服务,并转换成响应来自客户端应用程序定制的Java对象.由于它的简单,resting是适合Android等手持设备. resting目标?暴露简单的get(),post(),put()和delete()

VC使用GSOAP(2.8.14)调用C#WCF服务

我在网上找了好多的这方面的文章,真正能够实现出来的几乎没有. 只有我在1年前下载并调试成功的案例.那么GSOAP是比较复杂的实现过程,需要学习的理论知识也比较多,需要深入了解的可以到官网上去下载. 那么调试时借鉴别人的文章是非常有用的,但是一定要看清对方调试工具的版本号. 1.1.1.1         环境 l  VS2012 l  GSOAP 2.8.14 (请使用指定版本) l   WIN7 IIS 1.1.1.2         下载GSOAP程序包  GSOP2.8 1.1.1.3  

使用Kazoo操作ZooKeeper服务治理

单机服务的可靠性及可扩展性有限,某台服务宕机可能会影响整个系统的正常使用:分布式服务能够有效地解决这一问题,但同时分布式服务也会带来一些新的问题,如:服务发现(新增或者删除了服务如何确保能让客户端知道),容灾(某些服务出现故障如何让客户端只访问正常的服务):ZooKeeper的提出主要是为了解决分布式服务的治理问题,它在分布式环境中协调和管理服务. Zookeeper协调管理服务的过程如下图: 服务端:每台服务器都要向注册中心Zookeeper进行注册登记,并且保持与Zookeeper的连接,如

使用PowerShell操作Windows服务的命令小结

PowerShell在处理Windows服务方面,提供了强大的功能,很多方便.强大的cmdlet等着你去发掘. Get-Service,别名gsv,获取服务对象. 举例:gsv eventlog 或 $evtlog = gsv eventlog Start-Service,启动服务. Stop-Service,停止服务. Restart-Service,重启服务. Suspend-Service,挂起/暂停服务. Resume-Service,继续服务. Set-Service,设置服务的属性.

通过memcache动态运行库操作memcached服务,进行CURD

具体学习参考php参考手册: 操作memcached的几种方式: bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] ) 如果报 expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在mem中) exprie 直接给的是秒数,则最大 30*3600*24 如果你希望保持时间超过30  time()+天数*3600*24 即可 mem1.php <?php //创建一个m