TCP标志位文档格式.docx
《TCP标志位文档格式.docx》由会员分享,可在线阅读,更多相关《TCP标志位文档格式.docx(5页珍藏版)》请在冰豆网上搜索。
这个标志的数据包经常被用来进行端口扫描。
扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口;
但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手;
FIN:
表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送
FIN标志位的TCP数据包后,连接将被断开。
这个标志的数据包也经常被用于进行端口扫描。
当一个FIN标志的TCP数据包发送到一台计算机的特定端口,如果这台计算机响应了这个数据,并且反馈回来一个RST标志的TCP包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;
如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。
*SYN:
同步标志同步序列编号(SynchronizeSequenceNumbers)栏有效。
该标志仅在三次握手建立TCP连接时有效。
它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。
在这里,可以把TCP序列编
号看作是一个范围从0到4,294,967,295的32位计数器。
通过TCP连接交换的数据中每一个字节都经过序列编号。
在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。
*ACK:
确认标志确认编号(AcknowledgementNumber)栏有效。
大多数情况下该标志位是置位的。
TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示
远端系统已经成功接收所有数据。
*RST:
复位标志复位标志有效。
用于复位相应的TCP连接。
*URG:
紧急标
紧急(Theurgentpointer)标志有效。
紧急标志置位,*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个包在连接建立过程中的次序,为什么?
该连接访问的服务是什么服务?
0020005083aa4649
3edd339637a3a012...P..FI&
gt;
.3.7...003016a0
c4c00000020405b40402080ad7
9b004062b700564a2a01030302
b..VJ*
(1)002083aa0050339637a200
000000a002P3.7003016d0841d0000
020405b40402080a0056V00404a2a
0000000001030300J*
(2)002083aa0050339637a346493ede80
10P3.7.FI&
...003016d0f34b0000010108
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,二进制是00000010,即表示有syn没有ack。
(1)是第二次握手,flags位上为12,二进制是00010010,即表示有syn和ack。
(3)是第三次握手,flags位上为10,二进制是00010000,即表示有ack没有syn。
该连接访问的是80端口,是为HTTP(HyperTextTransportProtocol,超文本传输协议)开放的TCP拦截即TCPintercept,大多数的路由器平台都引用了该功能,其主要作用就是防止SYN泛洪攻击。
SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消
耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,
从而达到攻击的目的。
我们可以利用路由器的TCP拦截功能,使网络上的主机受到保护(以Cisco路由器为例)。
开
启TCP拦截分为三个步骤:
1.设置TCP拦截的工作模式TCP拦截的工作模式分为拦截和监视。
在拦截模式下,路由器审核所有的TCP连接,自身的负担加重,所以我们一般让路由器工作在监视模式,监视TCP连接的时间和数目,超出预定值则关闭连接。
格式:
iptcpinterceptmode
(intercept|watch)缺省为intercept2.设置访问表,以开启需要保护的主机格式:
access-list[100-199][deny|permit]tcpsourcesource-wildcarddestination
destination-wildcard举例:
要保护219.148.150.126这台主机access-list101permittcpanyhost219.148.150.1263.开启TCP拦截iptcpintercept
listaccess-list-number示例:
我们有两台服务器219.148.150.126和219.148.150.125需要进行保护,可以
这样配置:
iptcpinterceptlist101iptcpintercept
modewatchipaccess-list101permittcpany
host219.148.150.125ipaccess-list101permittcpany
host219.148.150.126经过这样的配置后,我们的主机
就在一定程度上受到了保护。
TCP(TransmissionControlProtocol)传输控制协议
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机)ACK(acknowledgement确认)
PSH(push传送)FIN(finish结束)RST(reset重置)URG(urgent紧急)
Sequencenumber(顺序号码)Acknowledgenumber(确认号码)
主机A发送位码为syn=1,随机产生seq
number=1234567的数据包到服务器,主
机B由SYN=1知道,A要求建立联机;
主机B收到请求后要确认联机信息,向A发送acknumber=(主机A的
seq+1),syn=1,ack=1,随机产生seq=7654321的包第三次握手:
主机A收到后检查acknumber是否正确,即第一次发送的seqnumber+1,以及位
码ack是否为1,若正确,主机A会再发送acknumber=(主机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状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据.
实例:
IP192.168.1.116.3337&
192.168.1.123.7788:
S3626544836:
3626544836
IP192.168.1.123.7788&
192.168.1.116.3337:
S1739326486:
1739326486ack3626544837
ack1739326487,ack1
192.168.1.116发送位码syn=1,随机产生seqnumber=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;
192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送acknumber=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;
第三次握手:
192.168.1.116收到后检查acknumber是否正确,即第一次发送的seqnumber+1,
以及位码ack是否为1,若正确,192.168.1.116会再发送acknumber=1739326487,ack=1,
192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。
图解:
一个三次握手的过程(图1,图2)(图1)
(图2)第一次握手的标志位(图3)我们可以看到标志位
里面只有个同步位,也就是在做请求(SYN)(图3)第二次握手的标志位(图4)我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN+ACK)(图4)第三次握手的标志位(图5)
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)(图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报文。