Socket实质上就是一个套接字,是网络中不同主机上的应用进程之间进行双向通信的端点抽象。
在网络通信领域,一个套接字代表了一个进程通信的一端,通过利用网络协议交换数据,为应用层进程提供了通过网络协议进行通信的接口。
一、Socket(套接字)概述
Socket是通信的基石,它支持TCP/IP协议的通信操作。可以看作是不同主机间进程进行双向通信的端点,存在于通信域中。这个域是为了处理通过Socket进行的通信而引入的抽象概念。Socket通常与同一域中的其他Socket交换数据,各种进程使用这个域通过Internet协议簇进行通信。
从逻辑上讲,Socket是网络环境中进程间通信的API,它可被命名和寻址,每个使用的Socket都有一个关联的进程。信息被写入一个主机的Socket中,然后通过传输介质(如网络接口卡)发送到另一主机的Socket中,对方主机能够接收到这段信息。
二、Socket(套接字)的表达方式
例如,当IP地址为210.37.145.1且端口号为23时,套接字表示为(210.37.145.1:23)。
三、Socket(套接字)的主要类型
1. 流套接字(SOCK_STREAM)
流套接字提供可靠的数据传输服务,使用TCP协议。它能保证数据无差错、无重复地按顺序接收。其可靠性源于TCP协议的使用。
2. 数据报套接字(SOCK_DGRAM)
数据报套接字提供无连接服务,不能保证数据传输的可靠性。数据可能在传输过程中丢失或重复,且无法保证顺序接收。它使用UDP协议进行数据传输,对于可能出现的数据丢失情况,需在程序中做相应处理。
3. 原始套接字(SOCK_RAW)
原始套接字与标准套接字(如流套接字和数据报套接字)的区别在于,它可以读写未经IP层处理的IP数据包。相比之下,流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。要访问其他协议发送的数据必须使用原始套接。
在互联网通信中,至少需要一对套接字,一个位于客户端,称为Client Socket,另一个位于服务器端,称为Server Socket。
连接过程
套接字之间的连接过程分为三步:服务器、客户端请求和连接确认。
1. 服务器:服务器端套接字处于等待连接的状态,实时监控网络状态。
2. 客户端请求:客户端套接字提出连接请求,指出服务器端套接字的地址和端口号。
3. 连接确认:服务器端套接字响应客户端的请求,建立一个新的线程,并将服务器端套接字的描述发送给客户端。一旦客户端确认此描述,连接即建立。
根据套接字的类型,服务可以分面向连接服务和无连接服务。
面向连接服务的特点
(1) 数据传输需经过建立连接、维护连接和释放连接三个阶段;
(2) 传输过程中各分组不需携带目的主机的地址;
(3) 可靠性较好,但因协议复杂,通信效率稍低。
面向无连接服务的特点
(1) 不需要建立连接的各个阶段;
(2) 每个分组都携带完整的目的主机地址,独立传送;
(3) 由于没有顺序控制,可能出现分组乱序、重复和丢失现象;