使用TCP协议传输数据相对来说更安全,因为通信双方拥有一个专属的通信通道,每发送一个数据包都有确认回复,若数据包丢失。如果发送放没收到确认包,就可以重发这个数据包。
最经典的例子就是三次握手。三次握手是通信双方建立TCP连接前的必须步骤。第一次握手时请求方向接收方发送友好问候,请求建立连接。第二次握手接收方礼貌回复,表示收到请求。第三次握手请求方坚定交往信息,向接收方表示已做好了连接准备。于是双方的TCP连接就建好啦~
完成三次握手后,双方就可以开始传输数据了。当然,握手很严谨,说再见也是一丝不苟的。详细内容可以在合天网安实验室里进行实验操作《Wireshark数据抓包分析之传输层协议(TCP协议)》了解。下面开始实战。
根据已经搭建好的实验环境,本次实战步骤如下:
1. 在测试环境使用发包工具和Wireshark抓取TCP三次握手和四次断开的数据包
2. 详细分析TCP协议的三次握手以及四次断开。
本次的任务可以拆分成:安装发包工具,配置TCP客户端(请求方),服务端(接收方),与学习Wireshark软件懂使用。咱开始吧~
我们使用" TCP&UDP测试工具"来制作和发送TCP数据包,双击实验机器桌面的" TCP&UDP测试工具",会出现下图显示页面:
下面我们需要配置TCP的服务端以及客户端。首先配置服务器端:选择地址为10.1.1.33的机器,双击桌面的" TCP&UDP测试工具",右键点击服务器模式,在下拉列表中,选择创建服务器,如下图:
选择"创建服务器"之后,会弹出服务器端口设置,本次使用默认工具给的6000端口即可,点击"确定"按钮。
点击"确定"按钮之后,在左侧的服务器模式列表中,会出现创建的列表,选择我们创建的服务器,右键点击,选择"启动服务器",即完成了服务器端的配置。
接下来配置客户端,步骤与前面的类似:选择地址为10.1.1.142的机器,双击桌面的" TCP&UDP测试工具",右键点击客户端模式,在下拉列表中,选择"创建连接",如下图:
在弹出的窗口中,选择TCP协议,服务器IP为10.1.1.33.端口6000,本机随意IP,如下图:
点击创建后,如下图:
那么我们看看Wireshark软件获取到的客户端与服务器端之间发送到TCP数据包吧。
获取的TCP协议的数据包分为两部分,即TCP三次握手,四次断开的数据。在实际的操作中,我们往往还会抓到除了目标地址之外往来到数据包,因此先使用过滤器过滤一下IP源,方便我们查看。
启动Wireshark,在Filter中输入tcp,点击Apply会看到很多的数据包,这是因为测试环境中,有很多的应用程序,与其服务器连接,使用TCP协议。如下图:
在这里,我们已知两台机器的IP情况下,可以在filter中输入"ip.addr == 10.1.1.142 and ip.addr == 10.1.1.33"来过滤出我们想要的数据,点击工具中的"apply连接"按钮。如下图:
在上图中,70,73,74帧是tcp的三次握手,428,429,430,431帧是四次断开的数据。
通过前面到工作,我们已经找到了想要的数据包,接下来我们将对TCP的三次握手进行详细分析。
首先我们看TCP包的首部。TCP首部的通用格式如下图所示:
在上面的图中,标出了每一个字段,咱今天就说说比较重要的源端口、目标端口、标记。
源端口表明了发送方的输出端口号。目标端口表示数据包进入接收方的端口号端口对上了,才能正确地将数据包传达。标记用来表示所传输的TCP数据包类型,包括URG、ACK、PSH、RST、SYN和FIN,其中SYN表示同步序号,使用在建立连接时;ACK是确认标志,表示应答域有效,就是前面所说的接收方对请求方的问候表示礼貌致意;FIN表示发送端以及达到数据末尾,此时双方就准备挥手告别了。
那么接下来咱具体分析下三次握手。
干货来了!
TCP第一次握手,捕获的数据包信息如下所示:
从Wireshark的Packet List面板中的Info列可以看到显示的TCP标志位是SYN,所以该数据包是客户端向服务器发送的第一次握手连接。在Packet Details面板中,显示了该包的详细信息,下面详细介绍。
以上信息,表示该包的大小为62个字节。
以上内容表示源IP是10.1.1.142,目的IP为10.1.1.33。
以上内容是传输层首部的详细信息,这里使用TCP协议,其中源端口为56678,目标端口为6000。
更多详细的信息,可以进入合天实战实验课程查询。
在该界面显示了第二次握手数据包的详细信息,其中位于TCP上面的信息与第一次握手时相类似,留给文后照着上面的分析独立思考。
于是这样就完成了TCP连接的建立啦~
TCP的四次断开,也是TCP协议的主要工作之一。那咱也看看四次分手,偶不,四次断开~TCP第一次断开连接的数据包如下:
在该界面显示了TCP第一次断开,数据包的详细信息,是不是和握手时的数据包很像?
查看tcp数据包可以看到客户端向服务器发送FIN和ACK标志的数据包开始断开连接,其中FIN和ACK标志位都为1。
Source Port: 56678(56678) #源端口号
Destination Port: 6000(6000) #目标端口号
Stream index: 0 #流节点号
TCP Segment Len: 0 #分段长度
Sequence number: 1 (relative sequence number) #序列号
Acknowledgment number: 1 (relative ack number) #确认编号
Header Length: 20 bytes #首部长度
.... 0000 0001 0001 = Flags: 0x011 (FIN,ACK) #标志位,此处为(FIN,ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Not set #确认编号已设置
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Set #请求位
.... .... ...1 = Fin: Not set #FIN标志位
Expert Info (Chat/Sequence): Connection finish (FIN) #专家信息
Connection finish (FIN) #消息内容,连接完成(FIN)
Severity level: Chat #安全级别
Group: Sequence
Window size value: 64240 #窗口大小
Calculated window size: 64240 #估计的窗口大小
Window size scaling factor: -1 (unknown) 窗口大小缩放比例因素
Checksum: 0x16cb [validation disabled] #校验和
Good Checksum: False
Bad Checksum: False
Urgent pointer: 0
FIN是1表示要分手啦~
在TCP第二次断开连接的数据包是服务器向客户端发送的ACK包,其中ACK标志位为1。
TCP第三次断开连接的数据包是服务器向客户端发送的FIN和ACK包。其中FIN和ACK标志位为1。
TCP第四次断开连接的数据包,客户端向服务器发送ACK的包。其中,ACK标志位都为1。