前言

TCP协议在网络过程中,是一个最常见不过的协议了。在分析tcp网络协议报文时,借助当前强力的工具wireshark可以起到很好的辅助作用。


首先抓取了一个简单的http请求报文,

选取其中的一次完整请求,追踪tcp流:

可以在报文中看到tcp的3次握手,以及http 的request 和 response ,还有tcp的4次断开。
另外整个封包列表的面板中也有显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 可以看到不同的协议用了不同的颜色显示,当然也可以在View ->Coloring Rules中修改显示颜色的规则。

TCP 基本概念


上图圈起来的就是封包详细信息(Packet Details Pane):
这是最重要的信息,用来查看协议中的每一个字段。而OSI七层模型分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
在封包信息中,每行对应的含义及在OSI模型中的对应关系如下:
  Frame: 物理层的数据帧概况 ->对应OSI七层模型中的【物理层】
  Ethernet II: 数据链路层以太网帧头部信息 ->对应OSI七层模型中的【数据链路层】
  Internet Protocol Version 4: 互联网层IP包头部信息 ->对应OSI七层模型中的【网络层】
  Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP ->对应OSI七层模型中的【传输层】
Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议 ->对应OSI七层模型中的【应用层】

这根据报文的抓取的设备以及报文被封装的程度,会有不同的显示,比如截图里面的报文是在虚拟机上抓取的,就不会有物理设备的报文信息,在有些网络拓扑环境下,还会有封装成vlan或vxlan的报文,就可以在wireshark那里成功看到。
不同的模型层和不同协议报文,对应的报文头部长度是不一致的,所以在计算报文的lengeth时,要考虑这些地方。

tcp 3次握手和4次断开的报文梳理

首先示例图来说明下tcp的连接/数据传输/断开的过程:

百度百科解释TCP三次握手过程如下:

第一次握手:建立连接时,客户端发送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连接成功)状态,完成三次握手。

结合报文情况对比查看;
client ----> SYN seq=480449269 ------> server
Server -----> SYN seq=1569499109,ACK=480449270 ----> client
Clinet (seq = 480449270) -----> ACK=1569499110 ------> server

如下截图:

这里的seq num 显示的是绝对值,所以在单纯分析本次请求流时,绝对值的seq num可能不易与阅读,可以调整wireshark配置,查看相对seq num。

数据报文中,第1,2,3条数据包是进行tcp 3次握手,
而,第4 到 9 是进行的数据传输,这里是完成了一次http 请求;
第10,11,12,13 四条报文是进行了tcp的4次断开。

在这里插入图片描述

在数据传输中的报文,需要注意报文大小,length和 tcp传输窗口大小,大包/小包,切片/聚合等等,场景各种都有需要灵活分析,经验推理。

tcp协议4次断开:

关于断开请求的报文数据这一块,一般会主要关心是那端主要发起的FIN报文标记进行断开,非正常情况更会有RST报文标记。

总之网络数据报文内容奇多无比,涉及到的知识和工具使用技巧都很多,在运维过程中,还是对运维过程有很大的帮助的。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