《计算机网络简易速速上手小册》第1章:计算机网络技术基础(2024 最新版)

在这里插入图片描述

文章目录

  • 1.1 OSI 模型简介 - 深入探究
    • 1.1.1 基础知识
    • 1.1.2 重点案例:构建简易 HTTP 服务器
    • 1.1.3 拓展案例1:网络层数据包捕获
    • 1.1.4 拓展案例2:传输层 TCP 连接
  • 1.2 TCP/IP 协议栈 - 深入探究
    • 1.2.1 基础知识
    • 1.2.2 重点案例:使用 Python 实现 TCP 客户端和服务器
    • 1.2.3 拓展案例1:使用 Python 实现文件传输
    • 1.2.4 拓展案例2:使用 Python 进行简单的网页抓取
  • 1.3 网络拓扑和架构 - 深入探究
    • 1.3.1 基础知识
    • 1.3.2 重点案例:构建基于星形拓扑的简单聊天应用
    • 1.3.3 拓展案例1:模拟网络拓扑
    • 1.3.4 拓展案例2:使用 Python 模拟网络流量

1.1 OSI 模型简介 - 深入探究

1.1.1 基础知识

OSI(Open Systems Interconnection)模型,是一种概念性框架,用于全面理解网络的不同层次和功能。它由七层构成,从下到上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • 物理层:负责在物理媒介上传输原始比特流,涉及电缆、光纤、无线传输等。
  • 数据链路层:确保物理层产生的原始数据可靠地传输,处理错误检测和修正。
  • 网络层:处理数据包在网络中的路由,IP地址就属于这一层。
  • 传输层:负责数据的端到端传输和可靠性,TCP和UDP协议工作在此层。
  • 会话层:管理用户会话,控制应用程序之间的对话和数据交换。
  • 表示层:确保数据从一个网络服务传输到另一个网络服务时,被正确翻译和格式化。
  • 应用层:为应用软件提供网络服务,如HTTP、FTP等协议。

1.1.2 重点案例:构建简易 HTTP 服务器

让我们用Python来构建一个简易的HTTP服务器,这将帮助我们理解OSI模型中的应用层。

Python 代码示例

from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b'Hello, World! This is a simple HTTP server.')

httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
print("Serving HTTP on localhost port 8000...")
httpd.serve_forever()

这个Python脚本使用了http.server库,它创建了一个监听本地8000端口的HTTP服务器。当接收到GET请求时,服务器会返回“Hello, World! This is a simple HTTP server.”消息。

1.1.3 拓展案例1:网络层数据包捕获

深入到网络层,我们可以使用Python的scapy库来捕获和分析数据包,了解IP地址的工作原理。

Python 代码示例

from scapy.all import sniff

def packet_callback(packet):
    if packet.haslayer(IP):
        ip_src = packet[IP].src
        ip_dst = packet[IP].dst
        print(f"Packet: {ip_src} -> {ip_dst}")

print("Sniffing packets...")
sniff(prn=packet_callback, count=10)

这段代码会捕获通过网络传输的前10个数据包,并打印出它们的源IP地址和目的IP地址,帮助我们理解网络层的路由功能。

1.1.4 拓展案例2:传输层 TCP 连接

再深入一步到传输层,我们使用Python的socket库来建立一个TCP连接,模拟TCP的三次握手过程。

Python 代码示例

import socket

def create_tcp_connection():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('localhost', 9999))
    s.listen(1)
    print("Waiting for a connection on localhost port 9999...")
    
    conn, addr = s.accept()
    print(f"Connected by {addr}")
    while True:
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)
    conn.close()

create_tcp_connection()

这段代码创建了一个监听本地9999端口的TCP服务器。当一个客户端连接时,它会接收客户端发送的数据,并将相同的数据发送回去,展示了TCP连接的建立、数据传输和连接终止过程。

通过这三个案例,我们不仅能够理解OSI模型的不同层级如何在实际应用中工作,还能够实践Python编程,将理论与实践相结合。

在这里插入图片描述


1.2 TCP/IP 协议栈 - 深入探究

1.2.1 基础知识

TCP/IP协议栈,也称为互联网协议套件,是一组用于互联网和类似网络的通信协议。它分为四个层次:链路层、网络层、传输层和应用层。

  • 链路层(或网络接口层):处理与物理网络的连接,如以太网的物理和数据链路标准。
  • 网络层:处理数据包在网络中的路由,最著名的协议是IP(互联网协议)。
  • 传输层:负责提供端到端的数据传输服务,主要的协议包括TCP(传输控制协议)和UDP(用户数据报协议)。
  • 应用层:为应用软件提供网络服务,包括HTTP、FTP、SMTP等协议。

