socket接口?socket在哪里
大家好,今天小编来为大家解答socket接口这个问题,socket在哪里很多人还不知道,现在让我们一起来看看吧!
简述Socket(套接字)通信
所谓Socket就是套接字,套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
一、Socket(套接字)简介:
Socket(套接字)是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将Socket(套接字)看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。Socket(套接字)存在于通信域中,通信域是为了处理一般的线程通过Socket(套接字)通信而引进的一种抽象概念。Socket(套接字)通常和同一个域中的Socket(套接字)交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket(套接字)都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket(套接字)中,该 Socket(套接字)通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket(套接字)中,使对方能够接收到这段信息。 Socket(套接字)是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。
二、Socket(套接字)表达方式:
Socket(套接字)=(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。
三、Socket(套接字)的主要类型:
1.流套接字(SOCK_STREAM)
流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。
2.数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
3.原始套接字(SOCK_RAW)
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接。
要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket,另一个运行于服务器端,我们称之为 Server Socket。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
服务器监听
客户端请求
连接确认
1.服务器监听
所谓服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
2.客户端请求
所调客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求。
3.连接确认
所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求。
根据套接字的不同类型,可以将套接字调用分为面向连接服务和无连接服务。
面向连接服务的主要特点如下:
(1)数据传输过程必须经过建立连接、维护连接和释放连接3个阶段;
(2)在传输过程中,各分组不需要携带目的主机的地址;
(3)可靠性好,但由于协议复杂,通信效率不高。
面向无连接服务的主要特点如下:
(1)不需要连接的各个阶段;
(2)每个分组都携带完整的目的主机地址,在系统中独立传送;
(3)由于没有顺序控制,所以接收方的分组可能出现乱序、重复和丢失现象;
(4)通信效率高,但可靠性不能确保。
到底什么是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将要发送的数据交给协议栈开始的,协议栈收到数据之后执行发送操作。
协议栈不会关心应用程序传输过来的是什么数据,因为这些数据最终都会转换为二进制序列,协议栈在收到数据之后并不会马上把数据发送出去,而是会将数据放在发送缓冲区,再等待应用程序发送下一条数据。
为什么收到数据包不会直接发送出去,而是放在缓冲区中呢?
因为只要一旦收到数据就会发送,就有可能发送大量的小数据包,导致网络效率下降(所以协议栈需要将数据积攒到一定数量才能将其发送出去)。
至于协议栈会向缓冲区放多少数据,这个不同版本和种类的操作系统有不同的说法。
什么是Socket
socket的原意是“插座”,在计算机通信领域,socket被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。
通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而socket就是用来连接到因特网的工具。
关于socket接口和socket在哪里的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。