TCP标志位
URG:此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;
ACK:此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为0;
PSH:这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;
RST:这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包;
SYN:表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被相应的时候,SYN=1,ACK= 1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手;
FIN:表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。当一个FIN标志的TCP数据包发送到一台计算机的特定端口,如果这台计算机响应了这个数据,并且反馈回来一个RST标志的TCP包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。
*SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把 TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。
*ACK:确认标志
确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
*RST:复位标志
复位标志有效。用于复位相应的TCP连接。
*URG:紧急标志
紧急(The urgent pointer) 标志有效。紧急标志置位,
*PSH:推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
*FIN:结束标志
带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。
.TCP的几个状态对于我们分析所起的作用。在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。
了解到了TCP标志位的含义,就可以了解TCP的三次握手是怎么进行的了:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手。之后,一个TCP连接建立,开始通讯。
简述TCP协议连接建立时3次握手的过程。根据TCP头部,说明下列3个包在连接建立过程中的次序,为什么?该连接访问的服务是什么服务?
0020 00 50 83 aa 46 49 3e dd 33 96 37 a3 a0 12 …P..FI>.3.7…
0030 16 a0 c4 c0 00 00 02 04 05 b4 04 02 08 0a d7 9b …………….
0040 62 b7 00 56 4a 2a 01 03 03 02 b..VJ*…. (1)
0020 83 aa 00 50 33 96 37 a2 00 00 00 00 a0 02 …..P3.7…….
0030 16 d0 84 1d 00 00 02 04 05 b4 04 02 08 0a 00 56 ……………V
0040 4a 2a 00 00 00 00 01 03 03 00 J*…….. (2)
0020 83 aa 00 50 33 96 37 a3 46 49 3e de 80 10 …..P3.7.FI>…
0030 16 d0 f3 4b 00 00 01 01 08 0a 00 56 4a 36 d7 9b …K…….VJ6..
0040 62 b7 b. (3)
解:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
(2)是第一次握手,flags位上为02,二进制是0000 0010,即表示有syn没有ack。
(1)是第二次握手,flags位上为12,二进制是0001 0010,即表示有syn和ack。
(3)是第三次握手,flags位上为10,二进制是0001 0000,即表示有ack没有syn。
该连接访问的是80端口,是为HTTP(HyperText Transport Protocol,超文本传输协议)开放的
TCP拦截即TCP intercept,大多数的路由器平台都引用了该功能,其主要作用就是防止SYN泛洪攻击。SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。我们可以利用路由器的TCP拦截功能,使网络上的主机受到保护(以Cisco路由器为例)。
开启TCP拦截分为三个步骤:
1. 设置TCP拦截的工作模式
TCP拦截的工作模式分为拦截和监视。在拦截模式下,路由器审核所有的TCP连接,自身的负担加重,所以我们一般让路由器工作在监视模式,监视TCP连接的时间和数目,超出预定值则关闭连接。
格式:ip tcp intercept mode (intercept|watch)
缺省为intercept
2. 设置访问表,以开启需要保护的主机
格式:access-list [100-199] [deny|permit] tcp source source-wildcard
destination destination-wildcard
举例:要保护219.148.150.126这台主机
access-list 101 permit tcp any host 219.148.150.126
3. 开启TCP拦截
ip tcp intercept list access-list-number
示例:我们有两台服务器219.148.150.126和219.148.150.125需要进行保护,可以这样配置:
ip tcp intercept list 101
ip tcp intercept mode watch
……..
ip access-list 101 permit tcp any host 219.148.150.125
ip access-list 101 permit tcp any host 219.148.150.126
经过这样的配置后,我们的主机就在一定程度上受到了保护。
TCP(Transmission Control Protocol) 传输控制协议
TCP 是主机对主机层的传输控制协议, 提供可靠的连接服务, 采用三次握手确认建立一个连接:
位码即 tcp 标志位, 有 6 种标示:SYN(synchronous 建立联机) ACK(acknowledgement 确认)
PSH(push 传送) FIN(finish 结束) RST(reset 重置) URG(urgent 紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
第一次握手:主机 A 发送位码为 syn=1, 随机产生 seq number=1234567 的数据包到服务器, 主
机 B 由 SYN=1 知道, A 要求建立联机;
第二次握手:主机 B 收到请求后要确认联机信息,向 A 发送 ack number=(主机 A 的
seq+1),syn=1,ack=1, 随机产生 seq=7654321 的包
第三次握手:主机 A 收到后检查 ack number 是否正确,即第一次发送的 seq number+1, 以及位
码 ack 是否为 1,若正确,主机 A 会再发送 ack number=(主机 B 的 seq+1),ack=1,主机 B 收到
后确认 seq 值与 ack=1 则连接建立成功。
完成三次握手,主机 A 与主机 B 开始传送数据。
在 TCP/IP 协议中, TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送 syn 包(syn=j) 到服务器,并进入 SYN_SEND 状态,等待
服务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN
包(syn=k),即 SYN+ACK 包,此时服务器 进入 SYN_RECV 状态; 第三次握手:客户端收到服
务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进
入 ESTABLISHED 状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
实例:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116 发送位码 syn=1, 随机产生 seq number=3626544836 的数据包到
192.168.1.123,192.168.1.123 由 SYN=1 知道 192.168.1.116 要求建立联机;
第二次握手:192.168.1.123 收到请求后要确认联机信息,向 192.168.1.116 发送 ack
number=3626544837,syn=1,ack=1, 随机产生 seq=1739326486 的包;
第 三次握手:192.168.1.116 收到后检查 acknumber 是否正确, 即第一次发送的 seqnumber+1,
以及位码 ack 是否为 1,若正确,192.168.1.116 会再发送 ack number=1739326487,ack=1,
192.168.1.123 收到后确认 seq=seq+1,ack=1 则连接建立成功。
图解:
一个三次握手的过程(图 1,图 2)
【转】TCP标志位详解及tcp拦截配置X
(图 1)
【转】TCP标志位详解及tcp拦截配置
(图 2)
第一次握手的标志位(图 3)
我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)
【转】TCP标志位详解及tcp拦截配置
(图 3)
第二次握手的标志位(图 4)
我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)
【转】TCP标志位详解及tcp拦截配置
(图 4)
第三次握手的标志位(图 5)
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)
【转】TCP标志位详解及tcp拦截配置
(图 5)
一个完整的三次握手也就是 请求—应答—再次确认
四次分手:
由于 TCP 连接是全双工的, 因此每个方向都必须单独进行关闭。 这个原则是当一方完成它的
数据发送任务后就能发送一个 FIN 来终止这个方向的连接。 收到一个 FIN 只意味着这一方向上
没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主
动关闭,而另一方执行被动关闭。
(1)客户端 A 发送一个 FIN,用来关闭客户 A 到服务器 B 的数据传送(报文段 4)。
(2)服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1(报文段 5)。
和 SYN 一样,一个 FIN 将占用一个序号。
(3)服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A(报文段 6)。
(4)客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1(报文段 7)。
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK
和 SYN(ACK 起应答作用, 而 SYN 起同步作用) 放在一个报文里来发送。 但关闭连接时, 当收到
对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发
送给对方了,所以你可以未必会马上会关闭 SOCKET, 也即你可能还需要发送一些数据给对方之
后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN
报文多数情况下都是分开发送的。
2.为什么 TIME_WAIT 状态还需要等 2MSL 后才能返回到 CLOSED 状态?
这是因为虽然双方都同意关闭连接了, 而且握手的 4 个报文也都协调和发送完毕, 按理可以
直接回到 CLOSED 状态(就好比从 SYN_SEND 状态到 ESTABLISH 状态那样);但是因为我们必须
要假想网络是不可靠的,你无法保证你最后发送的 ACK 报文会一定被对方收到,因此对方处于
LAST_ACK 状态下的 SOCKET 可能会因为超时未收到 ACK 报文,而重发 FIN 报文,所以这个
TIME_WAIT 状态的作用就是用来重发可能丢失的 ACK 报文。