socket 套接字
跳转到“socket 套接字”Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。socket所处位置:

TCP(Transmission Control Protocol)
跳转到“TCP(Transmission Control Protocol)”- 功能:TCP是传输层的协议,提供可靠的、有序的和错误检测机制的数据传输服务。
- 连接:TCP是面向连接的协议,数据传输前需要建立连接。
- 顺序:确保数据包按照发送的顺序到达接收端。
- 错误恢复:具有错误检测和重传机制,确保数据的完整性。
- 流量控制:通过滑动窗口机制来控制数据的发送速率,以适应接收端的处理能力。
TCP协议的实现方式:
- 三次握手:TCP建立连接时,通过三次握手过程来同步序列编号和确认编号,确保连接的建立。
- 序列号和确认应答:TCP为每个数据包分配一个序列号,接收端通过确认应答(ACK)来确认数据包的接收。
- 流量控制:TCP使用滑动窗口机制来控制发送速率,接收端通过窗口大小告知发送端可以发送的数据量。
- 拥塞控制:TCP通过拥塞避免算法,如慢启动、拥塞避免、快速重传和快速恢复,来适应网络状况,防止网络拥塞。
- 错误恢复:TCP通过校验和、超时重传和选择性确认(SACK)等机制来检测和恢复错误。
# 使用TCP协议发送数据import socket
# 创建一个TCP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 目标地址和端口server_address = ('localhost', 10001)
# 连接到服务器sock.connect(server_address)
# 要发送的数据message = 'Hello, TCP!'
# 发送数据sock.sendall(message.encode())
# 关闭套接字sock.close()# 使用TCP协议接收数据import socket
# 创建一个TCP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口server_address = ('', 10001)
# 监听连接sock.bind(server_address)sock.listen(1)
print('TCP server up and listening')
# 接受连接connection, client_address = sock.accept()print('Connection from', client_address)
try: while True: # 接收数据 data = connection.recv(16) if data: print('Received:', data.decode()) else: # 没有数据,断开连接 print('No more data from', client_address) break
finally: # 关闭连接 connection.close()
sock.close()UDP(User Datagram Protocol)
跳转到“UDP(User Datagram Protocol)”socket python 实现 official doc |
- 功能:UDP也是传输层的协议,但提供一种无连接、不可靠的服务。
- 连接:UDP是无连接的,数据发送前不需要建立连接。
- 顺序:不保证数据包的顺序,接收端可能接收到乱序的数据包。
- 错误恢复:没有错误检测和重传机制,如果数据包丢失或损坏,不会自动重传。
- 性能:由于没有建立连接和错误恢复的开销,UDP通常比TCP更快。
UDP协议的实现方式:
- 数据报结构:UDP定义了数据报的格式,包括源端口、目的端口、长度、校验和。
- 无连接:UDP发送数据前不需要建立连接,直接将数据报发送到目的IP地址和端口。
- 校验和:UDP提供了可选的校验和机制,用于检测数据报在传输过程中的错误,但接收端可以选择忽略校验和。
- 多播和广播:UDP支持多播和广播传输,适用于一对多或广播场景。
# 使用UDP协议发送数据import socket
# 创建一个UDP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 要发送的数据data = 'Hello, UDP!'
# 目标地址和端口server_address = ('localhost', 10000)
# 发送数据sock.sendto(data.encode(), server_address)
# 关闭套接字sock.close()# 使用UDP协议接收数据import socket
# 创建一个UDP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口server_address = ('', 10000)sock.bind(server_address)
print('UDP server up and listening')
# 接收数据while True: data, server = sock.recvfrom(4096) print('Received:', data.decode())
sock.close()sendto 函数
- 用途:sendto 函数通常用于在无连接的套接字上发送数据,例如UDP套接字。
- 特点:可以指定目标地址信息,适合于需要指定接收方地址的场景。
- 参数:接受的参数包括套接字描述符,数据缓冲区指针,数据长度,目标地址结构以及地址结构的长度等。 send 函数
- 用途:send 函数通常用于在已连接的套接字上发送数据,例如TCP套接字。
- 特点:不需要指定目标地址,因为在已连接的套接字中,连接已经建立,数据会直接发送到连接的对方。
- 参数:接受的参数包括套接字描述符,数据缓冲区指针,数据长度等。
区别总结
- sendto 适用于无连接的数据发送,需要指定接收方的地址信息,常用于UDP套接字。
- send 适用于已连接的数据发送,不需要指定目标地址,常用于TCP套接字。
应用层协议
跳转到“应用层协议”rtsp
跳转到“rtsp”RTSP(Real Time Streaming Protocol)是一个网络控制协议,用于创建和控制音视频数据的流。它通常用于视频监控系统和视频会议系统。RTSP 协议位于 OSI 模型的应用层(第7层),它定义了一套控制音视频数据流的规则,允许客户端与服务器之间进行交互,如播放、暂停、停止和录制等操作。 RTSP 与 HTTP(超文本传输协议)类似,都是基于 TCP/IP 协议的应用层协议,但它们的主要区别在于RTSP主要用于实时流媒体,而 HTTP 则主要用于静态内容的传输。RTSP 允许客户端控制流媒体服务器上的音视频流,而 HTTP 主要用于请求和传输网页和文件。
| 特性/协议 | RTSP | HTTP | TCP | UDP |
|---|---|---|---|---|
| 定义 | 实时流媒体控制协议 | 超文本传输协议 | 传输控制协议 | 用户数据报协议 |
| 应用层级 | 应用层 | 应用层 | 传输层 | 传输层 |
| 连接类型 | 基于TCP/UDP的控制连接 | 无状态,基于TCP的连接 | 面向连接 | 无连接 |
| 数据传输 | 控制音视频流的交互 | 基于请求和响应的文档和静态资源传输 | 可靠传输 | 不可靠传输 |
| 流量控制 | 无 | 无 | 有 | 无 |
| 拥塞控制 | 无 | 无 | 有 | 无 |
| 错误恢复 | 依赖TCP/UDP | 依赖TCP | 有 | 无 |
| 数据完整性 | 依赖TCP/UDP | 依赖TCP | 高 | 低 |
| 速度 | 快(适合实时流媒体) | 较慢(因为控制机制) | 较慢(因为控制机制) | 快(因为没有控制机制) |
| 用途 | 视频监控、视频会议 | 网页浏览、文件传输 | 需要可靠传输的应用,如FTP、SMTP | 实时应用,如VoIP、在线游戏 |
| 优点 | - 支持音视频流的实时控制 - 可以与RTP/RTCP配合使用 | - 简单易用 - 广泛的支持和使用 - 适合文档和静态资源传输 | - 可靠的数据传输 - 流量控制和拥塞控制 - 错误恢复机制 | - 低延迟 - 简单高效 - 适用于实时应用 |
| 缺点 | - 需要额外的RTP/RTCP协议配合使用 - 不如HTTP广泛 | - 无状态,不适合状态保持的应用 - 可能受到中间设备的限制 - 传输效率不如TCP | - 建立连接需要时间 - 可能因为拥塞控制而降低速度 | - 数据包可能会丢失 - 没有流量控制和拥塞控制 - 需要应用程序自己处理错误恢复 |