学计算网络协议的一个重要方法就是通过抓取相关协议的实际报文来分析解读。通过分析解读实际的交互报文可以帮助学习者非常深刻理解该协议。
Wireshark就是一个专门用来抓取并分析网络封包的软件。本文所展示的报文就是用Wireshark工具抓取的,TCP协议连接建立和终止的报文,也就是TCP协议的三次握手和 四次挥手的报文。
所抓取的TCP报文实际是通过应用层的 HTTP 协议来产生的,因为,HTTP 协议本身就是基于TCP协议的,产生报文的过程如下:
- 建立 HTTP 连接到 www.baidu.com 的主机(此过程实际包含了TCP连接的建立过程,三次握手)
- 然后用 HTTP 协议随便发送几个字节数据(此过程包含TCP数据的发送和接收)
- 因为第二步发送的数据是随便发送的,并不符合 HTTP 协议,所以百度网站的主机就会返回错误,然后终止该 HTTP 连接(此过程也就包含了 TCP 连接的终止,四次挥手)
具体的报文如下:
+---------+---------------+----------+
00:55:53,587,017 ETHER
|0 |a4|93|4c|e3|22|7f|00|23|24|44|9f|67|08|00|45|00|00|34|38|92|40|00|40|06|00|00|c0|a8|0d|56|0e|d7|b1|27|c6|39|00|50|2f|b1|fe|8e|00|00|00|00|80|02|20|00|8e|23|00|00|02|04|05|b4|01|03|03|08|01|01|04|02|
+---------+---------------+----------+
00:55:53,592,447 ETHER
|0 |00|23|24|44|9f|67|a4|93|4c|e3|22|7f|08|00|45|00|00|34|38|92|40|00|37|06|7d|35|0e|d7|b1|27|c0|a8|0d|56|00|50|c6|39|94|f7|f4|70|2f|b1|fe|8f|80|12|20|00|42|db|00|00|02|04|05|ac|01|03|03|05|01|01|04|02|
+---------+---------------+----------+
00:55:53,592,489 ETHER
|0 |a4|93|4c|e3|22|7f|00|23|24|44|9f|67|08|00|45|00|00|28|38|93|40|00|40|06|00|00|c0|a8|0d|56|0e|d7|b1|27|c6|39|00|50|2f|b1|fe|8f|94|f7|f4|71|50|10|01|04|8e|17|00|00|
+---------+---------------+----------+
00:55:59,943,958 ETHER
|0 |a4|93|4c|e3|22|7f|00|23|24|44|9f|67|08|00|45|00|00|2f|38|f1|40|00|40|06|00|00|c0|a8|0d|56|0e|d7|b1|27|c6|39|00|50|2f|b1|fe|8f|94|f7|f4|71|50|18|01|04|8e|1e|00|00|68|65|6c|6c|6f|0d|0a|
+---------+---------------+----------+
00:55:59,949,537 ETHER
|0 |00|23|24|44|9f|67|a4|93|4c|e3|22|7f|08|00|45|00|00|28|05|55|40|00|34|06|b3|7e|0e|d7|b1|27|c0|a8|0d|56|00|50|c6|39|94|f7|f4|71|2f|b1|fe|96|50|10|03|08|a0|94|00|00|00|00|00|00|00|00|
+---------+---------------+----------+
00:55:59,950,378 ETHER
|0 |00|23|24|44|9f|67|a4|93|4c|e3|22|7f|08|00|45|00|00|44|05|56|40|00|34|06|b3|61|0e|d7|b1|27|c0|a8|0d|56|00|50|c6|39|94|f7|f4|71|2f|b1|fe|96|50|18|03|08|4b|ad|00|00|48|54|54|50|2f|31|2e|31|20|34|30|30|20|42|61|64|20|52|65|71|75|65|73|74|0d|0a|0d|0a|
+---------+---------------+----------+
00:55:59,950,409 ETHER
|0 |00|23|24|44|9f|67|a4|93|4c|e3|22|7f|08|00|45|00|00|28|05|57|40|00|34|06|b3|7c|0e|d7|b1|27|c0|a8|0d|56|00|50|c6|39|94|f7|f4|8d|2f|b1|fe|96|50|11|03|08|a0|77|00|00|00|00|00|00|00|00|
+---------+---------------+----------+
00:55:59,950,439 ETHER
|0 |a4|93|4c|e3|22|7f|00|23|24|44|9f|67|08|00|45|00|00|28|38|f2|40|00|40|06|00|00|c0|a8|0d|56|0e|d7|b1|27|c6|39|00|50|2f|b1|fe|96|94|f7|f4|8e|50|10|01|04|8e|17|00|00|
+---------+---------------+----------+
00:55:59,956,398 ETHER
|0 |a4|93|4c|e3|22|7f|00|23|24|44|9f|67|08|00|45|00|00|28|38|f3|40|00|40|06|00|00|c0|a8|0d|56|0e|d7|b1|27|c6|39|00|50|2f|b1|fe|96|94|f7|f4|8e|50|11|01|04|8e|17|00|00|
+---------+---------------+----------+
00:55:59,961,449 ETHER
|0 |00|23|24|44|9f|67|a4|93|4c|e3|22|7f|08|00|45|00|00|28|00|00|40|00|34|06|b8|d3|0e|d7|b1|27|c0|a8|0d|56|00|50|c6|39|94|f7|f4|8e|2f|b1|fe|97|50|10|03|08|a0|76|00|00|00|00|00|00|00|00|
上面的报文就是包含了 TCP 协议连接建立和终止(三次挥手和四次握手)的一个报文实例。通过按照 TCP 协议的报文格式逐帧分析,可以加深对 TCP 协议的理解。
下面根据以上报文画了一个图来帮助理解:
- ①②都是 SYN 报文(不可携带数据),各自消耗一个序号,所以③⑤的 seq=1;而③只是 ACK 空报文,不消耗序号,因此④的 seq=1
- ④是 PSH 报文,带 7 个字节有效数据,因此需要消耗 7 个序号,所以⑧的 seq=8;⑤是 ACK 空报文;⑥是 PSH 报文,带 28 个字节有效数据
- ⑦⑨都是 FIN 空报文(可携带数据),都各自消耗 1 个序号,所以⑧⑩的 ack 都等于⑦⑨的 seq+1;
- 从应用层来看,在 TCP 数据通信过程中,所传输的报文是 HTTP 协议