到底什么是Socket?

作者&投稿:壤怀 (若有异议请与网页底部的电邮联系)
~ 本系列文章前面那些主要讲解的是计算机网络的理论基础,但对于即时通讯IM这方面的应用层开发者来说,跟计算机网络打道的其实是各种API接口。

本篇文章就来聊一下网络应用程序员最熟悉的Socket这个东西,抛开生涩的计算机网络理论,从应用层的角度来理解到底什么是Socket。

对于 Socket 的认识,本文将从以下几个方面着手介绍:

1) Socket 是什么;

2) Socket 是如何创建的;

3) Socket 是如何连接的;

4) Socket 是如何收发数据的;

5) Socket 是如何断开连接的;

6) Socket 套接字的删除等。

特别说明: 本文中提到的“Socket”、“网络套接字”、“套接字”,如无特殊指明,指的都是同一个东西哦。

Socket 是什么

一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。

我们大家知道,协议栈其实是位于操作系统中的一些协议的堆叠,这些协议包括 TCP、UDP、ARP、ICMP、IP等。即时通讯开发可以找蔚可云开发。

通常某个协议的设计都是为了解决特定问题的,比如:

1) TCP 的设计就负责安全可靠的传输数据;

2) UDP 设计就是报文小,传输效率高;

3) ARP 的设计是能够通过 IP 地址查询物理(Mac)地址;

4) ICMP 的设计目的是返回错误报文给主机;

5) IP 设计的目的是为了实现大规模主机的互联互通。

应用程序比如浏览器、电子邮件、文件传输服务器等产生的数据,会通过传输层协议进行传输。而应用程序是不会和传输层直接建立联系的,而是有一个能够连接应用层和传输层之间的套件,这个套件就是 Socket 。

应用程序的下面: 就是操作系统内部,操作系统内部包括协议栈,协议栈是一系列协议的堆叠。

操作系统下面: 就是网卡驱动程序,网卡驱动程序负责控制网卡硬件,驱动程序驱动网卡硬件完成收发工作。

在操作系统内部有一块用于存放控制信息的存储空间,这块存储空间记录了用于控制通信的控制信息。其实这些控制信息就是 Socket 的实体,或者说存放控制信息的内存空间就是Socket的实体。

这里大家有可能不太清楚所以然,所以我用了一下 netstat 命令来给大伙看一下Socket是啥玩意。

Socket 是如何创建的

通过上节的讲解,现在你可能对 Socket 有了一个基本的认识,先喝口水,休息一下,让我们继续探究 Socket。

现在我有个问题, Socket 是如何创建的呢?

Socket 是和应用程序一起创建的。

应用程序中有一个 socket 组件,在应用程序启动时,会调用 socket 申请创建Socket,协议栈会根据应用程序的申请创建Socket:首先分配一个Socket所需的内存空间,这一步相当于是为控制信息准备一个容器,但只有容器并没有实际作用,所以你还需要向容器中放入控制信息;如果你不申请创建Socket所需要的内存空间,你创建的控制信息也没有地方存放,所以分配内存空间,放入控制信息缺一不可。至此Socket的创建就已经完成了。

Socket创建完成后,会返回一个Socket描述符给应用程序,这个描述符相当于是区分不同Socket的号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。

Socket 是如何连接的

Socket创建完成后,最终还是为数据收发服务的。但是,在数据收发之前,还需要进行一步“连接”(术语就是 connect),建立连接有一整套过程。

实际上这个“连接”是应用程序通过 TCP/IP 协议标准从一个主机通过网络介质传输到另一个主机的过程。

Socket刚刚创建完成后,还没有数据,也不知道通信对象。

在这种状态下: 即使你让客户端应用程序委托协议栈发送数据,它也不知道发送到哪里。所以浏览器需要根据网址来查询服务器的 IP 地址,查询到目标主机后,再把目标主机的 IP 告诉协议栈。至此,客户端这边就准备好了。

