实验4:TCP

实验参考文档(TCP)

实验6 TCP报文格式分析与学习

任务目的

1. 掌握传输层TCP的工作原理。

2. 掌握TCP报文首部格式和各字段的作用。

任务内容

1. 使用Wireshark抓取TCP数据包。

2. 分析捕获到的TCP数据,学习TCP报头的字段信息。

实验原理

1. 概述

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的基本特点如下。

(1)面向连接。双方必须先建立连接才能进行数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上的传输。TCP连接是全双工的,双方数据传输可以通过一个连接进行,完成数据交换后,双方必须断开连接,以释放系统资源。

(2)可靠传输。

• TCP采用发送应答机制,TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功。

• 超时重传,发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

• TCP报文段最终是以IP数据报发送的。IP数据报到达接收端可能乱序重复,TCP对接收到的TCP报文段重排整理后再交给应用程序。

(3)基于字节流。应用层发送的数据会在TCP的发送端缓存起来,统一分片(如一个应用层的数据包分成两个TCP包)或者打包(如两个或者多个应用层的数据包打包成一个TCP数据包)发送,接收端直接按照字节流将数据传递给应用层。

2. TCP报文格式

TCP报文格式如下图所示,报文头部主要字段介绍如下。

(1)源端口:占2个字节,表示发送方端口号。

(2)目的端口:占2个字节,表示接收方端口号。

(3)序号:占4个字节,TCP连接传送的数据流中的每一个字节都被编上一个序号。首部中序号字段的值指的是本报文段所发送数据的第一个字节的序号。

(4)确认序号:包含发送确认的一端所期望接收到的下一个序号。因此,确认序号应该是上次已成功收到的数据字节序列号加1。

(5)首部长度:TCP报文段首部的长度。

(6)保留:占6 bit,保留为今后使用。

(7)URG:紧急指针有效标识,当URG=1时,表明紧急指针有效。它告诉系统报文段中有紧急数据,应尽快传送。

(8)ACK:确认指针有效标识,ACK=1时,确认号字段才有效,ACK=0时,确认号字段无效。

(9)PSH:接收方在接收到PSH=1的报文段时会尽快将其交付给接收应用进程,而不再等到整个接收缓存都填满后再向上交付。

(10)SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,应在响应的报文段中使SYN=1和ACK=1。因此,SYN=1表示这是一个连接请求或连接接收报文。

(11)FIN:当FIN=1时,表明此报文段发送端的数据已发送完毕,并要求释放传输连接。

(12)窗口:占2个字节,用来控制对方发送的数据量,单位是字节,指明对方发送窗口的上限。

(13)校验和:占2个字节,校验的范围包括首部和数据两个部分,计算校验和时需要在报文段前加上12个字节的伪首部。

(14)紧急指针:占2个字节,指出本报文段中紧急数据最后一个字节的序号。只有当紧急比特URG=1时才有效。

(15)选项:长度可变。TCP只规定了一种选项,即最大报文段长度MSS(Maximum Segment Size)。

说明:

连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端。接收方发送的确认信息中包含了自己剩余的缓冲区尺寸,剩余缓冲区空间的数量叫作窗口。

实验步骤:

1、启动wireshark抓包

