一 前言
如题,本章主要介绍wireshark抓包,以太网帧结构,tcp基础知识
二 wireshark抓包
Wireshark是一款功能强大,免费的网络协议分析工具,可以说调试过网络问题的都用过,使用起来也非常简单,两步即可:
Wireshark抓的数据含有很多类型,我们可以在输入框输入指令对数据进行过滤,只展示我们想要的包,这里总结下常用的过滤指令,基本能够满足我们的需要:
过滤类型 | 过滤命令 |
---|---|
IP过滤 | ip.src_host == 192.168.1.41 ip.dst_host == 192.168.1.41 |
协议过滤 | 输入框直接输入:tcp/udp/http/arp |
端口过滤 | tcp.port == 8080 //来自端口8080 双向的包 tcp.srcport == 8080 tcp.dstport == 8080 |
多条件组合 | 与 &&/and 或 II/or 非 !/not |
三 以太网帧结构
- 帧组成
组成部分 | 说明 |
---|---|
payload | 来自应用层下发数据 |
传输层header | 标准头Tcp 20字节,udp 8字节 |
IP header | 标准头20字节,若有选项字段则会更长 |
链路层header | 14字节 dst mac 6字节 + src mac 6字节 + type 2字节 |
这里再补充几个概念
segment分段 | 属于tcp层,数据太大,传输层按 MSS 进行分段 |
---|---|
fragment分片 | 属于IP层,IP 包太大,超过 MTU 被 IP 层分片 |
MTU | 最大传输单元,链路层一次能发送的最大帧大小,以太网默认1500 |
MSS | 最大报文长度,TCP数据部分最大长度,TCP默认1460(基于mtu1500) |
由于IP层被动分片不可控,丢一片整包重传,主动分段可控,所以分段要比分片好
- 以太网帧结构分析
如上图所示,分析从wireshark抓取的帧数据,对照帧结构,可能更方便我们理解
四 TCP
- tcp和udp比较
类型 | 特点 |
---|---|
TCP | 有连接,可靠,有ack确认,有重传,流控机制 |
UDP | 无连接,不可靠,无ack确认,无重传流控机制 |
- tcp几种机制介绍
机制 | 描述 |
---|---|
滑动窗口 | window机制是一种在发送方和接收方之间共同维护的数据流控机制 接收窗口rwnd: 表示接收方当前可接收的数据大小,由接收方在ACK报文中通知发送方 拥塞窗口 cwnd: 发送方根据网络拥塞状况(丢包延迟)动态调整 发送窗口:实际发送数据的限制窗口(可以理解为最大的空中数据),取min(rwnd,cwnd) |
Keepalive | 保活机制,当通讯双方长时间没有数据交互时,通过定期发送探测报文,判断对方是否还在线,连接是否有效,不是必须功能(协议栈里面可能默认不开启) |
下面是几点说明:
- 流量控制
(1)指的是发送方不能无限制地发送数据,而要根据接收方的接收能力来调整发送速率,依赖于window窗口机制,确保接收方不会数据溢出或丢失。
(2)流量控制主要是考虑接收方的处理能力,而拥塞控制主要是考虑网络路径的传输能力,防止网络拥塞 - window size 和calculated window size差别
window size :tcp head窗口字段只有2个字节,最大表示65535,现代网络中远远不够,引入了窗口缩放因子window size scale factor
calculated window size = window size * window size scale factor //实际窗口大小 - keepalive 下要了解的几个概念
默认空闲时间t1:即空闲t1时间,发送第一个探测包
探测间隔t2:如果没有回应,则过t2时间再发送一个探测包
重试次数c:若连续C次探测无回应,则认为连接断开,关闭连接
探测包内容:带ACK标志位,无数据内容的TCP报文
注:keepalive并不是tcp独有,其他协议也有,udp里面要应用层模拟实现
- tcp三次握手
步骤 | 方向 | 标志位 | 含义 |
---|---|---|---|
第一次 | 客户端->服务器 | SYN=1 | 客户端请求建立连接,发送SYN(seq=x) |
第二次 | 服务器->客户端 | SYN=1,ACK=1 | 服务端确认并回应,发送SYN(seq=y),ACK(x+1) |
第三次 | 客户端->服务器 | ACK=1 | 客户端确认服务器回应,发送ACK(y+1) |
三次握手是通讯建立过程,同步连接双方的序列号和确认号,交换tcp窗口大小信息,连接建立完成后,双方进入established状态,可以开始传输数据
- tcp四次挥手
步骤 | 方向 | 标志位 | 含义 |
---|---|---|---|
第一次 | 客户端->服务器 | FIN=1 | 客户端请求断开连接 |
第二次 | 服务器->客户端 | ,ACK=1 | 服务端确认收到 |
第三次 | 服务器->客户端 | FIN=1 | 服务端也要断开 |
第四次 | 客户端->服务器 | ACK=1 | 客户端确认断开,连接彻底关闭 |
这里思考几个问题:
问题1 :为什么tcp建立连接过程需要三次握手而不是两次
答:只有三次才能客户端角度,服务端角度,都确认双方的接收和发送能力正常问题2:tcp断开连接为什么需要四次
答:tcp是全双工的,双方独立传输数据,断开连接时双方都要单独关闭自己方向问题3:客户端最后一个 ACK 之后,不是立即关闭,而是进入 TIME_WAIT(等待两倍最大报文寿命),为什么
答:
(1)确保客户端发送的最后一个ACK报文能正常到达服务端(防止ACK丢失情况)(2)防止旧连接数据影响新连接(经过TIME_WAIT后,旧连接所有报文都会从网络中消失)