探索网络世界:TCP/IP协议、Python Socket编程及日常生活比喻

发布于:2024-09-19 ⋅ 阅读:(12) ⋅ 点赞:(0)

网络介绍 🌐

网络就像是一个无形的纽带,把我们所有人👫👫👫紧紧相连。没有网络的世界,就像是失去了色彩的画布,多么的单调和无趣啊!🎨
网络介绍

单机游戏 🎮

单机游戏就像是一个人的独角戏,虽然精彩,但总是少了那么一点分享的乐趣。😔
在这里插入图片描述

使用网络的目的 🚀

我们使用网络,不就是为了能够和远方的朋友👬一起分享快乐,一起解决问题嘛!🌍
在这里插入图片描述

网络编程 💻

网络编程不仅仅是学习如何发送和接收数据,它还涉及到对网络行为的理解和应用。通过编写能够在不同设备间进行通信的代码,开发者可以创建出功能强大的分布式系统。🛠️
在这里插入图片描述

网络通信过程 📡

网络通信是一个复杂的过程,它涉及到数据的封装、寻址、传输、路由选择以及最终的解封装。在这个过程中,数据被分解成小的数据包,每个数据包都包含了源和目的地址,确保它们能够正确地到达目的地。📦
在这里插入图片描述

互联网访问 🌍

当我们在浏览器中输入一个网址并访问网页时,实际上发生了一系列的步骤。首先,浏览器会检查缓存中是否有该网址的记录。如果没有,它会向DNS服务器请求将域名解析为IP地址。然后,浏览器会通过IP地址找到服务器,并建立一个到服务器的TCP连接。一旦连接建立,浏览器就可以发送HTTP请求,服务器响应后,浏览器会接收数据并渲染网页。🔍

有缓存
无缓存
用户输入网址
浏览器检查缓存
使用缓存加载网页
DNS解析域名
获取IP地址
建立TCP连接
发送HTTP请求
服务器响应
浏览器接收数据
渲染网页

TCP (传输控制协议) 🚚

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据完整无误地从源传输到目的地。TCP的三次握手过程确保了连接的建立,而四次挥手过程则优雅地关闭了连接。🤝
在这里插入图片描述

TCP的特点:

  • 可靠性:确保数据包正确无误地到达。
  • 顺序保证:数据包按发送顺序到达。
  • 拥塞控制:网络拥堵时自动调整发送速率。
  • 流量控制:根据接收方能力调整发送速率。

UDP (用户数据报协议) 📶

UDP是一种无连接的传输层协议,它允许数据包独立发送,而不需要建立连接。UDP提供了快速但不保证可靠性的传输服务,适用于对实时性要求高的应用。🏃‍♂️
在这里插入图片描述

UDP的特点:

  • 无连接:不需要建立连接,直接发送数据。
  • 速度快:没有建立连接的开销,延迟低。
  • 不可靠性:不保证数据包的到达或顺序。
  • 简单:头部开销小,处理简单。

客户端-服务器 (CS) 架构 🏢

CS架构是一种常见的网络架构模式,其中一个或多个客户端与服务器进行交互。服务器通常负责数据存储、处理请求和提供服务。💼
在这里插入图片描述

CS架构的特点:

  • 中心化:服务器是系统的核心,负责大部分的处理工作。
  • 可扩展性:通过增加服务器资源来提高系统性能。
  • 安全性:可以在服务器端实施安全措施。
  • 成本:可能需要投资于服务器硬件和维护。

Web Services (WS) 架构 🌐

WS架构是一种分布式的网络架构,它允许不同的应用程序通过网络进行通信和数据交换。这种架构通常基于开放标准,如HTTP、XML和SOAP。🌐
在这里插入图片描述

WS架构的特点:

  • 分布式:服务分布在不同的服务器上,可以跨平台工作。
  • 灵活性:服务可以独立开发和部署。
  • 互操作性:不同的系统和平台可以通过标准协议进行通信。
  • 可组合性:服务可以组合成更复杂的应用程序。

当然可以,这段描述非常清晰地概述了socket编程的基本流程,并且可以作为Python TCP编程实践部分的一个引入。以下是将这段描述整合到文章中的内容:

Python中的TCP编程实践 🐍

在深入了解了TCP和UDP的基本概念以及网络架构之后,我们现在将通过Python来实践TCP编程。以下是一个简单的TCP服务器和客户端的示例,以及socket通信流程的详细描述。👨‍💻
在这里插入图片描述

Socket 编程思想

在网络编程中,socket是实现网络通信的关键。以使用TCP协议通讯的socket为例,其交互流程大概是这样的:

  1. 服务器创建socket:根据地址类型(IPv4, IPv6)、socket类型、协议创建socket。
  2. 绑定地址和端口:服务器为socket绑定IP地址和端口号。
  3. 监听连接:服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开。
  4. 客户端创建socket:客户端创建自己的socket。
  5. 客户端打开socket:客户端打开socket,根据服务器IP地址和端口号试图连接服务器socket。
  6. 服务器接收请求:服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端连接请求。
  7. 客户端发送连接状态信息:客户端连接成功,向服务器发送连接状态信息。
  8. 服务器连接成功:服务器accept方法返回,连接成功。
  9. 数据交换:客户端向socket写入信息,服务器读取信息。
  10. 关闭连接:客户端和服务器端分别关闭socket。