2、地址栏输入网址并访问(如www.hstc.edu.cn

3、停止wireshark抓包

分析TCP报文

  1. 源端口(Source Port)和目的端口(Destination Port),各占2个字节。这两个值加上IP报头中的源主机IP地址和目的主机IP地址唯一确定一个TCP连接。本实验中源端口是55609,而目的端口是10007。
  2. 序号(Sequence number),占4个字节。表示在发送报文段中的第一个数据字节的顺序号。

  3. 确认号(Acknowledgment number),占4个字节。上次接收端已成功收到数据字节顺序号加1。只有ACK标志为1时确认序号字段才有效。

  4. 数据偏移,占4位,半个字节,表示报头长度(Header Length)。下图为32 bytes。

  5. 保留(Reserved),占6位。
  6. flag 控制位: URG/ACK/PSH/RST/SYN/FIN,占6位

  7. 窗口(Window size),占2个字节。下图表示实验窗口大小为65535

  8. 检验和(Checksum),占2个字节,此校验和是对整个TCP报文段,包括TCP头部和TCP数据进行计算所得。下图的校验和为0xb99b

  9. 紧急指针(Urgent pointer),占2个字节,只有当URG标志为1时紧急指针才有效,下图为1

  10. 选项(Options),字节数不固定,最常见的可选字段是最长报文大小,又称为MSS,下图是12字节

实验7 TCP连接建立与释放过程分

任务目的

1. 掌握TCP传输可靠性原理。

2. 掌握TCP连接建立与释放过

任务内容

1. 使用Wireshark抓取TCP连接建立与释放过程的数据包。

2. 分析TCP连接建立与释放过程中详细字段,对TCP工作特性做出总结。

3. 分析TCP可靠性在连接建立与释放过程中的具体体现,理解顺序号和确认号

在TCP保证传输可靠性中发挥的作用。查看Wireshark抓包页面。数据包列表的面板中会滚动显示所抓取的数据包,包括数据包的序号、时间戳、源地址、目标地址、协议、长度以及相关信息。

在数据帧部分,前14字节为以太网帧头部,之后的20字节为IP头部,后面的32字节为TCP头部数据,故而这里的头部长度为:32/4=8,即1000,加上后面的0000,即为80

三次握手(建立连接)

TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段,下图画出了三报文握手建立TCP连接的过程:

假定主机A运行的是TCP客户程序,而B运行TCP服务器程序,最初两端的TCP进程都处于CLOSED(关闭)状态,图中在主机下面的方框分别是TCP进程所处的状态,在开始阶段B的TCP服务器进程会先创建传输控制块TCB准备接受客户进程的连接请求,然后服务器进程就处于LISTEN(收听)状态等待客户的连接请求,如有则会立即作出响应,需要注意的是A主动打开连接,而B被动打开连接:

第一次握手:A的TCP客户进程首先创建传输控制模块TCB,然后在打算建立TCP连接时向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x,TCP规定SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号,这时TCP客户进程进入SYN-SENT(同步已发送)状态。

第二次握手:B收到连接请求报文段后,如果同意建立连接则向A发送确认,在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y,请注意这个报文段也不能携带数据,但同样要消耗掉一个序号,这时TCP服务器进程进入SYN-RCVD(同步收到)状态

第三次握手:TCP客户进程收到B的确认后还要向B给出确认,确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1,TCP的标准规定ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1,这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态

四次挥手(释放连接)

TCP连接释放过程比较复杂,在数据传输结束后通信的双方都可释放连接,现在A和B都处于ESTABLISHED状态,整个流程如下:

第一次挥手:A的应用进程先向其TCP发出连接释放报文段并停止再发送数据并主动关闭TCP连接,A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1,这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认,需要注意的是TCP规定FIN报文段即使不携带数据,它也消耗掉一个序号

第二次挥手:B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1,然后B就进入CLOSE-WAIT(关闭等待)状态,TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但是此时如果B发送数据,那么A仍要接收,也就是说从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间

第三次挥手:A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段,此时如果B已经没有要向A发送的数据,其应用进程就通知TCP释放连接,这时B发出的连接释放报文段必须使FIN=1,现假定B的序号为w(在半关闭状态B可能又发送了一些数据),B还必须重复上次已发送过的确认号ack=u+1,这时B就进入LAST-ACK(最后确认)状态,等待A的确认

第四次挥手:A在收到B的连接释放报文段后必须对此发出确认,在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号),然后进入到TIME-WAIT(时间等待)状态,需要注意的是现在TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED状态,时间MSL叫做最长报文段寿命(Maximum Segment Lifetime),RFC 793建议设为2分钟,但这完全是从工程上来考虑的,对于现在的网络MSL=2分钟可能太长了一些,因此TCP允许不同的实现可根据具体情况使用更小的MSL值,因此从A进入到TIME-WAIT状态后要经过4分钟才能进入到CLOSED状态才能开始建立下一个新的连接,当A撤销相应的传输控制块TCB后就结束了这次的TCP连接

很多人可能会问这里为什么A在TIME-WAIT状态必须等待2MSL的时间,主要有两个理由:

第一:为了保证A发送的最后一个ACK报文段能够到达B,这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器。最后A和B都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段,这样B就无法按照正常步骤进入CLOSED状态

第二:防止上一节提到的"已失效的连接请求报文段"出现在本连接中,A在发送完最后一个ACK报文段后再经过时间2MSL就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段,B只要收到了A发出的确认就进入CLOSED状态,同样B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接,我们注意到B结束TCP连接的时间要比A早一些。

连接重置

在理想情况中每一个连接都会以TCP终止来正常地结束,但在现实中连接经常会突然断掉,例如:攻击者在进行端口扫描被EDR等检测到后直接阻断连接,在这些情况下就需要使用设置了RST标志的TCP数据包,RST标志用来指出连接被异常中止或拒绝连接请求

下图给出了一个包含有RST数据包网络流量的例子,这个文件中的第一个数据包发自192.168.100.138,其尝试与192.168.100.1的80端口进行通信,这个主机并不知道192.168.100.1并没有在监听80端口,因为那是一个思科路由器并且没有配置Web接口,也就是说并没有服务监听80端口的连接,为了响应这个连接请求,192.168.100.1向192.168.100.138发送了一个数据包告诉它其对80端口的通信无效,图中展示了在第二个数据包的TCP头中这个连接尝试突然终止的情况,RST数据包除了包含RST和ACK标志外,没有任何其他的东西,之后也并没有额外的通信

TCP SYN扫描

TCP SYN扫描是一种常见的端口扫描技术,它发送一个TCP SYN包到目标主机的每个端口,然后等待目标主机的响应,如果目标主机响应TCP SYN/ACK包,那么这个端口就是开放的,如果目标主机响应RST包,那么这个端口就是关闭的,过滤语法如下:

tcp.flags.syn == 1 and tcp.flags.ack == 0

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值