三次握手
打开http://www.youku.com 分析 TCP 数据包
在终端中执行:
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=/tmp/chrome --ssl-key-log-file=/tmp/.ssl-key.log
在Wireshark过滤器输入 http
在浏览器输入优酷网址,可以看到Wireshark中http数据包的Info有 youku的字样
右键,Follow -> TCP Stream,追踪TCP数据流
可以得到如下页面:
点击Statistics -> Flow
可以得到如下页面:
在其中的Flow Type中选择TCP Flows,并选择时间戳和我们要分析的TCP数据流一致的数据,点击Limit to display filiter,可以得到如下窗口:
第一次握手
可以看出我的IP地址为192.168.0.102
优酷的IP地址为59.82.31.118
在客户端和youku.com之间启动 TCP 连接的 TCP SYN 区段的相对 S e q u e n c e n u m b e r Sequence number Sequencenumber 是0,绝对 S e q u e n c e n u m b e r Sequence number Sequencenumber 是 2758883771 2758883771 2758883771,这是一个随机值
根据三次握手,客户端应该发送 SYN 请求请求建立连接,我找到发送的第一个请求并且发现客户端(我的电脑)将 SYN 标志标 0 用来请求建立连接。这一步也是三次握手的第一步
第二次握手
Youku.com发送给客户的
- 相对 A c k n o w l e d g e m e n t n u m b e r Acknowledgement\ number Acknowledgement number 是 1 1 1
- 绝对 A c k n o w l e d g e m e n t n u m b e r Acknowledgement\ number Acknowledgement number是 2758883772 2758883772 2758883772
- 相对 S e q u e n c e n u m b e r Sequence\ number Sequence number为 0 0 0
- 绝对 S e q u e n c e n u m b e r Sequence\ number Sequence number为 1687385211 1687385211 1687385211,这也是一个随机值
可以发现,服务器端的
A
c
k
n
o
w
l
e
d
g
e
m
e
n
t
n
u
m
b
e
r
Acknowledgement\ number
Acknowledgement number = 客户端的
S
e
q
u
e
n
c
e
n
u
m
b
e
r
+
1
Sequence\ number + 1
Sequence number+1
意思是服务器接收到我的连接请求并且发 SYN-ACK 确认,这是三次握手的第二步。
第三次握手
客户端再次发送TCP报文段给服务器端的
- 相对 S e q u e n c e n u m b e r Sequence\ number Sequence number为 1 1 1
- 绝对 S e q u e n c e n u m b e r Sequence\ number Sequence number为 2758883772 2758883772 2758883772
- 相对 A c k n o w l e d g e m e n t n u m b e r Acknowledgement\ number Acknowledgement number的值为 1 1 1
- 绝对 A c k n o w l e d g e m e n t n u m b e r Acknowledgement\ number Acknowledgement number的值为 1687385212 1687385212 1687385212
TCP服务器进程收到该确认报文段后也进入连接已建立状态
现在,TCP双方都进入了连接已建立状态,它们可以基于已建立好的TCP连接,进行可靠的数据传输
四次挥手
第一次挥手:
272号报文的信息:
Source IP Address
: 192.168.0.112Destination IP Address
: 192.168.0.101Source Port
: 21Destination Port
: 59353Fin
: 1Acknowledgment Number
: 2006995353 ,164(relative ack number)Sequence Number
:1380144531, 454 (relative sequence number)
TCP连接释放报文段首部中
- 终止位FIN和确认为ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
- 序号seq字段的值设置为u,它等于TCP客户进程之前已传送过的数据的最后一个字节的序号加1
- 确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的、数据的最后一个字节的序号加1
第二次挥手:
273号报文的信息:
Source IP Address
: 192.168.0.101Destination IP Address
: 192.168.0.112Source Port
: 59353Destination Port
: 21Acknowledgment Number
: 1380144532 ,455(relative ack number)是 272号报文的Sequence Number + 1
Sequence Number
:2006995353, 164 (relative sequence number)和 272号报文的Acknowledgment Number
一致
TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态
普通的TCP确认报文段首部中
- 确认位ACK的值被设置为1,表明这是一个普通的TCP确认报文段
- 序号seq字段的值设置为v,它等于TCP服务器进程之前已传送过的数据的最后一个字节的序号加1,这也与之前收到的TCP连接释放报文段中的确认号匹配
- 确认号ack字段的值设置为u+1,这是对TCP连接释放报文段的确认
TCP客户进程收到TCP确认报文段后就进入终止等待2状态,等待TCP服务器进程发出的TCP连接释放报文段
若使用TCP服务器进程的应用进程已经没有数据要发送了,应用进程就通知其TCP服务器进程释放连接
由于TCP连接释放是由TCP客户进程主动发起的,因此TCP服务器进程对TCP连接的释放称为被动关闭连接
第三次挥手:
274号报文的信息:
Source IP Address
: 192.168.0.101Destination IP Address
: 192.168.0.112Source Port
: 59353Destination Port
: 21Fin
:1Acknowledgment Number
: 1380144532 ,455(relative ack number)和 273 号报文的Acknowledgment Number
一致Sequence Number
:2006995353, 164 (relative sequence number)和 273 号报文的Sequence Number
一致
TCP服务器进程发送TCP连接释放报文段并进入最后确认状态
该报文段首部中
- 终止位FIN和确认位ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
- 序号seq字段的值为w,这是因为在半关闭状态下,TCP服务器进程可能又发送
- 确认号ack字段的值为u+1,这是对之前收到的TCP连接释放报文段的重复确认
第四次挥手:
275号报文的信息:
Source IP Address
: 192.168.0.112Destination IP Address
: 192.168.0.101Source Port
: 21Destination Port
: 59353Acknowledgment Number
: 2006995354 ,165(relative ack number)是 274 号报文 的Sequence Number + 1
Sequence Number
:1380144532, 455 (relative sequence number)和 274 号报文 的Acknowledgment Number
一致
TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态
该报文段首部中
- 确认为ACK的值被设置为1,表明这是一个普通的TCP确认报文段
- 序号seq字段的值设置为u+1,这是因为TCP客户进程之前发送的TCP连接释放报文段虽然不携带数据,但要消耗掉一个序号
- 确认号ack字段的值设置为w+1,这是对所收到的TCP连接释放报文段的确认
TCP服务器进程收到该报文段后就进入关闭状态,而TCP客户进程还要进过2MSL后才能进入关闭状态