1天:认识计算机网络

第1天:认识计算机网络

“互联网就像一张巨大的蜘蛛网,连接着全世界的计算机。”

📚 今日目标

  • 理解什么是计算机网络
  • 了解网络的作用和重要性
  • 编写第一个网络程序:检测网络连接

🎯 什么是计算机网络?

生活化理解

想象一下你在用微信聊天:

  1. 你在北京发了一条消息
  2. 你的朋友在上海收到了这条消息
  3. 中间发生了什么?

这就是计算机网络在工作!

计算机网络就是把分散在不同地点的计算机通过通信线路连接起来,实现资源共享和信息传递的系统。

网络的三个关键要素

  1. 计算机(节点):发送和接收信息的设备
  2. 通信线路(链路):传输信息的介质(网线、WiFi、光纤等)
  3. 协议(规则):计算机之间交流的"语言"

类比理解

计算机网络 = 快递系统

你的电脑  →  寄件人
网络线路  →  快递车、飞机
路由器    →  中转站
协议      →  包裹规格、运输规则
目标电脑  →  收件人

💡 网络能做什么?

1. 资源共享

  • 共享打印机
  • 共享文件
  • 共享数据库

2. 信息传递

  • 发送邮件
  • 网页浏览
  • 视频通话
  • 在线游戏

3. 分布式计算

  • 云计算
  • 区块链
  • 大数据处理

🔧 实战项目:检测网络连接

让我们编写第一个网络程序!这个程序会检测你的电脑是否连接到互联网。

代码实现

# day01_network_checker.py
# 功能:检测网络连接状态

import socket
import sys

def check_internet_connection(host="8.8.8.8", port=53, timeout=3):
    """
    检测是否能连接到互联网

    参数说明:
        host: 目标主机IP地址(默认使用Google的DNS服务器 8.8.8.8)
        port: 目标端口(53是DNS服务的标准端口)
        timeout: 超时时间(秒)

    返回值:
        True: 网络连接正常
        False: 网络连接失败

    工作原理:
        尝试创建一个socket连接到指定的服务器
        如果能连接成功,说明网络是通的
    """
    try:
        # 创建一个socket对象
        # AF_INET表示IPv4地址
        # SOCK_STREAM表示TCP协议
        socket.setdefaulttimeout(timeout)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 尝试连接到目标主机的指定端口
        sock.connect((host, port))

        # 连接成功,关闭socket
        sock.close()

        return True

    except socket.error as e:
        # 连接失败,说明网络不通
        print(f"连接失败:{e}")
        return False

def get_local_ip():
    """
    获取本机的IP地址

    工作原理:
        创建一个UDP socket,连接到外部地址(不会真正发送数据)
        通过这个socket获取本机的IP地址
    """
    try:
        # 创建UDP socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        # 连接到一个外部地址(这里不会真正发送数据)
        # 使用Google的DNS服务器地址
        sock.connect(("8.8.8.8", 80))

        # 获取本机的IP地址
        local_ip = sock.getsockname()[0]

        sock.close()
        return local_ip

    except Exception as e:
        return "无法获取IP地址"

def get_hostname():
    """
    获取计算机的主机名
    """
    try:
        return socket.gethostname()
    except Exception as e:
        return "未知主机名"

def main():
    """
    主函数:执行网络检测并显示结果
    """
    print("=" * 50)
    print("网络连接检测工具".center(50))
    print("=" * 50)
    print()

    # 获取主机名
    hostname = get_hostname()
    print(f"📌 主机名: {hostname}")

    # 获取本机IP地址
    local_ip = get_local_ip()
    print(f"📍 本机IP地址: {local_ip}")
    print()

    # 检测网络连接
    print("🔍 正在检测网络连接...")

    # 测试多个服务器
    test_servers = [
        ("8.8.8.8", "Google DNS"),
        ("114.114.114.114", "国内DNS"),
        ("1.1.1.1", "Cloudflare DNS")
    ]

    connected = False
    for ip, name in test_servers:
        print(f"   测试连接到 {name} ({ip})...", end=" ")
        if check_internet_connection(ip):
            print("✅ 成功")
            connected = True
        else:
            print("❌ 失败")

    print()
    if connected:
        print("🎉 网络连接正常!")
        print("💡 这意味着你的电脑可以访问互联网上的其他计算机。")
    else:
        print("⚠️  网络连接异常!")
        print("💡 请检查:")
        print("   1. 网线是否插好?")
        print("   2. WiFi是否连接?")
        print("   3. 路由器是否正常工作?")

    print()
    print("=" * 50)

if __name__ == "__main__":
    main()

运行程序

cd code/day01
python day01_network_checker.py

预期输出

==================================================
                网络连接检测工具
==================================================

📌 主机名: linzhibin-MacBook
📍 本机IP地址: 192.168.1.100

🔍 正在检测网络连接...
   测试连接到 Google DNS (8.8.8.8)... ✅ 成功
   测试连接到 国内DNS (114.114.114.114)... ✅ 成功
   测试连接到 Cloudflare DNS (1.1.1.1)... ✅ 成功

🎉 网络连接正常!
💡 这意味着你的电脑可以访问互联网上的其他计算机。

==================================================

🔍 代码详解

Socket是什么?

Socket(套接字)是网络编程的基础,可以理解为:

Socket = 电话机

建立连接   →  拨号
发送数据   →  说话
接收数据   →  听对方说话
关闭连接   →  挂断电话

为什么用8.8.8.8?

  • 8.8.8.8 是Google提供的公共DNS服务器
  • 它几乎24小时在线,非常稳定
  • 如果能连接到它,说明网络是通的

AF_INET 和 SOCK_STREAM 是什么?

socket.AF_INET       # 使用IPv4地址
socket.AF_INET6      # 使用IPv6地址

socket.SOCK_STREAM   # TCP协议(可靠传输)
socket.SOCK_DGRAM    # UDP协议(快速传输)

🎓 知识小结

今天学到了什么?

  1. ✅ 计算机网络是连接多台计算机的系统
  2. ✅ 网络由计算机、通信线路和协议组成
  3. ✅ Socket是网络编程的基础工具
  4. ✅ 可以通过连接DNS服务器来检测网络状态

重要概念

概念解释比喻
计算机网络多台计算机互联的系统快递网络
Socket网络编程接口电话机
IP地址计算机在网络中的地址家庭住址
端口应用程序的标识号门牌号

💪 练习题

练习1:修改代码

修改程序,让它可以检测连接到百度服务器(220.181.38.148)

练习2:思考题

  1. 为什么我们使用DNS服务器(端口53)而不是HTTP服务器(端口80)来测试?
  2. 本机IP地址和互联网IP地址有什么区别?

练习3:扩展功能

尝试添加功能:显示连接到目标服务器所需的时间(提示:使用time模块)

📚 扩展阅读

  • IP地址是什么?(明天会详细讲解)
  • DNS是什么?(第15天会详细讲解)
  • TCP和UDP有什么区别?(第36天会详细讲解)

🎯 明天预告

第2天:网络的分类和拓扑结构

我们将学习:

  • LAN、WAN、MAN是什么?
  • 网络拓扑结构有哪些?
  • 如何绘制网络拓扑图?

💡 今日金句:万丈高楼平地起,网络学习第一步!

👉 返回目录 | 下一天:网络的分类和拓扑结构