day35 网络协议与数据封装
数据封装与协议结构
以太网MAC帧格式
数据封装与传输流程
数据在传输过程中,从上层逐层封装到底层,最终通过物理介质发送。封装与传输的具体流程如下:
封装过程(从IP层到物理层)
- IP层:IP数据报作为上层数据传递至MAC层
- MAC层封装:
- 目的地址(6字节):接收设备的物理地址(MAC地址)
- 源地址(6字节):发送设备的物理地址(MAC地址)
- 类型(2字节):标识上层协议类型,例如
0x0800
表示承载的是IP协议数据 - 数据(46–1500字节):实际承载的上层协议数据(如IP数据报),若不足46字节,则需填充至最小长度
- FCS(4字节):帧检验序列(Frame Check Sequence),用于差错检测
- 物理层封装:
- 前导码(8字节):
- 前7字节为前同步码,比特模式为
10101010
交替,用于接收方时钟同步 - 第8字节为帧开始定界符(SFD),比特模式为
10101011
,表示帧的开始
- 前7字节为前同步码,比特模式为
- 前导码(8字节):
MTU说明:以太网帧中"数据"部分的最大传输单元(MTU)为 1500字节。
解封装过程(从物理层到IP层)
接收端按照相反顺序进行解封装,从物理层开始逐层去除头部信息,最终将数据交付给上层应用。
协议封装层次
数据在发送端自上而下逐层封装,接收端则自下而上解封装:
应用层数据 → TCP/UDP头 → IP头 → MAC帧 → 物理层前导码| | | |
"Hello" 传输层 网络层 接口层
IP数据报首部
核心特性
- 固定长度:20字节(不含选项字段)
- 关键字段详解:
字段 | 描述 |
---|---|
版本(4位) | 指明IP协议版本,IPv4为4,IPv6为6,通信双方必须一致 |
首部长度(IHL,4位) | 以32位(4字节)为单位,最小值为5(即20字节),最大值为15(60字节)。当包含选项时长度可变 |
区分服务(DS,8位) | 原称"服务类型",现用于QoS(服务质量)控制,如优先级、延迟、吞吐量等 |
总长度(16位) | 整个IP数据报的长度(首部 + 数据),单位为字节,最大值为65535字节 |
标识(16位) | 每产生一个数据报,该计数器加1;分片时所有片段共享同一标识,以便重组 |
标志(3位) | 包含两个有效位: - DF (Don’t Fragment):禁止分片- MF (More Fragments):还有更多分片(MF=0表示最后一片) |
片偏移(13位) | 分片后该片在原始数据报中的位置,单位为8字节(64位),保证分片按序重组 |
生存时间(TTL,8位) | 数据报在网络中的存活时间,每经过一个路由器减1,为0时被丢弃,防止无限循环 |
协议(8位) | 指明上层协议类型,常见值: - 6 :TCP- 17 :UDP- 1 :ICMP |
首部校验和(16位) | 仅校验IP首部,不包含数据部分。每次经过路由器需重新计算 |
源IP地址(32位) | 发送方的IP地址 |
目的IP地址(32位) | 接收方的IP地址 |
注意:IP是无连接、不可靠的服务,依赖上层(如TCP)实现可靠性。
TCP首部格式
核心特性
- 固定长度:20字节(可选字段扩展至最多60字节)
- 关键字段:
字段 | 描述 |
---|---|
源/目的端口(各16位) | 标识通信的应用进程 |
序列号(32位) | 当前报文段第一个字节的序号,用于保证数据有序传输 |
确认号(32位) | 期望收到的下一个字节的序号,表示该序号之前的数据已正确接收 |
数据偏移(4位) | TCP首部长度,以4字节为单位,最小为5(20字节),最大为15(60字节) |
保留(6位) | 保留字段,置0 |
标志位(6位) | 控制连接状态的关键标志: - URG :紧急指针有效- ACK :确认号有效- PSH :要求接收方立即交付给应用层- RST :重置连接- SYN :同步序列号,用于建立连接- FIN :请求关闭连接 |
窗口大小(16位) | 接收方当前接收缓冲区剩余容量,用于流量控制 |
校验和(16位) | 覆盖TCP首部、数据及伪首部,确保传输完整性 |
紧急指针(16位) | 与URG配合使用,指出紧急数据的末尾位置 |
发送缓冲区划分
[已发送且已确认] → [已发送未确认] → [待发送]
- 通过超时重传机制确保可靠传输
- 只有收到ACK后,已发送未确认区域才能向前滑动
关键标志位
标志位 | 作用 |
---|---|
SYN | 连接建立请求(同步序列号) |
ACK | 确认应答(确认号有效) |
FIN | 连接终止请求 |
RST | 异常中断或拒绝连接 |
PSH | 推送数据,要求立即处理 |
UDP首部格式
核心特性
- 固定长度:8字节
- 字段说明:
字段 | 描述 |
---|---|
源端口(16位) | 发送方端口号,可选 |
目的端口(16位) | 接收方端口号,必须指定 |
长度(16位) | UDP数据报总长度(首部 + 数据),最小为8字节,最大为65535字节 |
校验和(16位) | 可选,用于差错检测;若未启用则为0。包含伪首部、UDP首部和数据 |
特点总结:
- 无连接(无需握手)
- 不保证可靠传输(无确认、无重传)
- 开销小(仅8字节首部)
- 适用于实时性要求高的场景(如音视频流、DNS查询)
网络诊断工具集
远程连接工具
# 使用telnet连接指定IP和端口(默认端口23)
telnet 192.168.1.1 8888 # 连接到192.168.1.1的8888端口
功能说明:测试目标主机某端口是否开放并可通信。
理想输出:
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
网络状态监控
# 查看所有网络连接(包括进程信息)
netstat -anp
功能说明:显示所有网络连接、监听端口及对应进程
典型输出:
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1234/python3
表示PID为1234的Python程序正在监听8888端口。
# 仅查看TCP连接
netstat -n -t
功能说明:显示所有TCP连接状态
典型输出:
tcp 0 0 192.168.1.100:50000 192.168.0.183:80 ESTABLISHED
# 仅查看UDP连接
netstat -n -u
功能说明:显示所有UDP连接状态
典型输出:
udp 0 0 0.0.0.0:68 0.0.0.0:*
# 查看特定端口监听情况
netstat -lnp | grep 8888
功能说明:检查特定端口是否被监听及对应进程
典型输出:
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1234/python3
网络连通性测试
# 测试与指定IP的连通性
ping 192.168.1.1
功能说明:使用ICMP协议检测目标主机是否可达
理想输出:
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.2 ms
# 测试域名解析及连通性
ping www.baidu.com
功能说明:测试DNS解析和网络连通性
理想输出:
64 bytes from 110.242.68.66: icmp_seq=1 ttl=55 time=28.3 ms
ARP表管理
# 查看ARP缓存表(IP与MAC地址映射)
arp -an
功能说明:显示本地ARP缓存中的IP地址与MAC地址映射关系
典型输出:
? (192.168.1.100) at 00:1a:2b:3c:4d:5e [ether] on eth0
# 删除指定IP的ARP缓存条目
arp -d 192.168.1.100
功能说明:清除特定IP地址的ARP缓存,解决IP-MAC映射问题
理想输出:
(192.168.1.100) deleted
流量抓包分析
Wireshark过滤示例
tcp.port == 50000 && ip.addr == 192.168.0.183
抓取目标或源端口为50000,且IP地址为192.168.0.183的数据包。
tcpdump高级过滤命令
# 按源IP过滤
tcpdump 'ip.src == 192.168.1.100'
功能说明:捕获来自特定IP的所有数据包
理想输出:
12:30:45.123456 IP 192.168.1.100.50000 > 192.168.0.183.80: Flags [S], seq 12345
# 按目的端口过滤
tcpdump 'tcp.dstport == 9999'
功能说明:捕获发送到特定端口的所有数据包
理想输出:
12:31:22.678901 IP 192.168.1.100.50001 > 192.168.0.183.9999: Flags [P.], seq 12345:12400
# 组合条件:源IP为192.168.1.100 且 目的端口为9999
tcpdump 'ip.src == 192.168.1.100 and tcp.dstport == 9999'
功能说明:使用逻辑AND组合多个过滤条件
理想输出:
12:32:15.234567 IP 192.168.1.100.50002 > 192.168.0.183.9999: Flags [S], seq 12346
# 组合条件:源IP为192.168.1.100 或 目的IP为192.168.1.102
tcpdump 'ip.src == 192.168.1.100 or ip.dst == 192.168.1.102'
功能说明:使用逻辑OR组合多个过滤条件
理想输出:
12:33:08.765432 IP 192.168.1.100.50003 > 192.168.1.102.80: Flags [P.], seq 12347:12450
环境配置建议:
# 禁用防火墙(避免干扰抓包) sudo ufw disable# 安装SSH服务(支持远程登录) sudo apt-get install openssh-server openssh-client# 安装Wireshark(图形化抓包工具) sudo apt-get install wireshark
tcpdump 使用补充说明
# 在默认网卡上抓包(显示简要信息)
tcpdump -n
功能说明:捕获所有网络接口的流量,以数字形式显示IP和端口
理想输出:
12:35:45.123456 IP 192.168.1.100.50000 > 192.168.0.183.80: Flags [S], seq 12345
# 根据源或目的IP抓包
tcpdump -n src 192.168.1.100
tcpdump -n dst 192.168.1.100
功能说明:分别捕获指定IP作为源或目的的数据包
理想输出:
12:36:22.678901 IP 192.168.1.100.50001 > 192.168.0.183.80: Flags [P.], seq 12345:12400
# 抓取指定IP的所有收发包并输出十六进制
sudo tcpdump -n -x src or dst 192.168.0.130
功能说明:捕获指定IP的所有流量并以十六进制格式显示
理想输出:
12:37:15.234567 IP 192.168.0.130.50002 > 192.168.1.100.80: Flags [S], seq 123460x0000: 4500 003c 1234 4000 4006 0000 c0a8 00820x0010: c0a8 0164 0050 0089 0000 3039 0000 0000
# 将抓包内容保存到文件
tcpdump -n -x src 192.168.1.100 > xxx.log
功能说明:将抓包结果保存到文件以便后续分析
操作结果:生成包含原始数据包的xxx.log文件
# 按端口过滤
tcpdump -n src port 80
tcpdump -n dst port 80
tcpdump -n port 80
功能说明:分别捕获源端口、目的端口或任意方向端口为80的流量
理想输出:
12:38:08.765432 IP 192.168.1.100.50003 > 192.168.0.183.80: Flags [P.], seq 12347:12450
# 按协议过滤
tcpdump -n proto icmp
tcpdump -n proto tcp
tcpdump -n proto udp
功能说明:分别捕获指定协议类型的数据包
理想输出:
12:39:01.234567 IP 192.168.1.100 > 192.168.1.1: ICMP echo request
# 指定网络接口抓包
tcpdump -n -i eth0
tcpdump -n -i lo # 本地回环接口
功能说明:在特定网络接口上捕获流量
理想输出:
12:40:15.678901 IP 127.0.0.1.50004 > 127.0.0.1.8080: Flags [S], seq 12348
# 组合条件(and/or)
tcpdump 'ip.src == 192.168.1.100 and tcp.dstport == 9999'
tcpdump 'ip.src == 192.168.1.100 or ip.dst == 192.168.1.102'
功能说明:使用逻辑运算符组合多个过滤条件
理想输出:
12:41:22.345678 IP 192.168.1.100.50005 > 192.168.1.102.9999: Flags [P.], seq 12349:12452
高级抓包示例:
sudo tcpdump -n -i esn33 -xx src or dst www.taobao.com -AXX -vv | less
-xx
:以十六进制和ASCII显示链路层数据-A
:以ASCII显示数据包内容-XX
:十六进制显示并包含链路层头-vv
:详细输出| less
:分页查看输出功能说明:全面捕获并详细显示与淘宝相关的网络流量,适合深度分析
TCP连接管理
三次握手建立连接
过程解析
-
第一次握手(SYN)
客户端 → 服务器:SYN=1, Seq=x
客户端发起连接请求,进入SYN_SENT
状态。 -
第二次握手(SYN+ACK)
服务器 → 客户端:SYN=1, ACK=1, Seq=y, Ack=x+1
服务器确认请求并同步自己的序列号,进入SYN_RCVD
状态。 -
第三次握手(ACK)
客户端 → 服务器:ACK=1, Ack=y+1
客户端确认服务器的SYN,连接建立完成,双方进入ESTABLISHED
状态。
关键点:三次握手确保双方的发送与接收能力正常,实现全双工通信。
编程对应函数:
- 客户端调用
connect()
触发握手。- 服务器调用
listen()
监听连接,accept()
接受连接。
四次挥手终止连接
过程解析
-
第一次挥手(FIN+ACK)
主机A → 主机B:FIN=1, ACK=1, Seq=u, Ack=v
A端主动关闭连接,停止发送数据,但仍可接收数据。 -
第二次挥手(ACK)
主机B → 主机A:ACK=1, Ack=u+1
B端确认A的关闭请求,A进入FIN-WAIT-2
状态。 -
第三次挥手(FIN+ACK)
主机B → 主机A:FIN=1, ACK=1, Seq=w, Ack=u+1
B端也关闭连接,发送FIN。 -
第四次挥手(ACK)
主机A → 主机B:ACK=1, Ack=w+1
A确认B的FIN,等待2MSL后关闭连接。
关键点:TCP连接是全双工的,因此需要双方独立关闭,共需四次挥手。
万维网WWW
万维网(World Wide Web,简称 WWW 或 Web)并非一种独立的计算机网络,而是一个基于因特网的大规模、联机式信息储藏所。它通过"超链接"机制,使用户可以从一个站点方便地跳转到另一个站点,实现主动、按需获取信息。
图中展示了多个万维网站点(A、B、C、D、E),它们之间通过虚线"链接到"相互连接,表明信息是分布式存储的,而非集中在一个服务器上,体现了万维网的分布式服务特性。
为解决"如何让用户方便找到所需信息"的问题,万维网采用三大核心技术:
- URL(统一资源定位符):为因特网上的每个资源(如网页、图片、文件)提供唯一的地址标识,实现精确定位。
- HTTP(超文本传输协议):应用层协议,定义浏览器与服务器之间的交互规则,基于TCP实现可靠数据传输。
- HTML(超文本标记语言):用于编写网页内容,支持嵌入超链接、文本、图像、音视频等多媒体元素,并可在浏览器中渲染展示。
此外,用户还可借助搜索引擎等工具快速查找所需信息。
URL结构与示例
使用HTTP的URL一般形式:
http://<主机>:<端口>/<路径>
- 主机:服务器域名或IP地址(如
www.tsinghua.edu.cn
) - 端口:HTTP默认端口为
80
,通常省略不写 - 路径:服务器上资源的具体路径,若省略则指向该站点的主页
主页的含义
- 可以是WWW服务器最高级别的页面
- 某组织或部门定制的门户页面
- 个人创建的自我介绍页面
示例
访问清华大学主页:
http://www.tsinghua.edu.cn
HTTP协议与万维网工作过程
-
HTTP角色:
HTTP是应用层协议,规定了浏览器(客户端)向服务器请求文档、服务器响应文档的格式与流程,是万维网交换文本、图像、音视频等多媒体文件的基础。 -
工作流程:
- 浏览器与服务器(如
www.tsinghua.edu.cn
)建立TCP连接 - 浏览器发送HTTP请求报文,请求特定文档
- 服务器返回HTTP响应报文,携带请求的文档内容
- 传输完成后释放TCP连接(HTTP/1.0行为)
- 浏览器与服务器(如
HTTP请求与响应流程
当用户点击指向"清华大学院系设置"页面的链接(URL:http://www.tsinghua.edu.cn/chn/yxsz/index.htm
)时,发生以下步骤:
- 解析URL:浏览器提取主机名
www.tsinghua.edu.cn
和路径/chn/yxsz/index.htm
- DNS解析:向DNS服务器查询该域名对应的IP地址
- 获取IP地址:DNS返回IP地址
166.111.4.100
- 建立TCP连接:浏览器与服务器在IP
166.111.4.100
、端口80
上建立TCP连接 - 发送HTTP请求:浏览器发送GET请求,获取
/chn/yxsz/index.htm
文件 - 接收响应:服务器返回HTML文件内容
- 释放连接:TCP连接关闭
- 显示内容:浏览器解析并显示文本内容
优化行为:
浏览器可设置"仅下载文本",加快页面加载速度。图像、音频等内容仅显示占位图标,点击后再单独建立连接下载。
HTTP报文结构
HTTP是面向文本的协议,报文由ASCII字符组成,字段长度不固定。
两类报文
报文类型 | 组成部分 |
---|---|
请求报文 | 1. 请求行(方法、URL、版本) 2. 首部行(多个字段名:值) 3. 实体主体(可选,如POST数据) |
响应报文 | 1. 状态行(版本、状态码、短语) 2. 首部行(多个字段名:值) 3. 实体主体(可选,如HTML内容) |
主要区别:起始行不同(请求报文为"请求行",响应报文为"状态行")。
HTTP请求报文示例解析
GET /?pcm=202.412_0_0.0.0&scm=thor.412_14-201000.0.0.0&spm=smpc.home.top-nav.1.1756968683979AWFZBXy_1467 HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Host: news.sohu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36
这是一条 HTTP/1.1 请求报文,用于向搜狐新闻服务器请求资源。
解析如下:
-
请求行:
GET /?pcm=... HTTP/1.1
- 方法:
GET
(获取资源) - 路径与参数:包含多个跟踪参数(用于统计来源)
- 协议版本:
HTTP/1.1
- 方法:
-
请求首部字段:
Accept
:客户端可接受的内容类型,包括HTML、XML、图片等,q
值表示优先级Accept-Encoding
:支持的压缩方式(gzip
,deflate
),减少传输体积Accept-Language
:首选语言为简体中文(zh-CN
)Host
:请求的主机名,用于虚拟主机识别Connection: keep-alive
:希望保持TCP连接,复用连接提高效率User-Agent
:客户端身份标识,此处为Windows 10上的Chrome浏览器(v121)
该请求体现了现代浏览器在访问网页时的标准行为:支持压缩、多语言、连接复用等特性。
Remote Address:
[240e:45:d000:3008:2a::]:80
这是用网络抓包工具 Wireshark捕获的网络数据包界面,展示了设备与搜狐新闻(news.sohu.com
)等网络节点之间的通信情况:
- 上半部分:是捕获的数据包列表,包含时间(Time)、源地址(Source)、目的地址(Destination)、协议(Protocol)、长度(Length)、信息(Info)等列,能看到有 TCP、HTTP 等协议的数据包,记录了不同时间、不同地址间的网络交互,比如 TCP 连接的建立(含 SYN 等标志)、HTTP 请求与响应等过程
- 中间部分:是选中的某条数据包(这里是 HTTP 相关)的详细解析,展开了"Hypertext Transfer Protocol"(超文本传输协议)部分,能看到 HTTP 请求的具体内容,像请求行(包含请求方法、URL 等)、请求首部字段(如
Host
指定主机为news.sohu.com
,Connection
表示连接方式,User-Agent
标识客户端为 Chrome 浏览器等) - 下半部分:是该数据包的十六进制与 ASCII 码形式的原始数据,可用于更底层的数据包内容分析,查看数据在网络传输中的原始字节形态
整体呈现了从网络数据包捕获到分层解析的过程,便于分析网络通信的细节,比如 HTTP 请求的构造、TCP 连接的交互等。
ipv6.addr == 240e:45:d000:3008:2a:: && tcp.port == 80
网络爬虫应用示例
天气API接口
接口网址
http://api.k780.com
https://sapi.k780.com AppKey
77384Sign
5ac63f91d88ad9c5e08f6e513552b3f1
天气查询请求示例
https://sapi.k780.com/?app=weather.today&cityNm=台北&appkey=77384&sign=5ac63f91d88ad9c5e08f6e513552b3f1&format=json
API响应示例
{"success":"1","result":{"weaid":"360","days":"2025-09-04","week":"星期四","cityno":"taibeixian","citynm":"台北","cityid":"101340101","temperature":"31℃/25℃","temperature_curr":"31℃","humidity":"72%","aqi":"15","weather":"多云转晴","weather_curr":"阴","weather_icon":"http://api.k780.com/upload/weather/d/2.gif","weather_icon1":"","wind":"无持续风向","winp":"1级","temp_high":"31","temp_low":"25","temp_curr":"31","humi_high":"0","humi_low":"0","weatid":"3","weatid1":"","windid":"0","winpid":"1","weather_iconid":"2"}}
接口说明:
该示例展示了如何通过HTTP GET请求调用天气API,获取指定城市的天气信息。请求中包含必要的认证参数(AppKey和Sign),API返回JSON格式的天气数据,包括温度、湿度、天气状况等信息。
数据封装与拆包回顾
数据在传输过程中经历完整的封装与解封装过程:
服务器端 客户端
应用层 应用层
传输层 传输层
网络层 [数据拆包] 网络层 [数据封包]
接口层 接口层
- 数据封装结构:
|MAC头部|IP头部|TCP/UDP头部|应用数据|
- 一帧数据:帧(frame)的最大传输单元(MTU)为1500字节
协议头部关键字段
IP头部:
ipflag
:D位(能否分片)、M位(是否最后一片)TTL
:生命周期计数器
TCP头部(20字节):
U
:紧急数据标志S
:SYN标志(同步序列号)F
:FIN标志(结束连接)R
:RESET标志(重置连接)P
:PUSH标志(立即推送)A
:ACK标志(确认应答)
UDP头部(8字节):
- 仅包含源端口、目的端口、长度和校验和
网络协议分析工具
Wireshark网络抓包工具
Wireshark是一款强大的网络协议分析工具,用于网络调试和协议分析:
-
启动方式:
sudo wireshark
-
基本操作流程:
- 选择网络设备进行监听
- 设置过滤条件(如端口、IP地址等)
- 分析捕获的数据包
-
常用过滤条件示例:
port 80 # 过滤HTTP流量 ip.addr == 192.168.1.1 # 过滤指定IP的流量 tcp.port == 50000 # 过滤指定端口的TCP流量
该工具能够直观展示网络数据包的层次结构,从物理层到应用层的完整协议栈,是理解和分析网络通信的重要工具。
HTTP协议详解
HTTP协议概述
HTTP(HyperText Transfer Protocol,超文本传输协议)是Web应用的基础协议,具有以下特点:
- B/S架构:浏览器/服务器模式
- 资源定位:通过URL唯一标识互联网上的资源(网页、电影、图片等)
- 标记语言:HTML(HyperText Markup Language)用于编写网页内容
HTTP交互步骤
- 建立连接:通过TCP三次握手建立连接
- 发送请求:浏览器发送HTTP请求报文
- 处理响应:等待服务器返回响应报文及数据
- 断开连接:通过TCP四次挥手断开连接(HTTP/1.0默认行为)
HTTP/1.1引入了持久连接(Keep-Alive)机制,可以在一个TCP连接上发送多个请求,提高了效率。