计算机网络与Internet基本概念
困难0计算机网络与Internet:就像寄信一样简单
计算机网络就是让多台计算机互相“说话”的系统。想象一下,你想给远方的朋友寄一封信:你需要写上对方的地址(IP地址),把信纸叠好放进信封(数据包),交给邮局(路由器),邮局根据地址一步步送到朋友家。Internet(因特网)就是全世界所有邮局和信路连成的巨大网络,地球上任何两台计算机都可以通过它通信。
你每天上网看视频、发消息、刷朋友圈,背后都依赖这个“网络邮局”。下面我们拆解几个关键概念。
1. 什么是计算机网络?—— 学校里的“传纸条”系统
假如你在教室最后一排,想让第一排的同学传一个纸条给你。你需要:
- 在纸条上写清楚接收人的名字(目标地址)
- 交给旁边的同学(节点)
- 旁边的同学再传给前一个同学(路由)
- 直到纸条到达第一排的同学手里(目的地)
计算机网络就是这个过程的电子版。计算机之间通过网线或Wi-Fi连接,数据以电信号或光信号在链路里跑。常见的网络有:
- 局域网:你家里的几台设备互相连接(比如电脑、手机、打印机)
- 广域网:不同城市甚至不同国家的网络连在一起,比如Internet
2. IP地址和域名 —— 门牌号与联系人姓名
IP地址就像你家的门牌号,用于唯一标识网络中的一台设备。IPv4地址长这样:192.168.1.1(四组0~255的数字)。计算机之间通信时必须知道对方的IP地址。
但是人类记数字很麻烦,所以发明了域名——好记的名字,比如 www.baidu.com、www.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代码(网页的原始语言),你看到的是百度的源码,而不是漂亮页面。
新手容易犯的错误
-
忘记写协议头
url = "www.baidu.com"是不对的,必须写成"http://www.baidu.com"或"https://www.baidu.com"。没有协议头,Python不知道用哪种方式通信。 -
域名拼写错误
比如写成"ww.baidu.com"或"baidu.cm",DNS查不到IP地址,会报错[Errno -2] Name or service not known。 -
忘记解码
response.read()返回的是字节串(b'...'),如果不加.decode("utf-8"),打印出来会是一堆乱码或b开头的东西。 -
网络超时
如果请求的网站太慢或你网络不好,程序可能长时间卡住。可以设置超时时间:response = urllib.request.urlopen(target_url, timeout=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如何加密信息,保护你的密码
计算机网络是编程世界的基石,掌握它,你就能理解“信息时代”为什么能一秒传遍全球。继续加油!
例题精讲
以下哪种网络覆盖范围最大?
IPv4地址由多少位二进制数组成?
HTTP协议是用于Web浏览器和Web服务器之间传输网页的协议。
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 Truedef is_http(url):
return url.___("http://")