在服务器上: 与客户端一样也需要创建Socket,但是同样的它也不知道通信对象是谁,所以我们需要让客户端向服务器告知客户端的必要信息: IP 地址和端口号 。

现在通信双方建立连接的必要信息已经具备,可以开始“连接”过程了。

首先: 客户端应用程序需要调用 Socket 库中的connect方法,提供 socket 描述符和服务器 IP 地址、端口号。

以下是connect的伪码调用:

1connect(<描述符>、<服务器IP地址和端口号>)

这些信息会传递给协议栈中的 TCP 模块,TCP 模块会对请求报文进行封装,再传递给 IP 模块,进行 IP 报文头的封装,然后传递给物理层,进行帧头封装。

之后通过网络介质传递给服务器,服务器上会对帧头、IP 模块、TCP 模块的报文头进行解析,从而找到对应的Socket。

Socket收到请求后,会写入相应的信息,并且把状态改为正在连接。

请求过程完成后: 服务器的 TCP 模块会返回响应,这个过程和客户端是一样的

Socket 是如何收发数据的

当控制流程上节中的连接过程回到应用程序之后,接下来就会直接进入数据收发阶段。

数据收发操作是从应用程序调用 write 将要发送的数据交给协议栈开始的,协议栈收到数据之后执行发送操作。

协议栈不会关心应用程序传输过来的是什么数据,因为这些数据最终都会转换为二进制序列,协议栈在收到数据之后并不会马上把数据发送出去,而是会将数据放在发送缓冲区,再等待应用程序发送下一条数据。

为什么收到数据包不会直接发送出去,而是放在缓冲区中呢?

因为只要一旦收到数据就会发送,就有可能发送大量的小数据包,导致网络效率下降(所以协议栈需要将数据积攒到一定数量才能将其发送出去)。

至于协议栈会向缓冲区放多少数据,这个不同版本和种类的操作系统有不同的说法。


android socket接收事件为什么没有监听事件,要用死循环呢
Socket ,首先Socket并不是Google事先设计好的,Socke中文名称作套接字,你百度搜套接字编程,可以认识到Socket开发是专门的编程技术,而Socket本身又是网络通信协议的基础设施,Socket的诞生历史,高于Android,甚至高于Java,Socekt是计算机提供进程通信能力的编程接口,确切的说,它甚至可以提供不同主机间不...

