ETH-TCP协议与常见问题分析

发布时间 2023-06-29 12:03:16作者: WCH_CH32

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数据。该值由发送端计算和记录并由接收端进行验证。

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

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

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

即过程为:客户A发送建立连接请求,然后服务器B回应并发送服务器B建立连接请求,最后客户A进行回应,建立完成。

TCP的流量控制

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

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

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

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

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

TCP关闭连接的过程

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

如图所示:

(1)客户A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为u。

(2)服务器B回应一个标识了ACK的数据段,序列号为v,确认序号为u+1,作为对客户A的FIN报文的确认。

(3)服务器B想终止连接,于是向客户A发送一个标识了FIN,ACK的数据段,序列号为w,确认序列号为u+1。

(4)客户A回应一个标识了ACK的数据段,序列号为u+1,确认序号为w+1,作为对服务器B的FIN报文的确认。

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

TCP的状态总结

TCP抓包常见问题分析

1、TCP Previous segment not captured

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

前一个分片丢失,有可能是网络中确实丢失了,或者晚到了,也有可能是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 dup ack XXX#X表示第几次重新请求某一个包,#前面的XXX表示第几个包(不是Seq),#后的X表示第几次请求。重复ack,当网络中存在乱序或者丢包时,将会导致接收端接收到的seq number不连续。此时接收端会向发送端回复重复ack,ack值为期望收到的下一个seq number。重复ack数大于等于3次将会触发快速重传重复ACK标志,丢包或者乱序的情况下,会出现该标志。

4、TCP Retransmission

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

7、TCP RST

是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的情况下,可能就会发生此种现象