当前位置: 首页 > news >正文

TCP协议中FLAG的含义

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

TCP FLAG 标记

基于标记的TCP包匹配经常被用于过滤试图打开新连接的TCP数据包。

  • TCP标记和他们的意义如下所列:

    * F : FIN - 结束; 结束会话
    * S : SYN - 同步; 表示开始会话请求
    * R : RST - 复位;中断一个连接
    * P : PUSH - 推送; 数据包立即发送
    * A : ACK - 应答
    * U : URG - 紧急
    * E : ECE - 显式拥塞提醒回应
    * W : CWR - 拥塞窗口减少

示例:

  • 三次握手Three-way Handshake

一个虚拟连接的建立是通过三次握手来实现的

1. (B) --> [SYN] --> (A)

假如有服务器A、客户机B. 当B要和A通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.

注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 只有当A收到B发来的SYN包,才可建立连接,除此之外别无他法。

2. (B) <-- [SYN/ACK] <--(A)

接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.

注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (B) --> [ACK] --> (A)

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成。

注意: ACK包就是仅ACK 标记设为1的TCP包.

特别注意:需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位

 

PS:这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是个好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包

  • 四次握手Four-way Handshake

四次握手用来关闭已建立的TCP连接

1. (B) --> ACK/FIN --> (A)

2. (B) <-- ACK <-- (A)

3. (B) <-- ACK/FIN <-- (A)

4. (B) --> ACK --> (A)

注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的

  • 连接复位Resetting a connection

四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记。

注意:RST包是可以不要收到方确认的

  • 无效的TCP标记Invalid TCP Flags

到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG (Urgent)标记.

最常见的非法组合是SYN/FIN 包. 注意:由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击.

由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,很你的网络肯定受到攻击了。

别的已知的非法包有FIN (无ACK标记)和"NULL"包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有 ACK 标记。"NULL"包就是没有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。

到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。

转载于:https://my.oschina.net/mickelfeng/blog/1506364

相关文章:

  • TypeScript学习笔记(六):泛型
  • Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关
  • Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
  • java中你确定用对单例了吗?
  • 深入分析Sleep(0)与Sleep(1)的区别
  • swift3.0常用操作包含删除字符串(string),更换字符串,插入字符串
  • 第21章 RTX 低功耗之睡眠模式
  • Spring思维导图(AOP篇)
  • layer close 关闭层IE9-浏览器崩溃问题解决
  • Java-static
  • 克隆用户过狗提权
  • Linux中如何查看显卡硬件信息
  • 搭建本地yum源服务器
  • Linux下NMAP常用扫描简介(一)
  • 利用Sympy计算sin1°的最小多项式
  • #Java异常处理
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 11111111
  • Create React App 使用
  • IndexedDB
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • React as a UI Runtime(五、列表)
  • select2 取值 遍历 设置默认值
  • Vue.js源码(2):初探List Rendering
  • yii2中session跨域名的问题
  • 讲清楚之javascript作用域
  • 数据结构java版之冒泡排序及优化
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 关于Android全面屏虚拟导航栏的适配总结
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $.ajax()方法详解
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (LeetCode) T14. Longest Common Prefix
  • (Ruby)Ubuntu12.04安装Rails环境
  • (独孤九剑)--文件系统
  • (分布式缓存)Redis分片集群
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十三)Flask之特殊装饰器详解
  • (四)Android布局类型(线性布局LinearLayout)
  • (五)MySQL的备份及恢复
  • **CI中自动类加载的用法总结
  • .libPaths()设置包加载目录
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net MySql
  • .NET NPOI导出Excel详解
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示