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

news2024/11/13 7:51:37

网络介绍 🌐

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

单机游戏 🎮

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

使用网络的目的 🚀

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

网络编程 💻

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

网络通信过程 📡

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

互联网访问 🌍

当我们在浏览器中输入一个网址并访问网页时,实际上发生了一系列的步骤。首先,浏览器会检查缓存中是否有该网址的记录。如果没有,它会向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协议仍然是网络通信的基石。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计

起因, 目的: 客户需求, 就是要设计一个数据库。 过程, 关于工具: UI 设计,我最喜欢的工具其实是 Canva, 但是 Canva 没有合适的模板。我用的是 draw.io, 使用感受是,很垃圾。 各种快捷键不适应,箭头就是点不住&…

VuePress搭建文档网站/个人博客(详细配置)主题配置

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

JavaEE初阶——初识EE(Java诞生背景,CPU详解)

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 零:Java的发展背景介绍 一:EE的概念 二:计算机的构成 1:CU…

Python面试宝典第50题:分割等和子集

题目 给你一个只包含正整数的非空数组nums,请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1, 5, 11, 5] 输出:True 解释:数组可以分割成[1, 5, 5]和[11]。 示…

C++之第十二课

课程列表 哎呀呀,失踪人口回归了!(前段时间跑去B站了,久等了) 今天来讲——数组 有一道题是这样的: 有n个数,请输出其中最大的数。 原来我们就要: int a,b,c... 但是——数组…

Golang开发的OCR-身份证号码识别(不依赖第三方)

身份证号码识别(golang) 使用golang的image库写的身份证号码识别,还有用了一个resize外部库,用来更改图片尺寸大小,将每个数字所在的图片的大小进行统一可以更好的进行数字识别,库名 :“github…

ARM 工业边缘计算机与 C# 编程的完美融合

在工业领域,随着智能化和数字化的不断推进,ARM 工业边缘计算机凭借其出色的性能和低功耗等优势,逐渐成为众多应用场景的重要支撑。而 C# 编程语言的强大功能和广泛适用性,使其在与 ARM 工业边缘计算机的结合中展现出了巨大的潜力。…

Python | Leetcode Python题解之第415题字符串相加

题目: 题解: class Solution:def addStrings(self, num1: str, num2: str) -> str:res ""i, j, carry len(num1) - 1, len(num2) - 1, 0while i > 0 or j > 0:n1 int(num1[i]) if i > 0 else 0n2 int(num2[j]) if j > 0 e…

C++ -命名空间-详解

博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ C -命名空间-详解 1.C语言缺点之一 -- 命名冲突2.命名空间2.1定义2.2使用访问命名空间中的变量展开命名空间域指定访问命名空间域 2.3其他功能 3.C 标准库中的命名空间指定展开…

华为OD机试 - 二维伞的雨滴效应(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

徒增成本,还是有备无患?说说4G模组SIM双卡切换

初学开发的小伙伴提出疑问: 手机双卡可以理解,人情世故各种缘由…… 物联网设备有必要双卡吗,会不会太浪费? 实际应用中,双卡可不是徒增成本的摆设,而是有备无患的必需。 在使用4G模组双卡功能的场景下&a…

2024年数学建模比赛题目及解题代码

目录 一、引言 1. 1竞赛背景介绍 1.1.1数学建模竞赛概述 1.1.2生产过程决策问题在竞赛中的重要性 1.2 解题前准备 1.2.2 工具与资源准备 1.2.3 心态调整与策略规划 二、问题理解与分析 三、模型构建与求解 3.1 模型选择与设计 3.1.1 根据问题特性选择合适的数学模型类…

每日学习一个数据结构-红黑树

文章目录 什么是红黑树?示意图红黑树的特点红黑树的节点结构插入和删除操作旋转操作重新着色 红黑树的应用 树的构造过程插入新节点自平衡调整策略 示例 查询过程 什么是红黑树? 红黑树(Red-Black Tree)是一种自平衡的二叉查找树…

关于嵌入式硬件需要了解的基础知识

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于嵌入式硬件基础知识的相关内容&#xff…

TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model

文章汇总 存在的问题 原文:具有图像特定知识的图像条件提示符号在提升类嵌入分布方面的能力较差。 个人理解:单纯把"a photo of {class}"这种提示模版作为输入是不利于text encoder学习的 动机 在可学习的提示和每一类的文本知识之间建立…

2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线

短剧系统技术栈 前端:vue3uniapp 后端: php 数据库:mysql 服务器环境: centos7.6 宝塔 php7.4 MySQL5.7 一、短剧系统功能 短剧用户端: 小程序、抖音小程序、快手小程序、APP、 z付宝小程序 系统用户端详细功能&…

Java创建教程!(*  ̄3)(ε ̄ *)

Java 构造函数 Java面向对象设计 - Java构造函数 构造函数是用于在对象创建后立即初始化对象的代码块。 构造函数的结构看起来类似于一个方法。 声明构造函数 构造函数声明的一般语法是 <Modifiers> <Constructor Name>(<parameters list>) throws <…

安卓14剖析SystemUI的ShadeLogger/LogBuffer日志动态控制输出dumpsy机制

背景&#xff1a; 看SystemUI的锁屏相关代码时候发现SystemUI有一个日志打印相关的方法调用&#xff0c;相比于常规的Log.i直接可以logcat查看方式还是比较新颖。 具体日志打印代码如下&#xff1a; 下面就来介绍一下这个ShadeLogger到底是如何打印的。 分析源码&#xff1…

scanf()函数的介绍及基础用法

目录 scanf&#xff08;&#xff09;函数的介绍及基础用法 一&#xff1a;头文件 二&#xff1a;一般用法 三&#xff1a;返回值 1. 正整数的情况&#xff1a; 2. 0 的情况&#xff1a; 3. EOF的情况&#xff1a; 四&#xff1a;说明 scanf&#xff08;&#xff09;函数…

CCF202006_1

问题描述 试题编号&#xff1a;202006-1试题名称&#xff1a;线性分类器时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 题解&#xff1a; #include<bits/stdc.h>using namespace std; int n, m;struct Node {int x, y;char ch; }node[1010…