sock的意思是?
n.短袜, 鞋内衬底, 轻软鞋, 一击, 零食 vt.给...穿袜, 重击, 猛投, 请...吃零食 vi.爱吃零食 adj.非常成功的 adv.正着地, 不偏不倚地 n.(名词)pl. socks or sox [s¼ks] A short stocking reaching a point between the ankle and the knee.【复数】 socks 或 sox [...

WebSocket和socket的区别
 可以的Socke在 OSI 模型会话层(第5层),是为了方便大家直接使用更底层协议(一般是 TCP 或 UDP )而存在的一个抽象层。最早的一套 Socket API 是 Berkel 语言实现。它是 Socket 的事实标准,POSIX sockets 是基于它构建的,多种编程语言都遵循这套 API,在 JAVA、Python 中都能看到这套 ...

十一、信令服务器原理
多个 socke.io可以串行通信。

C++实现http的post和get
也就是说,GET和POST在本质上没什么区别。http是应用层,TCP\/IP是传输层。怎么理解呢 也就是说http是在TCP\/IP上的一个协议 比如说:http定义有消息头,头里格式是xxx:xxx,发送的时候通过socke发送,服务端接收的时候还是按xxx:xxx来解析,这个就是协议 都是通过TCP\/IP进行传输 ...

下学期大四了,现在忙着学嵌入式,看了几本书了,都是讲linux 和 嵌入式理...
d,深入学习网络,包括socke程序开发,tcp\/ip协议,以及以太网设备驱动开发。e,学习GSM网络,3g网络,wifi等流行的网络技术,方便攻入思科,诺基亚等通行巨头 f,学习视频音频加解码,用于开发高清解码芯片的驱动(这个部分需要有傅立叶变换的数学功底,比如快速dct变换,小波变换,可能还需要dsp开发的知识...

钢丝绳接头建筑机械?
(3)欧洲标准EN13411-6:2004《Asymme工—ricwedgesocke工(非对称楔形连接套筒)》也规定了两种类似的连接方法,见图3。图3的连接方法与美标类似,在图3a中,用软绳将钢丝绳的自由端及受力端连接在一起,仅起到一定的连接作用,并未使用钢丝绳夹固定钢丝绳的自由端和受力端。3国内楔形接头的使用现状...

什么处理器最好
AMD AM2 Athlon 64 30¥590说明:适用类型:台式CPU CPU内核:Orleans 主频(MHz):1800MHz 插槽类型:Socket A... 详细Intel 奔腾D 820 2.8G¥660说明:适用类型:台式CPU CPU内核:Smithfield 主频(MHz):2800MHz 插槽类型:Socke... 详细Intel Core 2 Duo E63¥1270说明:适用类型:台式CPU CPU内核...

桐乡市17245386254: socket() - 搜狗百科
狂邵艾略: Socket接口是TCP/IP网络的API(Application Programming Interface,应用程序编程接口),Socket接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP网络上的应用程序.请参阅以下资料:socket非常类似于电话插座.以一个国家...

桐乡市17245386254: socket是什么意思? -
狂邵艾略: socket(也叫套接字)最初是在Unix系统上开发的网络通信的接口.后来微软等公司将它移植到了windows下,当然原来unix系统下的还是好用的.对于socket可以这样理解:它就是一个函数库,里面包括大量的函数和相应的数据结构,已经实现好了.它支持网络通信.程序开发人员可以通过阅读相关的函数文档,了解函数的使用方法,进行网络的编程.两种形式的socket:流式套接字,对应与TCP协议.数据报套接字,对应与UDP协议.

桐乡市17245386254: Socket到底是干什么的 -
狂邵艾略: Socket是在应用层和传输层之间的一个抽象层,socket本质是编程接口(API),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.TCP/IP只是一个协议栈,必须要具体实现,同时还要提供对外的操作接口(API),这就是Socket接口.通过Socket,我们才能使用TCP/IP协议.Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换.

桐乡市17245386254: socket是什么 -
狂邵艾略: socket的英文原义是“孔”或“插座”.作为4BDS UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务.Socket正如其英文原意那样,象一个多孔插座.一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目. 客户软件将插头插到不同编号的插座,就可以得到不同的服务.

桐乡市17245386254: 什么是socket接口?> -
狂邵艾略: Socket就是接口的意思. 通常是指插座型的CPU接口. 以前在pentium2的时代还有一种slot插槽型的CPU接口.那样的接口就是像AGP接口差不多的一种接口了.现在已淘汰.

桐乡市17245386254: socket是什么 -
狂邵艾略: SOCKET用于在两个基于TCP/IP协议的应用程序之间相互通信.最早出现在UNIX系统中,是UNIX系统主要的信息传递方式.在WINDOWS系统中,SOCKET称为WINSOCK. 两个基本概念:客户方和服务方.当两个应用之间需要采用SOCKET...

桐乡市17245386254: Socket到底是什么 -
狂邵艾略: 一个网络编程接口~!SOCKET 库提供了连接网络的API函数SOCKET不仅仅只是一个而是一整套函数包括SOCKET库加载函数 连接信息设置,连接函数发送接收函数,监听函数等等可以使用SOCKET库提供的函数实现TCP,UDP或其他建立在TCP/IP协议基础上的连接SOCKET视乎已经是个标准通用的模型了,在WINDOWS下编程可以使用LINUX系统下也有可以使用,而且函数名和调用参数的传递都一样.-------->个人经验理解

桐乡市17245386254: 什么是Socket -
狂邵艾略: 所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中.ServerSocket用于服务器...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网