跳到主要内容

套接字

1. 基本概念

  • 套接字是网络编程的基本抽象。它是一个抽象的接口,用于在两台计算机之间进行通信。套接字是一种端点,允许您与远程主机通信,并且可以在本地计算机上监听和接收请求。

  • 每个套接字都有一个地址,例如IP地址和端口号,以及一个协议,例如TCP或UDP。当您的应用程序需要与远程主机通信时,它可以通过创建套接字来实现该目的。

  • 通常,可以在服务器端创建套接字并监听特定的端口,以接收客户端的请求。然后客户端程序可以通过创建套接字并连接到服务器的特定地址和端口来发送请求。

  • 套接字是一种通用的、可移植的接口,因此可以使用它在任何支持网络编程的平台上实现网络通信。

2. 套接字的理解

  • 网络编程我们也称之为:套接字编程或者socket编程

  • 套接字来源于英文单词:socket

  • socket英文原义是“孔”或“插座”。作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)。

  • socket非常类似于电话插座。以一个电话网为例:电话的通话双方相当于相互通信的2个程序,电话号码就是ip地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤销连接。

3. 套接字的分类

为了满足不同程序对通信质量和性能的要求,一般的网络系统都提供了以下3种不同类型的套接字,以供用户在设计程序时根据不同需要来选择:

  • 流式套接字(SOCK_STREAM):提供了一种可靠的、面向连接的双向数据传输服务。实现了数据无差错,无重复的发送,内设流量控制,被传输的数据被看做无记录边界的字节流。在TCP/IP协议簇中,使用TCP实现字节流的传输,当用户要发送大批量数据,或对数据传输的可靠性有较高要求时使用流式套接字。
  • 数据报套接字(SOCK_DGRAM):提供了一种无连接、不可靠的双向数据传输服务。数据以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端数据按发送顺序接收。在TCP/IP协议簇中,使用UDP实现数据报套接字。
  • 原始套接字(SOCK_RAW):该套接字允许对较低层协议(如IP或ICMP)进行直接访问。一般用于对TCP/IP核心协议的网络编程。