借助Wireshark解析TCP三次握手

借助Wireshark解析TCP三次握手

日常从其他地方偷图-三次握手建立连接与四次握手关闭连接图解

WireShark

使用wireshark,简单来讲就是在选取一个连接后,wireshark会显示实时网络数据传输的报文,打开浏览器,输入一个网址,然后返回wireshark页面可以看到加载出一堆东西,这是设置筛选http,然后选取其中一条来追踪流,因为本文是分析TCP三次握手,于是进而选取TCP流。

1.输入网址后等wireshark读取数据

2.过滤数据,

3.选择其中一个作为我们接下来的研究对象

4.wireshark跳转到TCP流:

随便点其中一个,会弹出新窗口然后加载出很多东西,而下图显示的就是TCP报文的首部信息

TCP预备知识

位于传输层的TCP数据分组称为段(Segment),又译为报文段、数据段或分段。TCP将来自应用层的数据分块并封装成TCP段进行发送。TCP段封装在IP数据报中,然后再封装成数据链路层中的帧。【图1 TCP段封装】

TCP段是TCP的基本传送单位,段格式如图7-4所示。TCP段由首部和数据两部分构成。首部长度在20~60字节之间,由定长部分和变长部分构成,定长部分长度为20字节,变长部分是选项和填充,长度在0~40字节之间。数据部分用于装载来自应用层的数据,下面重点介绍首部格式。

【图2 TCP段格式】

TCP首部的字段和功能说明如下。

1.源端口(Source Port)和目的端口(Destination Port)

这两个端口各占16位,源端口定义发送该报文段的应用程序的端口号;目的端口定义接收该报文段的应用程序的端口号。每一个TCP首部中都包含有源端口号和目的端口号,用于定位源端点的应用进程和目的端点的应用进程。

2.序列号(Sequence Number)

该字段占32位,定义数据段中的数据部分在发送方数据流中的位置,也就是发送的数据部分第1个字节的序列号。这个字段包含了一个唯一标识TCP数据段的数字。

3.确认号(Acknowledgment Number)

该字段占32位,定义报文段的接收方期望从对方接收的序列号,指明下一次希望得到的、来自另一方的序列号。

序列号和确认号是TCP实现可靠连接的关键。当建立一个TCP连接时,发送方主机发出一个随机的初始化序列号(ISN)给接收方,接收方将其加1后送回发送方,这意味着发送方可以发送下一个字节了。一旦数据开始传送,序列号和确认号将跟踪已发送了的那些数据。

4.首部长度(Header length)

该字段占4位,以字节为单位表示TCP首部的大小。首部长度随TCP选项字段而改变,通过这个字段可以同时判断该TCP段的开始位置和结束位置。某些协议分析器将这个字段标记为偏移(Offset)字段。这个字段的值可以在5(5×4=20)至15(1×4=60)之间,即首部长度可以在20~60字节之间。

5.标志(Flags)

该字段占6位,定义6种不同的控制位或标志位,在同一时间可设置一位或多位标志。这些标志位用在TCP的流量控制、连接建立和终止以及数据传送方式等方面。标志位设为1又称置位(set)。【图3 TCP标志】

6.窗口大小(Window size)

该字段占16位,指明TCP接收方缓冲区的长度,以字节为单位。最大长度是65535字节,0指明发送方应该停止发送,因为接收方的TCP缓冲区已满。这个值通常作为接收窗口(rwnd),并由接收方来确定,接收方可以使用此字段来改变发送方的窗口大小。在这种情况下,发送端必须服从接收端的决定。

7.校验和(Checksum)

该字段占16位,用于存储TCP段的校验和,包括首部和主体部分。校验和用于传输层差错检测,允许目的主机可以验证TCP段的内容并能够测试可能的破坏。UDP是否使用校验和是可选的,而TCP使用校验和则是强制性的。校验和算法将TCP段的内容转换为一系列16位的整数,并将它们相加,接收方根据校验和判断传输是否正确。

8.紧急指针(Urgent Pointer)

该字段占16位,只有当紧急标志置位(值为1)时,这个字段才有效,这时的报文段中包括紧急数据。紧急指针是一个正的偏移量,定义了一个数,把这个数加到序列号上就得出报文段数据部分中最后一个紧急字节。如果URG指针被设置,接收方必须检查这个字段。TCP为了提高效率,数据不会直接发送到对方,一般都先放在数据缓冲区中,等到数据积累到一定的大小才会一起发送。紧急指针所指向的一段数据不必等待缓冲数据的积累,直接发送到对方。

9.选项(Options)

在TCP首部中可以有多达40字节的选项字段。TCP首部最小为20字节。如果定义了一些选项,首部的大小就会增加(最大为60字节)。RFC 793规定首部必须可以被32位整除,所以如果定义了一个选项,但该选项只用了16位,那么必须使用填充(padding)字段补充16位,填充字段是由0组成的字段。

(这里就照搬书上的啦)

图1 TCP段封装:

图2 TCP段格式:

图 3 TCP标志:

于是,TCP段格式就可以轻松对应上啦,

三次握手

这张图可能比开局图简单那么一丢丢,

但是它加载不出来换了自个的图床也没有用

理论上建立传输连接只需一个请求和一个响应。但是,实际网络通信可能导致请求或响应丢失,可采用超时重传解决此问题,即请求或响应的丢失会造成定时器超时溢出,客户端将被迫再次发起连接请求,通过重传连接请求来建立连接。但这又有可能导致重复连接的问题。为避免这些问题,在建立TCP连接时采用三次握手(Three-way Handshaking,又译三向握手)方法。该方法要求对所有报文段进行编号,每次建立连接时都产生一个新的初始序列号。

这张图总标注的1,2,3分别是第一、二、三次握手的情况,着重关注Sequence number(序列号)和Acknowledgment number(确认号)的一个变化情况,

可以看到三次握手的过程中即为三次报文发送过程:[SYN][SYN ACK][ACK]

第一次握手

点开来看第一条,

浅蓝色那里的Sequence number,只是相对序列号。

客户端作为源主机通过向服务器(作为目的主机)发送TCP连接请求(SYN段),其中flags处,SYN=1,ACK=0;

客户端此时主动打开

第二次握手

服务器在指定的端口等待连接,收到TCP连接请求后,将回应一个TCP连接应答(即SYN/ACK段),其中Flags显示是SYN=1,ACK=1;序列号不变,但确认号为客户端的初始序列号加一。

服务器执行被动打开。

第三次握手

客户端再向服务器发送一个TCP连接确认报文,其中Flags处SYN=0,ACK=1;序列号为客户端初始序列号加一,确认好为服务器的初始序列号加一。

经过上述的三次握手,TCP连接正式建立,双方都置为ACK flag,交换并确认了对方的初始序列号。

原文地址:https://www.cnblogs.com/buzhouke/p/13831247.html