文章目录
- 参考
- Socket API
- BSD UNIX 操作系统
- BSD UNIX 与 Socket API
- Socket
- 套接字
- 套接字地址
- 套接字 VS 套接字地址
- 套接字的表示方法
- TCP 套接字与 UDP 套接字
- TCP 套接字
- 监听套接字
- 连接套接字
- UDP套接字
- TCP 服务器端与 TCP 客户端通信的基本流程
- 服务器端
- 客户端
参考
项目 | 描述 |
---|---|
刘—手 | python–socket模块 |
Python 官方文档 | https://docs.python.org/zh-cn/3/ |
搜索引擎 | Google 、Bing |
Socket API
BSD UNIX 操作系统
BSD(Berkeley Software Distribution)
是一个基于 UNIX
操作系统的分支,最早由 加州大学伯克利分校
开发并发布。BSD UNIX 的发展 始于 20 世纪 70 年代末
,它是对 AT&T UNIX
的改进和扩展。
BSD UNIX 的目标是提供一个 高度可靠、可扩展和自由开放的操作系统
,以 满足学术和研究机构的需求
,BSD UNIX
的发展着重于对网络和分布式系统的支持,以及在可移植性、稳定性和安全性方面的改进。
BSD UNIX
在操作系统领域做出了许多重要的贡献,包括以下几个方面:
-
网络协议栈
BSD UNIX 引入了TCP/IP
协议栈作为其默认
网络协议。并且,BSD UNIX 还对TCP/IP
协议进行了许多改进和优化
。BSD UNIX
的网络协议实现在当时是非常先进的,这为互联网的后续发展提供了借鉴。 -
套接字编程接口
BSD UNIX 引入了套接字(Socket)编程接口
,它提供了一种抽象的方式
来进行网络通信。套接字编程接口后来成为了网络编程的标准
,被许多操作系统所采用。 -
文件系统改进
BSD UNIX 对文件系统进行了改进,引入了一些新的文件系统类型,如Fast File System(FFS)
,提高了文件系统的性能和可靠性
。 -
安全性增强
BSD UNIX 引入了一些安全性增强功能,如访问控制列表(ACL)、加密文件系统等,提高了操作系统的安全性
。
BSD UNIX 在不同的版本和分支中有许多 变体
,包括
BSD 4.2、BSD 4.3、BSD Lite、FreeBSD、NetBSD、OpenBSD等。这些变体在 BSD UNIX 操作系统的基础上进行了不同程度的 改进和扩展
,逐渐形成了独立的操作系统。
许多现代的操作系统,包括 Linux
和 MacOS
,都受到了 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 客户端通信的基本流程
服务器端
-
创建一个监听套接字对象,指定地址族(
IPV4
或IPV6
)和套接字类型(TCP 套接字
或UDP 套接字
)。 -
通过使用
bind()
方法为监听套接字指定套接字地址。 -
调用
listen()
方法以指示监听套接字开始
对客户端的连接请求进行监听。 -
通过调用
accept()
方法接受客户端的连接请求,该方法将返回一个连接套接字及客户端套接字的套接字地址。 -
通过连接套接字与客户端进行通信,使用
recv()
方法接收客户端发送的数据,使用send()
方法向客户端发送响应。 -
重复步骤
5
,直到通信完成。 -
关闭服务器套接字。
客户端
-
创建一个客户端套接字对象,并为该套接字指定
地址族
和套接字类型
。 -
调用
connect()
方法通过服务器的监听套接字向服务器端发起连接请求。 -
通过客户端套接字与服务器进行通信,使用
send()
向服务器发送数据,使用recv()
方法接收服务器端返回的响应。 -
重复步骤
3
,直到通信完成。 -
关闭客户端套接字。