Socket 套接字
套接字到底是什么?
网络上有很多相关的文章,但一直还是不很明白,今天决定理解一下这玩意,以下主要为个人观点,部分引用百科,不一定对,如有建议,请观者提出解惑,感谢。
socket 套接字,就是应用层与传输层之间的一个抽象接口。它不是协议,我理解为一种技术,一种开放给程序员的用来建立客户端与服务端的接口。
很多人形容为插座。
分析中文:套接字
tcp协议利用ip + 端口号,作为连接的端点,这种端点叫做套接字(插口)。
套接字用(ip地址:端口号)表示,Socket=Ip address+ TCP/UDP + port
它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
端点这个描述很重要,那么就是说,代表某个地址,或者说某个点,就像大家说的,是一个具体的地址,或者说叫具体的电话号码,只是这个电话号码中,除了本身的数字还包涵其他一些涵义,比如010-89898989之类,前面是区号,后面是这个区中的某个地方联系
的号码。获取还会有国家区分,打个比方中国-北京-朝阳区-居委会。
那么接着看,套接字有几种分类。
流式套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)、原始套接字(SOCK_RAW)。
它们针对的layer不同,流式针对tcp 可靠的。数据报针对udp 是不可靠的。原始针对网络层ip。
原始套接字与标准套接字(标准套接字指的是前面介绍的流式套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流式套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。
那么也就是说套接字也分种类,那么我们把它们的分类比作实时通话和留言吧。只是和现实不同的是,如果是留言的话那么就只是留言,实时通话就只是实时的。
下面是百科中的解释:
Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。此后,应用程序送给Socket的数据,由Socket交给网络驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。
打个比方:我们拿起电话(socket 指这部电话或者说是电话号码),对话筒说话(数据),数据通过电话线模块(网络驱动)发送出去(前提是指定了另一头的socket端点),发送到另一台电话后,反过来进行解析,最终另外一头的人听到这段话(接收数据)。
Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。
上面这段的解析跟再上面的差不多,这样的话,我们把端点这个概念更具象化一点,hostA 是这部电话(主机),电话中有解析模块或者接收模块(网络驱动),要不我们听到的可能就是电流声了也说不一定,程序A/B 是我们人,具体来听(使用或者说需要这些数据的)。那么socket是啥,是听筒么?或者说也是一部电话,我觉得都行,因为之前socket 就是在应用层与传输层中间的抽象接口,我们通过它可以获取我们想要的数据。
总之,通过socket套接字,可以拿到我们所需的数据,可以传输这些数据。
感觉还是有点小蒙~ 下面是另一个博主的文章,大家可以参考
https://blog.csdn.net/weixin_39258979/article/details/80835555
这个是百科地址,贴不贴大家都能搜到
https://baike.baidu.com/item/socket/281150?fr=aladdin