TCP标志位简析

Posted 精舞门2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP标志位简析相关的知识,希望对你有一定的参考价值。

 

 
TCP标志位简析
 
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包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。
 
需要说明的是,金山网镖的日志报告使用的不是这些标志位的全称,而是使用的这些标志位的首字母,比如拦截到一个包含FIN标志的TCP数据包将会报告x.x.x.x的TCP数据包:F。还有一点,你的日志可能报告x.x.x.x的TCP数据包:NULL,这是什么?NULL标明发送给你的数据包不包含任何标志位,你收到这种数据包,很多情况下意味着你被扫描,扫描者发送NULL数据包给你,如果你的计算机发送回去了一个FIN标志的TCP数据包,就表明他探测的端口在你的计算机上不存在,但是你的计算机就已经被确定存在了,这样他就可以使用其他的扫描方式进行端口探测。有一些特殊的扫描方式可以绕过不严谨的防火墙。
 
了解到了TCP标志位的含义,就可以了解TCP的三次握手是怎么进行的了:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手。之后,一个TCP连接建立,开始通讯。

android studio for android learning (二十五 )activity的启动模式详解与标志位简析

1.activity的存储——任务栈也称task栈。

任务栈是一种”后进先出”的栈结构,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们放入任务栈中,每一次back就会有一个Activity出栈,直到栈空为止,当栈中无任何Activity的时候,系统就会回收这个任务栈。

2.四种启动模式的定义

A. standard:标准模式

模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。当我们用ApplicationContext启动一个standard模式的Activity,会报AndroidRuntimeException错误,因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但由于非Activity的Context并没有所谓的任务栈,所以报错。解决方案添加FLAG_ACTIVITY_NEW_TASK标记位,为它创建一个新的任务栈,实际上是以singleTask模式启动的。

B. singleTop:栈顶复用模式

如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例),它的onNewIntent方法会被回调,但不会调用onCreate,onStart。。

C. singleTask:栈内服用模式

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈,是一种单实例模式。如果栈中不存在该实例,将会创建新的实例放入栈中。

D. singleInstance:单实例模式

这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,就是具有此种模式的Activity,系统会为它创建一个新的任务栈,然后独自在这个任务栈中。

3.activity常用的标志位

  • (1). Intent.FLAG_ACTIVITY_NEW_TASK,是为Activity指定“singleTask”启动模式

  • (2). Intent.FLAG_ACTIVITY_SINGLE_TOP,是为Activity指定“singleTop”启动模式

  • (3). FLAG_ACTIVITY_CLEAR_TOP,如果跟singleTask启动模式一起出现,如果被启动的Activity已经存在实例,则onNewIntent方法会被回调,如果被启动的Activity采用standard模式启动,那么连同它跟它之上的Activity都要出栈,并且创建新的实例放入栈顶。

  • (4). FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,新的Activity不会在最近启动的Activity的列表中保存。等同于指定属性android:excludeFromRecents=”true”

  • (5)FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:如果一个Intent中包含此属性,则它转向的那个Activity以及在那个Activity其上的所有Activity都会在task重置时被清除出task。当我们将一个后台的task重新回到前台时,系统会在特定情况下为这个动作附带一个FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,意味着必要时重置task,这时FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET就会生效。经过测试发现,对于一个处于后台的应用,如果在主选单点击应用,这个动作中含有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,长按Home键,然后点击最近记录,这个动作不含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,所以前者会清除,后者不会。

  • (6)FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:这个标记在以下情况下会生效:1.启动Activity时创建新的task来放置Activity实例;2.已存在的task被放置于前台。系统会根据affinity对指定的task进行重置操作,task会压入某些Activity实例或移除某些Activity实例


4.如何给Activity指定启动模式

1.AndroidManifest中为Activity指定启动模式

android:launchMode=”singleTask”

2.通过在Intent中设置标记位来指定Activity的启动模式

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

3.两种方式的区别

优先级上第二种的优先级要高于第一种,第一种方式无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,第二种方式无法为Activity指定singleInstance模式。

5.补充

singleTop与设置标记位FLAG_ACTIVITY_SINGLE_TOP效果相同,当该实例位于栈顶时就不再创建同时onNewIntent方法会被回调,在此方法中可以得到回调信息,如Activity A跳转本身,点击多次都不再跳转新的界面,但是当A->B->A1时,A不在栈顶产生新的实例A1,退出时A1->B->A。

singleTask与设置标记位FLAG_ACTIVITY_NEW_TASK效果相同,与singleTop一样系统会回调其onNewIntent方法,当跳转本身时不会再产生新实例,如果已有实例会把其调到栈顶,如果没有则会创建并压入栈中,如A->B->C->A,A为singleTask如果此时退出则直接退到桌面,因在A实例已存在把其调到栈顶时会把栈内A上面的BC全部出栈,如A->B->C,退出时C->B->A。


专注于AR的在移动端的实现,如果你还有问题没解决,你可以加入我们一起交流。或是关注我们的技术公众号,这是提供技术干货的地方,你有干货可以向我们推荐。

如果你觉得写的不错,对你有用,请在下面点个 支持一下,有问题可以在下面留言评论。


以上是关于TCP标志位简析的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议的RST标志位

TCP中的URG标志与PSH标志有什么不同?

TCP Flags标志位介绍

TCP协议中的标志位

23-TCP 协议(紧急标志)

22-TCP 协议(PSH 标志)