socket 通信流程图

在这里插入图片描述

TCP服务器端

import socket

# 创建socket对象
# socket.AF_INET ipv4 协议(版本)
# socket.SOCK_STREAM   tcp 协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_socket.bind(('127.0.0.1', 7788))

# 监听连接
server_socket.listen(5)
print("服务器启动,等待客户端连接...")

while True:
    # 接受一个新连接
    client_socket, addr = server_socket.accept()
    print("连接地址: " + str(addr))

    # 接收数据
    data = client_socket.recv(1024)
    print("收到消息: " + data.decode('utf-8'))

    # 发送数据
    client_socket.send('消息已收到'.encode('utf-8'))

    # 关闭连接
    client_socket.close()

# 关闭服务器socket(在实际应用中,服务器通常不会关闭)
# server_socket.close()

TCP服务器的日常生活比喻 🍽️

想象一下,TCP服务器就像是一家忙碌的餐厅🏠,它等待着顾客(客户端)的到来,并为他们提供服务。

  1. 创建socket对象

    • 餐厅老板👨‍🍳准备好了一张桌子🪑(socket),这张桌子是用来接待顾客的。
  2. 绑定地址和端口

    • 老板在餐厅的门口挂上了一个招牌📝,上面写着“欢迎光临,地址:127.0.0.1,电话:7788”。这个招牌告诉顾客在哪里可以找到餐厅。
  3. 监听连接

    • 老板在餐厅里等待顾客的到来,准备好接待他们。餐厅的门是敞开的🚪,最多可以接待5位顾客(监听5个连接)。
  4. 接受一个新连接

    • 当有顾客走进餐厅时,老板微笑着迎接他们,询问他们的需求(接受连接)。
  5. 接收数据

    • 顾客坐下后,老板询问他们想要点什么(接收数据)。顾客告诉老板他们的订单(发送的消息)。
  6. 发送数据

    • 老板听完订单后,点头表示理解,并告诉顾客“您的订单已收到,我们会尽快为您准备。”(发送确认消息)。
  7. 关闭连接

    • 顾客用餐结束后,老板感谢他们的光临,并送他们离开(关闭与客户端的连接)。餐厅🏠准备迎接下一位顾客。
  8. 关闭服务器socket

    • 在实际情况下,餐厅不会轻易关门,老板会继续营业,直到决定结束营业(关闭服务器socket)。

TCP客户端

import socket

# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
client_socket.connect(('127.0.0.1', 7788))

# 发送数据
client_socket.send('你好,服务器'.encode('utf-8'))

# 接收响应
data = client_socket.recv(1024)
print("服务器响应: " + data.decode('utf-8'))

# 关闭连接
client_socket.close()

TCP客户端的生活比喻 📞

想象TCP客户端就像是一个忙碌的都市人👤,他正在通过电话📱与朋友或同事进行沟通:

  1. 创建socket对象

    • 这就像是拿起电话听筒📞,准备开始通话。
  2. 连接到服务器

    • 这就像是拨打电话号码🔢(服务器的IP地址和端口号),等待电话接通,你可能会听到一些拨号音🔔。
  3. 发送数据

    • 一旦电话接通,通话者(客户端)开始说话🗣️(发送数据),比如向对方问好:“你好,服务器!”
  4. 接收响应

    • 通话者等待对方(服务器)回应,当对方回应时,通话者聆听👂对方说话(接收数据),可能是一段友好的对话或者所需的信息。
  5. 关闭连接

    • 通话结束后,通话者礼貌地说再见👋,然后挂断电话📵,结束通话。

总结

在这个例子中,服务器在一个无限循环中等待客户端的连接。每当有新的客户端连接时,服务器都会接收客户端发送的消息,并发送一个确认响应。客户端连接到服务器,发送一条消息,然后等待并打印服务器的响应。

注意事项

  • 在实际部署中,服务器需要能够处理多个客户端的连接,这通常通过多线程或异步IO来实现。
  • 异常处理非常重要,应该在代码中添加相应的异常处理逻辑来确保服务器的稳定运行。
  • 安全性也是网络编程中的一个重要考虑,应该采取适当的加密和验证措施来保护数据传输的安全。

CS与WS架构的应用

在实际的应用中,CS架构通常用于桌面应用程序,而WS架构则广泛应用于Web服务和分布式系统。例如,一个在线商店可能使用CS架构为用户提供交互界面,同时后端使用WS架构与支付网关、库存管理系统等进行通信。

结论

通过Python的socket编程,我们可以快速地实现TCP通信。无论是CS还是WS架构,了解其工作原理和适用场景对于开发现代网络应用都是至关重要的。随着技术的发展,网络架构和编程模式也在不断演进,但TCP/IP协议仍然是网络通信的基石。

👇 源码资料获取 · 技术与交流 👇
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到