vlambda博客
学习文章列表

TCP协议以及常见问题报文分析

一、TCP的概念

TCP(Transmission  Control  Protocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。TCP在IP报文的协议号是6。
二、TCP的报文结构

Source Port

源端口,标识发送方的应用进程

Destination  Port

目的端口,标识接收方的应用进程

Sequence Number

列号:用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。保证数据传输的有序性

Acknowledge Number

确认号:对收到的数据进行确认确认序列号为成功收到的数据序列号加1。

Header  length

表示头部占32bit字的数目,它能表达的TCP头部最大长度为60字节

FLAG字段(8位)

ACK

确认号标志,置1表示确认号有效,表示收到端对端的特定数据

RST

复位标志,

1、置1表示拒绝错误和非法的数据包,如果接收到RST位时候,通常发生了某些错误

2、复位错误的连接也用来拒绝非法数据和请求。

3、RST可能被接收方或者中间设备置位

RST置位的原因

1、服务器端口没有打开(listen)
2、服务器响应太慢,用户终止连接
3、网络攻击
4、其他

所以,正常关闭TCP连接的方法有两种:四次挥手和RST置位的报文

SYN

同步序号标志,置1表示同步序号,用来建立连接

FIN

结束标志,置1表示连接将被断开,用于拆除连接

URG

紧急标志,置1的会先发送

window

窗口,表示接收端期望通过单次确认而收到的数据的大小。由于该字段为16位,所以窗口大小的最大值为65535字节该机制通常用来进行流量控制。

checksum

校验整个TCP报文段,包括TCP头部和TCP数据。该值由发送端计算和记录并由接收端进行验证。

TCP协议以及常见问题报文分析

三、TCP的传输过程
1、TCP建立连接的过程(三次握手)

tcp是可靠的传输,需要通过三次握手来建立连接。

TCP协议以及常见问题报文分析

(1)主机A(通常也称为客户端)发送一个标识了SYN的数据段,表示期望与服务器A建立连接,此数据段的序列号(seq)为a。

(2)服务器A回复标识了SYN+ACK(回应主机A的SYN报文,并发送SYN请求建立连接报文)的数据段,此数据段的序列号(seq)为b,确认序列号为主机A的序列号加1(a+1),以此作为对主机A的SYN报文的确认。

(3)主机A发送一个标识了ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文的确认。

     即过程为:主机A发送建立连接请求,然后服务器A回应并发送服务器A建立连接请求,最后主机A进行回应,建立完成。
2、TCP的流量控制

TCP协议以及常见问题报文分析

(1)TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。

(2)主机A和服务器A之间通过滑动窗口来实现流量控制。如图只考虑主机A发送数据给服务器A时,服务器A通过滑动窗口进行流量控制。

  • A向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。

  • 服务器A收到第3个数据段后,缓存区满,第4个数据段被丢弃。

  • 服务器以ACK 3073响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。

3、TCP关闭连接的过程(四次挥手)

TCP协议以及常见问题报文分析

TCP支持全双工模式传输数据,同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。 TCP 连接的建立是一个三次握手的过程,而 TCP 连接的终止则要经过四次握手

如图所示:

(1)主机A想终止连接,于是发送一个标识了FINACK的数据段,序列号为a,确认序列号为b

(2)服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机AFIN报文的确认。

(3)服务器A想终止连接,于是向主机A发送一个标识了FINACK的数据段,序列号为b,确认序列号为a+1

(4)主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器AFIN报文的确认。

以上四次交互便完成了两个方向连接的关闭。

4、TCP的状态总结

TCP协议以及常见问题报文分析

四、TCP抓包常见问题分析

1、TCP Previous segment not captured

在TCP传输过程中,同一台主机发 出的数据段应该是连续的, 即后一个 包的Seq号等于前一个包的Seq + Le n 如果Wiresha rk发 现后一 个包的Seq号大于前一个包的Se q+Len,就知道中间缺失了一段数据。如图所示例:72752 之后应该是74160,之后是75568、76976。此时未收到75568,提示 TCP Previous segment not captured。

TCP协议以及常见问题报文分析

前一个分片丢失,有可能是网络中确实丢失了,或者晚到了,也有可能是wireshark本身并没有抓到

2、TCP Out-Of-Order

TCP Out-Of-Order指的是TCP发送端传输过程中报文乱序了。Wireshark判断TCP out-of-order是基于TCP包中SEQ number并非期望收到的下一个SEQ number,则判断为out-of-order。因此,出现TCP out-of-order时,很大可能是TCP存在乱序或丢包,导致接收端的seq number不连续。接上图分析:74160出现在76976之后,所以被判定为乱序

有可能因为网络拥塞的情况下,TCP包不能按顺序到达,如果抓包中出现大量的out-of-order包,则说明网络存在较大的TCP乱序或丢包。

3、TCP Dup ack XXX #X

TCP协议以及常见问题报文分析

TCP dup ack XXX#X表示第几次重新请求某一个包,#前面的XXX表示第几个包(不是Seq),#后的X表示第几次请求。重复ack,当网络中存在乱序或者丢包时,将会导致接收端接收到的seq number不连续。此时接收端会向发送端回复重复ack,ack值为期望收到的下一个seq number。重复ack数大于等于3次将会触发快速重传

重复ACK标志,丢包或者乱序的情况下,会出现该标志。

4、 TCP  Retransmission

TCP协议以及常见问题报文分析

TCP超时重传。当同时抓到2次同一数据报文,且没有抓到初传包的反馈ack,wireshark就会判断发生了重传,标记为TCP Retransmission。

 如果一个包丢了,又没有后续包可以在接收方触发Dup Ack,或者Dup Ack也丢失的话就不会快速重传。这种情况下发送方只能等到超时再重传。
5、TCP Fast Retransmission

TCP快速重传,一般快速重传算法在收到三次冗余的Ack,即三次TCP dup ack XXX#3后,发送端进行快速重传。

6、 TCP  Spurious  Retransmission

TCP协议以及常见问题报文分析

TCP虚假重传。当抓到2次同一包数据时,wireshark判断网络发生了重传,同时,wireshark抓到初传包的反馈ack,因此wireshark判断初传包实际并没有丢失,因此称为虚假重传。 

7、TCP RST

TCP协议以及常见问题报文分析

是TCP协议结束异常连接的一种方式,通过flag中的reset=1标记。当TCP连接无法通过正常的4次挥手结束时,一方可以通过发送携带reset标志的TCP包结束TCP连接。 

旁挂设备进行阻断可以伪造RST报文达到阻断的效果

收到RST置位报文可能的原因:

1、被安全设备拦截;

2、对方端口未打开,发生在连接建立;

3、全连接队列满,发生在连接建立;

4、长时间无流量超时,导致连接被清除

5、超过超时重传次数、网络暂时不可达

6、非正常报文等

8、TCP acked unseen segment

ACK指向未知的TCP片段。wireshark上反馈是ACK指到不存在的TCP包。很可能是wireshark漏抓了这个包,但却抓到了对端反馈的该报文的ack包。如图。
9、TCP port numbers reused
tcp端口重复使用。 在高并发的场景下,TIME_WAIT连接存在,属于正常现象。 线上场景中,持续的高并发场景 一些部分TIME_WAIT连接被回收,但新的TIME_WAIT连接产生; 一些极端情况下,会出现大量的TIME_WAIT。 在出现大量TIME_WAIT的情况下,可能就会发生此种现象