计算机网络基础:从一次网页访问开始
从 IP、端口、TCP 到 HTTP、Cookie 与信任边界,梳理学习 Web 安全前需要理解的网络基础。
整理自个人 Notion 笔记 · 原笔记更新于
文章目录 22 个章节
第一课:一台电脑怎么找到另一台电脑?
假设你访问一个网站:
https://example.com
背后大致发生的是:
你的电脑访问这个网站 —> DNS:这个域名是哪台服务器? —> 得到服务器 IP —> 连接服务器的某个端口 —> 建立 TCP 连接 —> 发送 HTTP / HTTPS 请求 —> 服务器返回网页。
IP 和 端口
IP 是电脑在网络中的 “地址”,例如
192.168.1.10
就是一个 IPv4 地址
一台服务器通常只有一个IP,但是可能会有很多功能,怎么区分这些功能?
靠端口。例如常见的端口地址
| 服务 | 常见端口 |
| HTTP | 80 |
| HTTPS | 443 |
| SSH | 22 |
| FTP | 21 |
| MySQL | 3306 |
| PostgreSQL | 5432 |
| DNS | 53 |
IP 告诉你目标在哪,端口告诉你开放了哪些服务。
TCP
IP + 端口,解决了 ”找谁“ , ”找哪个程序“ 的问题。那么接下来还有个问题
数据怎么传输?
TCP,传输控制协议,有三个核心特征:
- 面向连接
- 可靠传输
- 有顺序
TCP 三次握手
当客户端想要和服务器连接:
客户端 服务器
SYN //客户端发送建立连接请求
------------------------>
SYN + ACK //服务器向客户端回传收到请求
<------------------------
ACK //客户端收到回传请求,开始通信
------------------------>
连接建立
其中 SYN、ACK 是TCP Header 里面的 Flags(标志位)
| Flag | 含义 |
| SYN | 建立连接 |
| ACK | 确认 |
| FIN | 正常断开连接 |
| RST | 强制断开 |
| PSH | 尽快把数据交给应用 |
| URG | 紧急数据 |
TCP 四次挥手
TCP 断开连接的时候:
客户端 服务器
FIN //客户端发送完毕,发送断开连接的请求
------------------------>
ACK //服务端确认请求,回传
<------------------------
FIN//服务端允许正常断开连接
<------------------------
ACK //客户端确认信息,断开连接
------------------------>
TCP 还有两个重要的的东西
Sequence Number ---SEQ
Acknowledgment Number ---ACK
假设客户端发送:
SEQ = 100
数据长度 = 50
服务器收到后可能回复:
ACk = 150
意思类似于:
前面的数据收到了,下一段从 150 开始给我。
实际上 TCP 就是靠:SEQ + ACK 来实现:
- 数据排序
- 丢包重传
- 可靠运输
HTTP
TCP 解决了,如何把数据可靠的传过去。但是双方到底发送什么内容呢?Web 世界里通常使用 HTTP。
比如你浏览:
http://example.com
浏览器可能发送:
GET /index.html HTTP/1.1 //向服务器请求 /html
Host: example.com
User-Agent: Mozilla/5.0
服务器可能返回:
HttP/1.1 200 OK
Content Type: text/html
<html>
<h1>Hello</h1>
</html>
第二课:DNS、内网 IP、公网 IP、Ping
为什么我们平时访问一个网站,输入的是:
www.baidu.com
而不是直接输入 IP 地址呢?
“域名更容易记”,但是计算机真正通信的时候,则需要:IP地址,于是就需要 DNS。
DNS
Domain Name System,核心作用就是把域名映射成IP地址
Windows 查询DNS:
nslookup baidu.com
内网 IP
大多为私有 IP,主要有三大范围
//第一类
10.0.0.0/8 //前八位固定
//第二类
172.16.0.0
~
172.31.255.255
/第三类
192.168.0.0
~
192.168.255.255
外部互联网无法直接通过内网 IP 对内网计算机进行访问。
公网 IP
互联网
|
|
公网 IP
203.x.x.x
|
路由器
|
-----------------
| | |
电脑 手机 平板
192.168.1.10
192.168.1.11
192.168.1.12
公网 IP 负责面对互联网,内网 IP 负责内部设备之间的通信。
NAT
IPV4 地址不够用,32位地址最多 2 的 32 次方个地址,无法满足全球所有网络设备的需求,所以出现了一种重要技术:NAT
全称:Network Address Translation 网络地址转换
NAT 什么作用?
电脑 192.168.1.10
手机 192.168.1.11
平板 192.168.1.12
↓
路由器
↓ NAT
203.xxx.xxx.xxx
三台设备共享一个公网地址访问互联网。
Default Gateway
例如:
IPv4 Address:
192.168.1.10
Default Gateway:
192.168.1.1
Gateway 就是:网关
当你要离开当前局域网时候,你要先经过谁,通常是路由器,也就是说
你的电脑
192.168.1.10
↓
网关
192.168.1.1
↓
互联网
Ping
Ping是用来测试:
网络是否可达、延迟多高、有没有丢包
Ping 用的不是 TCP,而是 ICMP,全称 Internet Control Message Protocol。Ping 最核心的两个 ICMP 消息是:
Echo Request
Echo Reply
过程就是:
你的电脑 目标机器
ICMP Echo Request
--------------------------->
Echo Reply
<---------------------------
我们 Ping 一次百度域名 baidu.com 测试一下
来自 110.242.74.102 的回复: 字节=32 时间=61ms TTL=50
这里的:
- 字节 = 32 表示 Ping 携带了 32 字节的数据
- 时间 = 61ms 指的是往返时延 RTT
- TTL = 50 指的是,以恶数据包最多允许经过多少个路由器,每经过一个路由器,该值减 1,直到减为 0,路由器就会把这个包丢掉。
- 这是为了防止数据包因为网络配置错误,在互联网中无限循环。
第三课:端口、服务、Socket
什么叫端口开放?
例如,一个服务器:
192.168.1.20
上面运行了一个 Web 服务,它监听 80 端口,那么可以理解为
192.168.1.20:80
这个地址上有程序在等别人连接,这就叫:80 端口开放。端口开放的本质就是:某个程序绑定了这个端口,并且在监听连接。
Socket
Socket 可以理解为,程序连接网络的“插座”。
程序
↓
Socket
↓
网络
程序通过 Socket,让操作系统帮它发送和接收网络数据。
一个Socket通常包括
IP + 端口 + 协议,例如:
192.168.1.20
80
TCP
可以理解为某个网络通信的端点。
当你浏览网站:
你的电脑 Web服务器
192.168.1.10 192.168.1.20
随机端口 52341 --------> 80端口
客户端通常会随机的给操作系统临时分配一个随机高位端口,这些端口与网站之间建立TCP连接,操作系统通过这些返回的信息,确定返回的数据应该交给哪个程序。
TCP 和 UDP
TCP 和 UDP 是网络里非常核心的两种传输方式。
最简单的区别就是:
TCP = 先建立连接,再可靠传输
UDP = 不建立连接,直接发送
第四课:TCP-IP 分层 + 数据包 + Wireshark
TCP/ IP 模型
作为初学者,先了解四层
| 层 | 常见协议/东西 | 作用 |
| 应用层 | HTTP、DNS、SSH | 程序具体说什么 |
| 传输层 | TCP、UDP | 怎么传 |
| 网络层 | IP、ICMP | 数据发到哪台机器 |
| 网络接口层 | Ethernet、Wi-Fi | 真正怎么从网卡发出去 |
举个完整例子
你打开:
http://192.168.1.20/
浏览器产生:
GET / HTTP/1.1
Host: 192.168.1.20
这是应用层
然后 TCP 会处理:
源端口
目标端口
序列号
确认号
各种标志位
这是运输层
然后IP 再加:
源 IP
目标 IP
这是网络层
再交给网卡,所以可以画成:
HTTP 数据
↓ 加 TCP 头
TCP + HTTP
↓ 加 IP 头
IP + TCP + HTTP
↓ 再加链路层信息
Ethernet + IP + TCP + HTTP
这叫封装。
什么是”数据包“?
数据包是,粗略的可以理解为:
网络上传输的一块数据。
比如一个数据包里面可能包括:
目标 MAC
源 MAC
目标 IP
源 IP
目标端口
源端口
TCP 标志位
HTTP 内容
MAC 是网卡里的一个表示,不同于 IP 地址,IP 地址我跨网络寻址,而 MAC 主要用于局域网的数据交付。
ARP 是干嘛的?
比如你的电脑知道:
我要访问: 192.168.1.20
但是局域网底层通信的时候,还需要知道:
192.168.1.20 对应哪个 MAC?
这个时候就会使用 ARP (Address Resolution Protocol)
小结:
DNS: 域名 -> IP
ARP: IP -> MAC
第六课:HTTP深入 — GET、POST、Header、Cookie、Session、状态码
HTTP请求长啥样?
比如你访问:
http://example.com/login
浏览器可能发送:
GET /login HTTP/1.1 //请求方法 路径 HTTP版本
Host: example.com //域名
User-Agent: Mozilla/5.0 //请求头
Accept: text/html
Cookie: session=abc123
GET 是什么?
GET 通常表示,我要获取资源,比如
GET /index.html HTTP/1.1
就是,我要 /index.html
又比如:
GET /user?id=1001 HTTP/1.1
这里的 id = 1001 是查询参数,完整的 URL 通常是:
http://example.com/user?id=1001
其中 /user 是路径,id = 1001 是参数,参数是很重要的输入点。
POST 是什么?
POST 通常用于:
把数据提交给服务器
比如登录:
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
username=alice&password=123456
这里:
username=alice
password=123456
直接放在请求体里。
和 GET 最大的表面区别之一就是:
GET 参数常出现在 URL
POST 数据常放在 Body
但是密码放在 POST 里,并不等于别人看不到,也就不等于安全。
真正负责传输加密的是:
HTTP / TLS
而不是 POST 本身。
HEADER 是什么?
Header 就是:
请求头 / 响应头
可以理解为:
HTTP 数据附带的说明信息。
常见的请求头:
Host: example.com
User-Agent: Mozilla/5.0
Cookie: session=abc123
Content-Type: application/json
Authorization: Bearer xxxxx
HOST
HOST 告诉服务器,我想上哪个网站。
同一个 IP 上可能运行很多个网站。
User-Agent
User-Agent 告诉服务器:
我是什么客户端
例如:
Chrome
Firefox
手机浏览器
curl
某个脚本
服务可能根据 User-Agent 返回不同内容。
但是注意:
User-Agent 是客户端自己发的,可以伪造。所以不能当作可靠的身份认证依据。
Content-Type
它告诉服务器:
请求体里的数据是什么格式
例如表单:
Content-Type: application/x-www-form-urlencoded
//body
username=alice&password=123
JSON:
Content-Type application/json
//body
{
"username":"Alice",
"password":"123"
}
Cookie
假如你登录:
username = alice
password = 正确密码
服务器确认你身份后,可能返回
Set-Cookie: session=abc123
浏览器保存:
session=ab123
然后再次请求:
GET /profile HTTP/1.1
Cookie: session=abc123
服务器就知道:这个请求来自刚刚登录的 Alice
Cookie 不一定等于 Session
Cookie:数据保存在客户端浏览器;Session:通常是服务器维护的会话状态。
常见的一种模式就是:
浏览器
Cookie:
session_id=A7F92X
↓
服务器
A7F92X → 用户 Alice
Cookie 常见安全属性
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax
其中:
HttpOnly,表示 JavaScript 通常不能直接读取这个 Cookie,有助于降低某些 XSS 导致 Cookie 被直接窃取的风险。
Secure,表示这个Cookie 只能通过 HTTPS 发送。
SameSite,主要帮助控制跨站请求时 Cookie 是否发送.
HTTP Response
服务器收到请求后,会返回响应,例如:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 100
<html>
...
</html>
他也有:
- 状态行
- Header
- Body
拆解URL
比如:
https://example.com:443/user?id=1001#info
可以拆成:
https
↓
协议
example.com
↓
域名
443
↓
端口
/user
↓
路径
?id=1001
↓
查询参数
#info
↓
Fragment / 片段
第七课:输入、参数、信任边界
WEB 安全里面,最危险的往往不是”代码“,而是程序错误的相信了用户输入。
比如一个网站收到:
username=alice
这很正常。
但是如果程序把永不输入直接拼进:
数据库查询
HTML 页面
系统命令
文件路径
就可能产生不同类型的漏洞。
最常见的三类:
输入进入 SQL
→ SQL 注入
输入进入 HTML / JavaScript
→ XSS
输入进入系统命令
→ 命令注入
程序把输入直接拼入 SQL 指令 / 网页源码 / 系统命令,可能会执行错误的行为。
这就引入了一个安全概念:
信任边界
简单理解就是:
数据从”不可信区域“进入”可信区域“的位置。
写下来,是为了更好地理解。
— 木之风