socket通信和TCP/IP协议,及操作系统之间的关系

今天贾哥跟老师讨论了在项目里拿消息队列替换socket通信的问题,
搜集一下资料,整理了一下,感觉对socket的概念更清楚了一些。

socket是一个编程接口,那么这个编程接口是怎么实现的啊?
是谁来实现的?是操作系统吗?

我理解的socket就是 操作系统 提供给用户的一个接口,用户(程序)调用这个接口实现通信。

就像里面的函数:listen(),accept(),recv()…等函数只能调用,但是具体它是怎么实现的这些监听,接收,连接的功能是操作系统提供的。我们只需知道怎么调用他,实现这些功能需要什么参数。剩下的东西都交给OS去做就好了。操作系统也 不允许我们修改 这些接口的。

那这个socket接口屏蔽了哪些东西,又给我们提供哪些东西呢?
接下来先看一下socket在整个协议栈的位置。

在这里插入图片描述
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,只调用socket接口来使用下层TCP/IP提供的服务。


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

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

真正的发送工作 和 SOCKET对象基本上没有任何关系。
因为操作系统只要随便往一个IP包中填入一个地址与端口都可以把包给发出去

意思是,SOCKET并不是动者。

通信能力的提供者是 操作系统。
操作系统提供所有的 协议服务。

这种服务,通过SOCKET暴露给应用程序的开发者

SOCKET的API并不是通信的执行者。通信的执行者是操作系统的协议层。SOCKET API只是应用程序与操作系统的协议层之间的一座桥梁。它可以被看作应用程序与操作系统的通信服务之间的协议。即操作系统的通信服务协议。应用程序通过这种协议调用操作系统的通信服务。这显然意味着SOCKET并不是真正的通信者。真正的通信者是OS。

另一个证据是, SOCKET并不执行任何TCP协议操作所有的协议操作都是操作系统完成的。而应用程序则使用SOCKET调用这些服务。另一种说法它是一种机制,就是这个意思。因为机制意味着手段,渠道,中间者。是一样的意思。操作系统通过这种机制向外提供通信服务。

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

因此,SOCKET,只是内存里面的概念。这些概念存在的目的是为了构建整个调用机制。它们是为调用而存在的。它们只活在API里面调用的目标则是系统的通信服务。 也可以认为这些是对OS服务的封装。但是如JDBC并不进行真正的数据库操作一样,必须清醒地意识到SOCKET只是个API,它也不进行任何真正的通信操作

如果它能进行,那么它就不会存在于JAVA语言中了。因为JAVA语言甚至不能提供对内存的直接存取更何况对I/O设备(网卡)的直接存取呢


Linux和windows下的socket都源自伯克利套接字,所以其在整体上是大致相同的,只不过在一些细节上存在一定的区别

今天贾哥跟老师讨论了在项目里拿消息队列替换socket通信的问题,
搜集一下资料,整理了一下,感觉对socket的概念更清楚了一些。

socket是一个编程接口,那么这个编程接口是怎么实现的啊?
是谁来实现的?是操作系统吗?

我理解的socket就是 操作系统 提供给用户的一个接口,用户(程序)调用这个接口实现通信。

就像里面的函数:listen(),accept(),recv()…等函数只能调用,但是具体它是怎么实现的这些监听,接收,连接的功能是操作系统提供的。我们只需知道怎么调用他,实现这些功能需要什么参数。剩下的东西都交给OS去做就好了。操作系统也 不允许我们修改 这些接口的。

那这个socket接口屏蔽了哪些东西,又给我们提供哪些东西呢?
接下来先看一下socket在整个协议栈的位置。

在这里插入图片描述
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,只调用socket接口来使用下层TCP/IP提供的服务。


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

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

真正的发送工作 和 SOCKET对象基本上没有任何关系。
因为操作系统只要随便往一个IP包中填入一个地址与端口都可以把包给发出去

意思是,SOCKET并不是动者。

通信能力的提供者是 操作系统。
操作系统提供所有的 协议服务。

这种服务,通过SOCKET暴露给应用程序的开发者

SOCKET的API并不是通信的执行者。通信的执行者是操作系统的协议层。SOCKET API只是应用程序与操作系统的协议层之间的一座桥梁。它可以被看作应用程序与操作系统的通信服务之间的协议。即操作系统的通信服务协议。应用程序通过这种协议调用操作系统的通信服务。这显然意味着SOCKET并不是真正的通信者。真正的通信者是OS。

另一个证据是, SOCKET并不执行任何TCP协议操作所有的协议操作都是操作系统完成的。而应用程序则使用SOCKET调用这些服务。另一种说法它是一种机制,就是这个意思。因为机制意味着手段,渠道,中间者。是一样的意思。操作系统通过这种机制向外提供通信服务。

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

因此,SOCKET,只是内存里面的概念。这些概念存在的目的是为了构建整个调用机制。它们是为调用而存在的。它们只活在API里面调用的目标则是系统的通信服务。 也可以认为这些是对OS服务的封装。但是如JDBC并不进行真正的数据库操作一样,必须清醒地意识到SOCKET只是个API,它也不进行任何真正的通信操作

如果它能进行,那么它就不会存在于JAVA语言中了。因为JAVA语言甚至不能提供对内存的直接存取更何况对I/O设备(网卡)的直接存取呢


Linux和windows下的socket都源自伯克利套接字,所以其在整体上是大致相同的,只不过在一些细节上存在一定的区别

Supongo que te gusta

Origin blog.csdn.net/qq_29025955/article/details/118573822
Recomendado
Clasificación