1.2.2 重点案例:使用 Python 实现 TCP 客户端和服务器

构建一个简单的TCP回声服务器和客户端,可以帮助我们理解TCP/IP协议栈中的传输层如何工作。

服务器端代码

import socket

def tcp_server():
    host = 'localhost'
    port = 12345
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"TCP Server listening on {host}:{port}")
        conn, addr = s.accept()
        with conn:
            print(f"Connected by {addr}")
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                conn.sendall(data)

tcp_server()

客户端代码

import socket

def tcp_client():
    host = 'localhost'
    port = 12345
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        s.sendall(b'Hello, TCP Server')
        data = s.recv(1024)
        print(f"Received {data.decode()} from server")

tcp_client()

这个案例中,服务器端首先启动并监听指定端口的连接请求。客户端启动后,向服务器发送一条消息,服务器接收到这条消息后,将同样的消息回送给客户端,完成一个简单的回声测试。

1.2.3 拓展案例1:使用 Python 实现文件传输

在实际应用中,基于TCP/IP协议的文件传输是非常常见的需求。以下是一个简单的文件传输示例:

服务器端代码

import socket

def file_transfer_server():
    host = 'localhost'
    port = 12346
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"File Transfer Server listening on {host}:{port}")
        conn, addr = s.accept()
        with conn:
            print(f"Connected by {addr}")
            with open('received_file.txt', 'wb') as f:
                while True:
                    data = conn.recv(1024)
                    if not data:
                        break
                    f.write(data)
            print("File has been received.")

file_transfer_server()

客户端代码

import socket

def file_transfer_client():
    host = 'localhost'
    port = 12346
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        with open('send_file.txt', 'rb') as f:
            s.sendfile(f)
        print("File has been sent.")

file_transfer_client()

这个案例中,客户端将一个文件发送到服务器端。服务器接收文件并保存到本地。

1.2.4 拓展案例2:使用 Python 进行简单的网页抓取

网页抓取通常涉及到应用层的HTTP协议。以下是使用Python的requests库进行简单网页抓取的示例:

import requests

def simple_web_crawler(url):
    response = requests.get(url)
    if response.status_code == 200:
        with open("page.html",

 "w", encoding='utf-8') as f:
            f.write(response.text)
        print(f"Web page saved successfully.")
    else:
        print("Failed to retrieve the web page.")

simple_web_crawler('http://example.com')

这个案例中,我们对指定的URL进行HTTP GET请求,然后将获取的网页内容保存到本地文件中。这个过程展示了如何使用Python处理应用层的网络通信。

通过这三个案例,我们不仅加深了对TCP/IP协议栈各层功能的理解,还学会了如何使用Python进行实际的网络编程,涵盖了从基本的数据传输到复杂的应用层通信。

在这里插入图片描述


1.3 网络拓扑和架构 - 深入探究

1.3.1 基础知识

网络拓扑定义了网络中元素(如节点、链接等)的排列方式,而网络架构涵盖了设计网络的技术规范,包括数据流、控制流程以及路由算法等。常见的网络拓扑有星形、环形、总线形、网状等。

  • 星形拓扑:所有节点都直接连接到一个中心节点。这种结构易于管理但中心节点故障会导致整个网络瘫痪。
  • 环形拓扑:每个节点仅与两个其他节点直接相连,形成一个闭环。数据在环中按一个方向传递。
  • 总线形拓扑:所有节点都通过同一条通信线路连接。便于安装和扩展,但线路故障会影响整个网络。
  • 网状拓扑:节点之间存在多个路径,提高了网络的可靠性和容错性。

网络架构通常分为两种类型:客户端-服务器对等网络。客户端-服务器架构中,多个客户端节点请求服务器节点提供的资源或服务;对等网络中,每个节点既是客户端又是服务器,可以直接进行资源分享。

1.3.2 重点案例:构建基于星形拓扑的简单聊天应用

使用Python构建一个基于星形拓扑的简单聊天应用,其中一个服务器作为中心节点,多个客户端连接到这个服务器进行消息交换。

服务器端代码

import socket
import threading

def client_thread(conn, addr):
    print(f"Connected with {addr}")
    while True:
        try:
            message = conn.recv(1024).decode('utf-8')
            print(f"Received message from {addr}: {message}")
            for client in clients:
                if client != conn:
                    client.send(f"Message from {addr}: {message}".encode('utf-8'))
        except:
            conn.close()
            break

