@SovietPower
2021-11-23T19:40:07.000000Z
字数 3351
阅读 1532
CN
https://zybuluo.com/SovietPower/note/1884737
参考:
https://zhuanlan.zhihu.com/p/82498482
todo:https://zhuanlan.zhihu.com/p/272082726
安装wireshark、wget(这个地方的版本比较老了)。
将wget的bin
文件夹添加到环境变量。
右键点击一个数据包,选择跟踪流
可过滤其它网站的包。
cannot verify ...'s certificate
添加参数--no-check-certificate
忽略证书检查。
wireshark中输入过滤器tcp port http
,双击当前网络(比如WLAN)开始。
清空一下wireshark输出(停止再重新开始,或Ctrl R
),然后使用命令wget http://www.baidu.com --no-check-certificate
,提示OK后停止wireshark,查看其中的内容。
选择每一部分,可查看每部分的提示信息:
Ethernet (eth), 14 byte(s)
Internet Protocol Version 4 (ip), 20 byte(s)
Transmission Control Protocol (tcp), 20 byte(s)
Hypertext Transfer Protocal (http), 101 byte(s)
可知该包包含了 Ethernet, IPv4, TCP, HTTP 四部分,结构图为:
Ethernet | IPv4 | TCP | HTTP |
---|---|---|---|
14B | 20B | 20B | 101B |
前三个包为TCP的三次握手,第四个包为HTTP数据包。
对于1.中的数据包,开销为,有用数据为,下载协议的开销约为。
开销是必要的。
Ethernet头部包含:
- 48位目标地址:48位MAC地址。
- 48位源地址:48位MAC地址。
- 16位上层协议:网络层使用的协议。
IP头部包含:
- 4位版本号
- 4位头部长度
- 8位服务类型(Type Of Service, TOS):表示服务质量,分为6位差分服务代码点DSCP,用于质量控制,和2位显式拥塞通告ECN,用于报告网络拥堵情况。
- 16位IP数据报总长度
- 16位标识字段(identification):唯一标识主机发送的每一个数据报。
- 3位标志位flags:第一位为保留位,为0;第二位为“禁止分片”,Don’t Fragment, DF,若为1则数据不分片;第三位为“更多分片”,More Fragment, MF。
- 8位生存时间(Time To Live, TTL):表示包可以中转多少个路由器。每经过一个路由器,TTL就减少1,直到变为0后丢弃该包。TTL可防止数据报陷入路由循环。
- 8位协议:标识IP头部属于哪个协议。
- 16位IP头部检验和
- 32位发送端口IP地址
- 32位目的端口IP地址
- 32位可选的选项(可以没有)
TCP头部包含:
- 16位源端口号
- 16位目的端口号
- 32位序列号
- 32位确认号
- 4位头部长度
- 12位标志位:3位保留位(为0),其余9位分别为:Nonce,Congestion Window Reduced (CWR),ECN-Echo,Urgent (URG),Acknowledgement (ACK),Push (PSH),Reset (RST),SYN,FIN。
- 16位窗口大小
- 16位TCP检验和
- 选项(可选)
- 数据(可选)
以上是下载协议的开销。
解复用:找到正确的上一层协议来处理到达的包。
Ethernet头部中,起始地址0x000B
处,为16位上层协议,表示网络层使用的协议。
如下例的Type
,使用IPv4协议,对应值为0x0800
。
Ethernet II, Src: LiteonTe_f9:c1:65 (50:5b:c2:f9:c1:65), Dst: Cisco_c6:bd:40 (e8:65:49:c6:bd:40)
Destination: Cisco_c6:bd:40 (e8:65:49:c6:bd:40)
Source: LiteonTe_f9:c1:65 (50:5b:c2:f9:c1:65)
Type: IPv4 (0x0800)
IP头部中,起始地址0x0008
处,有8位生存时间、8位协议、16位检验和,8位协议标识了IP头部属于哪个协议。
如下例的Protocol
,使用TCP协议,对应值为6
。
Internet Protocol Version 4, Src: 172.30.242.93, Dst: 182.61.200.7
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 141
Identification: 0x4f48 (20296)
Flags: 0x40, Don't fragment
0... .... = Reserved bit: Not set
.1.. .... = Don't fragment: Set
..0. .... = More fragments: Not set
Fragment Offset: 0
Time to Live: 128
Protocol: TCP (6)
Header Checksum: 0x8e61 [validation disabled]
[Header checksum status: Unverified]
Source Address: 172.30.242.93
Destination Address: 182.61.200.7
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手,客户端与服务器开始传送数据。
可见,这里截获了三个握手数据包,第四个是HTTP数据包,说明HTTP的确是使用TCP建立连接的。
第一次握手
客户端发送了一个TCP,标志位为SYN,序列号为0,表示客户端请求建立连接。
SYN
:标志位,表示请求建立连接。
Seq = 0
:初始建立连接值为0,数据包的相对序列号从0开始,表示当前还没有发送数据。
Ack = 0
:初始建立连接值为0,已经收到包的数量,表示当前没有接收到数据。
第二次握手
服务器发回确认包, 标志位为SYN, ACK
,确认序号为客户的序列号ISN加1。
[SYN, ACK]
: 标志位,同意建立连接,并回送SYN+ACK。
Seq = 0
:初始建立值为0,表示当前还没有发送数据。
Ack = 1
:表示当前服务器成功接收的数据位数,虽然客户端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位。(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)。
第三次握手
客户端再次发送确认包,SYN标志位为0,ACK标志位为1,并把服务器发来ACK的序号字段+1,放在确认字段中发送给对方,且在数据段放写ISN的+1。
ACK
:标志位,表示已经收到记录
Seq = 1
:表示当前已经发送1个数据
Ack = 1
: 表示当前端成功接收的数据位数,虽然服务端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)。