返回所有文章

计算机网络基础:从一次网页访问开始

从 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 指令 / 网页源码 / 系统命令,可能会执行错误的行为。
这就引入了一个安全概念:

信任边界

简单理解就是:

数据从”不可信区域“进入”可信区域“的位置。

写下来,是为了更好地理解。
— 木之风

继续阅读 · 渗透学习

渗透测试学习笔记:从基础到实践

↑