def chat_server():
    host = 'localhost'
    port = 12345
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen()
    print(f"Chat Server started on {host}:{port}")
    while True:
        conn, addr = server_socket.accept()
        clients.append(conn)
        threading.Thread(target=client_thread, args=(conn, addr)).start()

clients = []
chat_server()

客户端代码

import socket

def chat_client():
    host = 'localhost'
    port = 12345
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        while True:
            message = input("Enter message: ")
            s.send(message.encode('utf-8'))

chat_client()

在这个案例中,服务器监听来自多个客户端的连接,客户端连接到服务器并发送消息,服务器再将消息转发给所有其他连接的客户端,实现了基本的聊天功能。

1.3.3 拓展案例1:模拟网络拓扑

我们将使用 Python 模拟一个简单的星形网络拓扑,以及如何通过中央节点(服务器)进行消息传递。

Python 模拟服务器代码

import socket
import threading

def client_handler(connection, address):
    try:
        while True:
            message = connection.recv(1024)
            if not message:
                break
            print(f"Message from {address}: {message.decode()}")
            connection.sendall(b"Message received")
    finally:
        connection.close()

def star_topology_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('localhost', 10000))
    server.listen(5)
    print("Server listening on port 10000...")
    
    try:
        while True:
            conn, addr = server.accept()
            threading.Thread(target=client_handler, args=(conn, addr)).start()
    finally:
        server.close()

star_topology_server()

这段代码启动了一个服务器,模拟星形拓扑的中央节点,等待客户端的连接并处理它们发送的消息。

1.3.4 拓展案例2:使用 Python 模拟网络流量

理解网络架构的另一个方面是通过模拟网络流量来分析性能。以下是使用scapy库来模拟和分析网络流量的基本示例:

from scapy.all import IP, ICMP, send

def simulate_traffic(dst):
    packet = IP(dst=dst)/ICMP()
    send(packet)

simulate_traffic("www.example.com")

在这个简单的示例中,我们使用scapy发送一个ICMP包(即 ping)到目标地址。虽然这个例子很基础,但它展示了如何使用 Python 进行网络流量生成和分析,这对于理解和测试网络架构的性能是非常有用的。

这些案例提供了从基本的网络通信到网络管理和性能分析的广泛视角,展示了网络拓扑和架构在实际应用中的重要性,并通过 Python 实践加深了对这些概念的理解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.3作业 编写一个shell 脚本,判断输入的是否是数字

#!/bin/bashvar$1 len${#var} j0 for(($j;$j<$len;((j)))) doif [ ${var:$j:1} -eq 0 ]then echo "第$j位数字是0"elif [ ${var:$j:1 } -eq 1 ]then echo "第$j位数字是1"elif [ ${var:$j:1} -eq 2 ]then echo "第$j位数字是2"elif [ ${var:$…

【Linux】理解系统中一个被打开的文件

文件系统 前言一、C语言文件接口二、系统文件接口三、文件描述符四、struct file 对象五、stdin、stdout、stderr六、文件描述符的分配规则七、重定向1. 重定向的原理2. dup23. 重谈 stderr 八、缓冲区1. 缓冲区基础2. 深入理解缓冲区3. 用户缓冲区和内核缓冲区4. FILE 前言 首…

题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?

lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…

【DDD】学习笔记-代码模型的架构决策

代码模型属于软件架构的一部分&#xff0c;它是设计模型的进化与实现&#xff0c;体现出了代码模块&#xff08;包&#xff09;的结构层次。在架构视图中&#xff0c;代码模型甚至会作为其中的一个视图&#xff0c;通过它来展现模块的划分&#xff0c;并定义运行时实体与执行视…

跨平台开发:浅析uni-app及其他主流APP开发方式

随着智能手机的普及&#xff0c;移动应用程序&#xff08;APP&#xff09;的需求不断增长。开发一款优秀的APP&#xff0c;不仅需要考虑功能和用户体验&#xff0c;还需要选择一种适合的开发方式。随着技术的发展&#xff0c;目前有多种主流的APP开发方式可供选择&#xff0c;其…

【HTML 基础】框架 iframe 标签

文章目录 1. 基本用法2. 设置框架样式3. frameborder 和 scrolling 属性4. 在框架中显示其他内容5. 响应式框架6. 注意事项结语 在 Web 开发中&#xff0c;有时候我们需要在页面中嵌套其他网页或内容&#xff0c;这时候就可以使用 HTML 的框架标签之一<iframe>。<ifra…

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll 2024/2/2 10:48 https://blog.csdn.net/feinifi/article/details/132548556 Could not locate cudnn_ops_infer64_8.dll. Please make sure it is in your library path!解决办法 安装cuDNN c:\faster-whisper-…

