CC++ & Algorithm

计算机网络与Internet基本概念

困难0
语言版本:C++
概述:网络就像邮局,让计算机之间互相发信。Internet是全世界所有邮局的连接。

计算机网络与Internet:就像寄信一样简单

计算机网络就是让多台计算机互相“说话”的系统。想象一下,你想给远方的朋友寄一封信:你需要写上对方的地址(IP地址),把信纸叠好放进信封(数据包),交给邮局(路由器),邮局根据地址一步步送到朋友家。Internet(因特网)就是全世界所有邮局和信路连成的巨大网络,地球上任何两台计算机都可以通过它通信。

你每天上网看视频、发消息、刷朋友圈,背后都依赖这个“网络邮局”。下面我们拆解几个关键概念。


1. 什么是计算机网络?—— 学校里的“传纸条”系统

假如你在教室最后一排,想让第一排的同学传一个纸条给你。你需要:

  • 在纸条上写清楚接收人的名字(目标地址
  • 交给旁边的同学(节点
  • 旁边的同学再传给前一个同学(路由
  • 直到纸条到达第一排的同学手里(目的地

计算机网络就是这个过程的电子版。计算机之间通过网线Wi-Fi连接,数据以电信号光信号在链路里跑。常见的网络有:

  • 局域网:你家里的几台设备互相连接(比如电脑、手机、打印机)
  • 广域网:不同城市甚至不同国家的网络连在一起,比如Internet

2. IP地址和域名 —— 门牌号与联系人姓名

IP地址就像你家的门牌号,用于唯一标识网络中的一台设备。IPv4地址长这样:192.168.1.1(四组0~255的数字)。计算机之间通信时必须知道对方的IP地址。

但是人类记数字很麻烦,所以发明了域名——好记的名字,比如 www.baidu.comwww.qq.com。当你在浏览器输入域名时,计算机会向一个叫DNS(域名系统)的“电话本”服务器查询,得到对应的IP地址,然后才能找到那台服务器。

生活例子:你想给朋友打电话,手机通讯录里存的是“小明”(域名),手机自动查通讯录找出他的电话号码(IP地址)并呼叫。


3. 数据是如何传输的?—— 拆成小包裹,接力送达

你发一封1MB的邮件,网络并不会直接把整个大文件扔出去,而是把它切成很多数据包(每个包大约1500字节),就像把一大箱行李拆成多个小包裹。每个包裹都写上:

  • 源IP(你的地址)
  • 目标IP(收件人地址)
  • 顺序编号
  • 校验信息(防止数据损坏)

然后这些包裹分别通过路由器(就像各个城市的邮件分拣中心)选择最佳路径发送。有的包可能走不同路线,最后在收件人计算机上重新组装成完整文件。如果某个包丢失了,收件人会要求重新发送那个包。


4. HTTP协议 —— 写信的格式规则

当你用浏览器访问网站时,你和服务器之间需要约定一种“用什么语言写、怎么开头、怎么结尾”的规则,这种规则就是HTTP(超文本传输协议)。它规定了请求和响应的格式。

想象你给商店写信买零食:

  • 你写:“我要买一包薯片,价格5元,请发货。 ——你的名字”(HTTP请求)
  • 商店回信:“好,薯片已发货,价格5元。 ——商店”(HTTP响应)

HTTP请求中常用“动作”有:

  • GET:获取网页内容(像“我想看看商品页面”)
  • POST:提交数据(像“我下订单了”)

浏览器地址栏以 http:// 开头的网址都使用HTTP协议(安全版本是https://,多了加密功能)。


5. 动手用Python发送网络请求 —— 模拟“寄信”

Python内置的urllib.request模块可以让我们像浏览器一样请求网页。下面代码演示了如何访问百度首页并打印部分内容。

import urllib.request  # 导入网络请求工具

# 定义目标网址(一定要带 http:// 或 https://)
target_url = "http://www.baidu.com"

# 发送请求,就像把信投进邮局
# urlopen() 会返回一个响应对象,里面包含服务器返回的所有数据
response = urllib.request.urlopen(target_url)

# 读取响应内容(返回的是字节串,需要解码为文本)
# 通常网页用 utf-8 编码
page_content = response.read().decode("utf-8")

# 只打印前500个字符,避免刷屏
print("收到的百度首页前500个字符:")
print(page_content[:500])

运行说明

  • 确保你的电脑能上网。
  • 如果出现 URLError,可能是网址写错或网络不通。
  • 返回的内容是HTML代码(网页的原始语言),你看到的是百度的源码,而不是漂亮页面。

新手容易犯的错误

  1. 忘记写协议头
    url = "www.baidu.com" 是不对的,必须写成 "http://www.baidu.com""https://www.baidu.com"。没有协议头,Python不知道用哪种方式通信。

  2. 域名拼写错误
    比如写成 "ww.baidu.com""baidu.cm",DNS查不到IP地址,会报错 [Errno -2] Name or service not known

  3. 忘记解码
    response.read() 返回的是字节串(b'...'),如果不加 .decode("utf-8"),打印出来会是一堆乱码或b开头的东西。

  4. 网络超时
    如果请求的网站太慢或你网络不好,程序可能长时间卡住。可以设置超时时间:

    response = urllib.request.urlopen(target_url, timeout=5)
    
  5. 权限问题(防火墙)
    在学校或公司网络里,有时防火墙会阻止非浏览器的请求,可以尝试用 https:// 或者更换网址。


完整可运行的示例:带错误处理和状态码

为了更健壮,我们可以捕获可能的错误,并打印服务器返回的状态码(比如200表示成功,404表示网页不存在)。

import urllib.request

target_url = "https://www.baidu.com"  # 目标网址,带协议头

try:
    # 发送请求,设置超时5秒
    response = urllib.request.urlopen(target_url, timeout=5)
    
    # 打印状态码(200表示成功)
    print("HTTP状态码:", response.status)
    
    # 读取并解码
    page_content = response.read().decode("utf-8")
    print("成功收到网页,内容长度:", len(page_content))
    print("前200个字符预览:")
    print(page_content[:200])

except urllib.error.HTTPError as e:
    print("服务器返回错误,状态码:", e.code)
except urllib.error.URLError as e:
    print("无法连接到服务器,原因:", e.reason)
except Exception as e:
    print("其他错误:", e)

接下来学什么?

  • TCP/IP协议:理解数据包如何可靠传输(就像快递有回执)
  • Socket编程:让你自己编写能互相聊天的程序
  • 爬虫入门:用requests库更方便地获取网页数据
  • 网络安全:了解https如何加密信息,保护你的密码

计算机网络是编程世界的基石,掌握它,你就能理解“信息时代”为什么能一秒传遍全球。继续加油!

例题精讲

1单选题

以下哪种网络覆盖范围最大?

A局域网(LAN)
B城域网(MAN)
C广域网(WAN)
D个人区域网(PAN)
2单选题

IPv4地址由多少位二进制数组成?

A16位
B32位
C64位
D128位
3判断题

HTTP协议是用于Web浏览器和Web服务器之间传输网页的协议。

4填空题
def is_valid_ip(s):
    parts = s.split('.')
    if len(parts) != 4:
        return False
    for part in parts:
        if not part.isdigit() or int(part) < 0 or int(part) > 255:
            return ___
    return True
5填空题
def is_http(url):
    return url.___("http://")