Socket 编程:基础概念辨析

参考

项目描述
刘—手python–socket模块
Python 官方文档https://docs.python.org/zh-cn/3/
搜索引擎GoogleBing

Socket API

BSD UNIX 操作系统

BSD(Berkeley Software Distribution) 是一个基于 UNIX 操作系统的分支,最早由 加州大学伯克利分校 开发并发布。BSD UNIX 的发展 始于 20 世纪 70 年代末,它是对 AT&T UNIX 的改进和扩展。

BSD UNIX 的目标是提供一个 高度可靠、可扩展和自由开放的操作系统,以 满足学术和研究机构的需求BSD UNIX 的发展着重于对网络和分布式系统的支持,以及在可移植性、稳定性和安全性方面的改进。

BSD UNIX 在操作系统领域做出了许多重要的贡献,包括以下几个方面:

  1. 网络协议栈
    BSD UNIX 引入了 TCP/IP 协议栈作为其 默认 网络协议。并且,BSD UNIX 还对 TCP/IP 协议进行了许多 改进和优化BSD UNIX 的网络协议实现在当时是非常先进的,这为互联网的后续发展提供了借鉴。

  2. 套接字编程接口
    BSD UNIX 引入了 套接字(Socket)编程接口,它提供了一种 抽象的方式 来进行网络通信。套接字编程接口后来成为了 网络编程的标准,被许多操作系统所采用。

  3. 文件系统改进
    BSD UNIX 对文件系统进行了改进,引入了一些新的文件系统类型,如 Fast File System(FFS),提高了文件系统的 性能和可靠性

  4. 安全性增强
    BSD UNIX 引入了一些安全性增强功能,如访问控制列表(ACL)、加密文件系统等,提高了操作系统的 安全性

BSD UNIX 在不同的版本和分支中有许多 变体包括 BSD 4.2、BSD 4.3、BSD Lite、FreeBSD、NetBSD、OpenBSD等。这些变体在 BSD UNIX 操作系统的基础上进行了不同程度的 改进和扩展,逐渐形成了独立的操作系统。

许多现代的操作系统,包括 LinuxMacOS,都受到了 BSD UNIX 的影响,并从中借鉴了许多设计和实现上的思想。

BSD UNIX 与 Socket API

socket 的概念最早起源于 BSD(Berkeley Software Distribution)UNIX 类的操作系统。BSD UNIX 是一种 UNIX 操作系统的变种,最早由加州大学伯克利分校开发并发布。

在 BSD UNIX 中,套接字(socket)是一种抽象的通信端点,用于在不同的进程之间进行网络通信。套接字提供了一种机制,使得进程可以通过网络发送和接收数据。

BSD UNIX 的套接字 API(Application Programming Interface) 定义了一组函数和数据结构,用于创建、绑定、连接、发送和接收数据等操作。这些 API 为网络编程提供了底层的支持,使得开发者可以使用套接字进行跨网络的通信。

后来,BSD UNIX 的套接字 API 成为了其他操作系统的基础,并逐渐演化成为了现代操作系统中使用的标准网络编程接口。因此,在当前常见操作系统中,仍然使用 BSD UNIX 套接字 API 或其衍生版本来进行网络编程。

Python 的 socket 模块就是基于 BSD UNIX 套接字 API 开发的,它提供了对网络编程的高级封装,使得开发者可以更方便地进行网络通信。

Socket

套接字

套接字(Socket) 是一种 抽象的通信端点,用于在计算机网络中进行 进程间的通信。套接字提供了一种编程接口,允许不同的计算机通过网络发送和接收数据。

注:

Socket 编程 中,TCP 和 UDP 协议是最常见和广泛使用的协议之一。套接字编程接口支持多种协议,包括但不限于 TCP 和 UDP 。

套接字地址

套接字 VS 套接字地址

套接字(Socket) 是一种 抽象的通信端点,用于在计算机网络中进行 进程间的通信

套接字地址(Socket Address) 是套接字在 网络中的唯一标识,用于确定通信的目标。套接字地址由 IP 地址端口号 组成,分别用于标识 主机进程

套接字的表示方法

在 Python 网络编程中,套接字地址通常使用元组(Tuple)来进行套接字地址的存取。

举个栗子

('127.0.0.1', 80) # 目标套接字位于本机的 80 号端口
('8.8.8.8', 53) # 目标套接字位于 IP 地址为 8.8.8.8 的主机的 53 号端口

TCP 套接字与 UDP 套接字

TCP(传输控制协议)UDP(用户数据报协议) 是两种常见的网络传输协议。在这两种协议下,套接字的行为和特性 有所不同

TCP 套接字

TCP 是一种 面向连接 的协议,提供可靠的、有序的、双向的数据传输。在 TCP 通信过程中,涉及到两种类型的套接字,即 监听套接字(Listening Socket)连接套接字(Connected Socket)

监听套接字

监听套接字用于接受客户端的连接请求。服务器在 启动时创建 一个监听套接字,并通过调用 bind() 方法绑定到一个特定的 套接字地址(IP 地址及端口号的组合)。然后,服务器通过调用 listen() 方法 开始监听 客户端的连接请求。

监听套接字等待客户端的连接请求,一旦有客户端连接请求到达,就会 接受连接创建 连接套接字。监听套接字 通常 只有一个,用于接受一个或多个客户端的连接请求。

连接套接字

连接套接字用于 建立和维护 TCP 连接。当一个客户端与服务器建立连接时,服务器会创建一个连接套接字来处理与该客户端的通信。连接套接字是通过在服务器上调用 accept() 方法而创建的。

连接套接字具有 已经建立 的 TCP 连接,包含了客户端和服务器之间的通信通道。通过连接套接字,可以进行 双向的可靠数据传输,保证数据的顺序和完整性。

UDP套接字

UDP 是一种 无连接 的协议,提供不可靠的、无序的数据传输。与 TCP 不同,UDP 在传输数据时 不会建立持久的连接。因此,UDP 套接字不存在连接套接字和监听套接字之别。

TCP 服务器端与 TCP 客户端通信的基本流程

服务器端

  1. 创建一个监听套接字对象,指定地址族(IPV4IPV6)和套接字类型(TCP 套接字UDP 套接字)。

  2. 通过使用 bind() 方法为监听套接字指定套接字地址。

  3. 调用 listen() 方法以指示监听套接字 开始 对客户端的连接请求进行监听。

  4. 通过调用 accept() 方法接受客户端的连接请求,该方法将返回一个连接套接字及客户端套接字的套接字地址。

  5. 通过连接套接字与客户端进行通信,使用 recv() 方法接收客户端发送的数据,使用 send() 方法向客户端发送响应。

  6. 重复步骤 5,直到通信完成。

  7. 关闭服务器套接字。

客户端

  1. 创建一个客户端套接字对象,并为该套接字指定 地址族套接字类型

  2. 调用 connect() 方法通过服务器的监听套接字向服务器端发起连接请求。

  3. 通过客户端套接字与服务器进行通信,使用 send() 向服务器发送数据,使用 recv()方法接收服务器端返回的响应。

  4. 重复步骤 3,直到通信完成。

  5. 关闭客户端套接字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryMoon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值