【MybatisPlus篇】查询条件设置(范围匹配 | 模糊匹配 | 空判定 | 包含性判定 | 分组 | 排序)

文章目录 &#x1f384;环境准备⭐导入依赖⭐写入User类⭐配置启动类⭐创建UserDao 的 MyBatis Mapper 接口&#xff0c;用于定义数据库访问操作⭐创建配置文件&#x1f6f8;创建测试类MpATest.java &#x1f354;范围查询⭐eq⭐between⭐gt &#x1f354;模糊匹配⭐like &…

MySQL的ACID、死锁、MVCC问题

1 ACID ACID代表原子性&#xff08;atomicity&#xff09;、一致性&#xff08;consistency&#xff09;、隔离性&#xff08;isolation&#xff09;和持久性&#xff08;durability&#xff09;。一个确保数据安全的事务处理系统&#xff0c;必须满足这些密切相关的标准。 原…

三、数据背后的二进制

文章目录 数据背后的二进制1.1 整数的二进制表示与位运算1.1.1 正整数的二进制表示1.1.2 负整数的二进制表示 1.2 原码、反码、补码1.2.1 机器数和机器数的真值1.2.2 原码, 反码, 补码的基础概念和计算方法1.2.3 为何要使用原码、反码和补码1.2.4 补码计算原理 1.3 小数的二进制…

android 网络拦截器统一处理请求参数和返回值加解密实现

前言 项目中遇到参数加密和返回结果加密的业务 这里写一下实现 一来加深记忆 二来为以后参考铺垫 需求 项目在开发中涉及到 登陆 发验证码 认证 等前期准备接口 这些接口需要单独处理 比如不加密 或者有其他的业务需求 剩下的是登陆成功以后的业务需求接口 针对入参和返回值…

jsp游戏网上商城系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 游戏网上商城系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

flutter开发实战-Camera自定义相机拍照功能实现

flutter开发实战-Camera自定义相机拍照功能实现 一、前言 在项目中使用image_picker插件时候&#xff0c;在android设备上使用无法默认设置前置摄像头&#xff08;暂时不清楚什么原因&#xff09;&#xff0c;由于项目默认需要使用前置摄像头&#xff0c;所以最终采用自定义…

机器学习 | 如何构建自己的决策树算法?

决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法 目录 初识决策树 决策树原理 cart剪枝 特征提取 泰坦尼克号乘客生存预测(实操) 回归决策树 初识决策树 决策树是一种…

分布式事务 seata+nacos 部署

分布式事务 seatanacos 部署 一、下载seata二、解压配置三、导入数据库四、nacos配置五、配置要引入事务的模块的配置文件六、启动七、测试 这里使用的版本&#xff1a; nacos&#xff1a;2.0.4 seata&#xff1a;1.5.2 seata官方地址&#xff1a;https://seata.apache.org/zh-…

【数据结构】并查集(路径压缩)

文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集 1.朴素版本 1. 并查集解决的是连通块的问题&#xff0c;常见操作有&#xff0c;判断两个元素是否在同一个连通块当中&#xff0c;两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构…

零基础学Python(6)— 运算符

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。运算符是一种用于执行特定操作的符号或关键字。在编程中&#xff0c;运算符用于对变量、常量和表达式进行操作&#xff0c;以产生一个结果。下面将详细介绍Python语言中常见的运算符&#xff01;~&#x1f308; 目录 &a…

Three.js学习2:页面引入 Three.js

一、关于 Three.js 的版本 随着页面3D化应用越来越多&#xff0c;近两年 Three.js 处于飞速发展之中。现在 Three.js 几乎每个月都会发布一个新的版本&#xff0c;会增加新的 API&#xff0c;废掉一些旧的功能之类的。 可以从 Three.js 官网 Three.js – JavaScript 3D Libra…

【Linux】线程安全——同步和互斥

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 引入1. Linux线程互斥1.1 互斥的相关概念1.2 互斥量mutex1.3 mutex的使用1.4 mutex的…

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机 1. 确保已经开启HyperV2. 准备Ubuntu16.04镜像&#xff08;推荐64位的&#xff09;3. HyperV ->快速创建 -> 更改安装源 选刚刚下载的镜像&#xff08;.iso&#xff09;文件就好 -> 创建虚拟机[^1] 前提&#xff1a;VMw…