TCP 协议作用

TCP 协议使用的是面向连接的方法进行通信的,其作用如下:

  • 面向流的处理:TCP 以流的方式处理数据。换句话说,TCP 可以一个字节一个字节地接收数据,而不是一次接收一个预订格式的数据块。TCP 把接收到的数据组成长度不等的段,再传递到网际层。
  • 重新排序:如果数据以错误的顺序到达目的地,TCP 模块能够对数据重新排序,来恢复原始数据。
  • 流量控制:TCP 能够确保数据传输不会超过目的计算机接收数据的能力。
  • 优先级与安全:为 TCP 连接设置可选的优先级和安全级别。
  • 适当的关闭:以确保所有的数据被发送或接收以后,再进行关闭连接。

TCP 工作模式

TCP 协议的数据包进行传输采用的是服务器端和客户端模式。发送 TCP 数据请求方为客户端,另一方则为服务器端。客户端要与服务器端进行通信,服务器端必须开启监听的端口,客户端才能通过端口连接到服务器,然后进行通信。

TCP报文格式解析

上图中 TCP 报文中每个字段的含义如下:

源端口和目的端口字段

  • TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
  • TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。

序列号字段

CP序列号(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。

确认号字段

TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。

数据偏移字段

TCP 首部长度(Header Length):数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,占 4 位。其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。

保留字段

保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。

标志位字段

  • CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
  • ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
  • URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
  • ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
  • PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
  • RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
  • SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
  • FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。

结合wireshark抓取的数据报进一步观察标志位字段:

窗口大小字段

窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。

TCP 校验和字段

校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。

紧急指针字段

紧急指针(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。

可选项字段

选项(Option):长度不定,但长度必须是 32bits 的整数倍。

TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认。TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接。
下面详细讲解三次握手的过程。

第 1 次握手

第 1 次握手建立连接时,客户端向服务器发送 SYN 报文(SEQ=x,SYN=1),并进入 SYN_SENT 状态,等待服务器确认,如图所示。

第 2 次握手

第 2 次握手实际上是分两部分来完成的,即 SYN+ACK(请求和确认)报文。

  • 服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1)。
  • 服务器再向客户端发送一个 SYN 包(SEQ=y)建立连接的请求,此时服务器进入 SYN_RECV 状态,如图所示。

第 3 次握手

第 3 次握手,是客户端收到服务器的回复(SYN+ACK 报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入 ESTABLISHED 状态,完成 3 次握手,如图所示。

SEQ 表示请求序列号,ACK 表示确认序列号,SYN 和 ACK 为标志位。

分析握手过程中字段的变化

我们知道每一次握手时,TCP 报文中标志位的值是不同的。为了更好地分析 3 次握手时每个标志位的变化,下面以抓包方式分析每个数据包的信息。

【实例】使用 Wireshark 捕获 TCP 连接数据包并进行分析。

1) 捕获到 3 次握手包,如图所示。

图中,第 22 个数据包的源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.131。

在 Transmission Control Protocol 中可以看到,Flags 为 SYN,并且值设置为 1,表示该数据包是主机 192.168.59.135 向主机 192.168.59.131 发起的请求,希望建立 TCP 连接。

Sequence number 表示请求序列号 EQ,值为 0,是由主机 192.168.59.135 随机生成的。

2) 选择第 23 个数据包进行查看,如图所示。

该数据包源 IP 地址为 192.168.59.131,目标 IP 地址为 192.168.59.135。

在 Transmission Control Protocol 中可以看到,Flags 为(SYN,ACK),并且将 SYN 置为 1,表示该数据包是主机 192.168.59.131 用来回复主机 192.168.59.135 发送的 TCP 连接请求。

Acknowledgment number 表示 ACK,值为 1。该值是回复主机 192.168.59.135 发来的连接请求 SEQ,因此在 SEQ 的基础上加 1,以代表确认。

Sequence number 值为 0,该值是由主机 192.168.59.131 生成的,是向主机 192.168.59.135 发送的 SYN,表示同意该主机发来的连接请求。

3) 选择第 24 个数据包进行查看,如图所示。

源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.131。

在 Transmission Control Protocol 中可以看到,Flags 为 ACK。表示该数据包是主机 192.168.59.135 对主机 192.168.59.131 发来的同意连接数据包后做出的确认回复。

Acknowledgment number 的值为 1,该值是在主机 192.168.59.131 发来的 SEQ 的基础上加 1 得到的。

Sequence number 的值为 1,表示收到主机 192.168.59.131 发来的同意连接数据包后,再次向该主机发送连接请求,表示要连接了。

TCP扫描

  1. TCP SYN Ping扫描: nmap -PS x.x.x.x 通常目标主机被防火墙阻止请求时,可以使用TCP SYN Ping扫描来针对主机进行存活判断。
  2. TCP ACK Ping扫描nmap -PA x.x.x.x 使用这种方式扫描可以探测阻止SYN或者ICMP Echo请求的主机,提高通过防火墙的的概率
  3. TCP连接扫描:nmap -sT x.x.x.x 是TCP最基础的扫描方式,
  4. TCP敞口扫描: nmap -sW x.x.x.x
  5. TCP自定义扫描,Nmap高级用法,--scanflags选项可以通过指定任意的TCP标志来进行扫描,TCP标志URG、ACK、PSH、RST、SYN、FIN任何组合都可以,例如--scanflags URGACKPSHRSTSYNFIN设置所有的标志位,中间没有空格,若是不指定标志位,使用SYN扫描方式扫描。

TCP防御扫描

已知主机A的IP地址为192.168.70.128 ,主机B的IP弟子为192.168.70.1在主机192.168.70.128上实施防御扫描。

执行命令如下:

  1. netstat -l 查看本机开放的端口,只开启了 80 端口

2.干扰主机B,使B以为除了80端口以外,其它端口都是开放状态,执行命令如下。

netwox 79 -i 192.168.70.128 -p 1-5226,5230-65535

检测网络性能:TCP 协议通过滑动窗口方式,可以充分利用网络性能传输数据。所以,利用 TCP 传输机制,可以检测网络性能。

netwox 工具提供了相关模块来实现该功能,可以使用编号为 155 的模块建立 TCP 服务器,使用编号为 156 的模块建立 TCP 客户端。然后,使用 TCP 客户端连接 TCP 服务器端,测试网络性能。

【实例】已知主机 A 的 IP 地址为 192.168.59.135,主机 B 的 IP 地址为 192.168.59.131。使用这两个主机进行网络性能检测。具体步骤如下:

1) 将主机 A 设置为 TCP 服务器端,监听的端口为 5228,执行命令如下:

root@daxueba:~# netwox 155 -P 5228

执行命令后没有任何输出信息。

2) 将主机 B 设置为 TCP 客户端,并连接 TCP 服务器端,执行命令如下:

root@daxueba:~# netwox 156 -p 5228 -i 192.168.59.135

输出信息如下:

37226820 Bytes/sec [=~=  333636 kbit/sec]    jitter=    1420 usec
21462698 Bytes/sec [=~=  192354 kbit/sec]    jitter=    12990 usec
46895528 Bytes/sec [=~=  420290 kbit/sec]    jitter=    14478 usec
33407776 Bytes/sec [=~=  299409 kbit/sec]    jitter=    2011 usec
23745772 Bytes/sec [=~=  212815 kbit/sec]    jitter=    547 usec

以上输出信息显示了每秒传输位数和 TCP 的抖动(jitter)。

3) 为了验证测试过程,通过抓包查看,如图所示。

其中,第 5~7 个数据包为 3 次握手包。

检查盲注攻击漏洞

发送一个 [SYN] 请求包,会得到一个包含序列号的 [SYN,ACK] 响应包。连续发送 [SYN] 请求包时,会得到一系列的序列号。如果序列号的值是有规律的,那么当请求主机不再发送 [SYN] 请求包时,攻击者可以利用发现的规律预测到下一个序列号的值。该现象被称为 TCP 序列号预测漏洞。

为了判断目标主机上是否存在该漏洞,netwox 工具提供了编号为 77 的模块来实现。它可以向目标主机发送大量的 [SYN] 请求包。如果目标主机端口处于开放状态,可以得到一系列的序列号值。通过比对这些值是否具有规律性,可以判断是否存在该漏洞。

【实例】检查目标主机是否存在 TCP 序列号预测漏洞。

1) 对目标主机进行检查,执行命令如下:

netwox 77 -i 36.152.44.96 -p 80

根据输出信息可以了解到,每次的差值都是随机的,说明序列号没有规律,证明目标主机不存在盲注攻击漏洞。

flag push tcp 作用_TCP协议超详细解析及攻击/防范相关推荐

  1. flag push tcp 作用_TCP/IP协议到底在讲什么?

    题主,你之所以不知道那套书在讲什么,是因为你还没有认识到网络协议有什么用,怎么用,以什么形式在使用,网络协议的概念很简单,就几句话,你只知道网络协议的概念,只知道很多大神都推荐这套书,都强调网络协议的 ...

  2. Android技能树 — 网络小结(6)之 OkHttp超超超超超超超详细解析

    前言: 本文也做了一次标题党,哈哈,其实写的还是很水,各位原谅我O(∩_∩)O. 介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看 ...

  3. 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析

    2019/07/13 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析 发表日期:2019/07/13 单片机开发板:巫妖王2.0, 使用同款开发板可直接上板测试 文档说明: 实现功能 : 一 ...

  4. 计算机网络之交换机的工作原理---超详细解析,谁都看得懂!!

    在了解交换机的工作原理之前,我们先要了解几个概念. 一.相关概念  1.OSI七层模型是哪七层? 自上而下分别是: 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 交换机工作在数据链路层, ...

  5. tcp分包传图片 如何还原_技术控丨超详细解析TCP重传机制

    作者:Zhang_Jiawen : 来自:Dell技术社区 TCP 的主要任务是很简单:打包和发送数据.TCP 与其他协议的不同之处在于使用滑动窗口来管理基本数据收发过程,同时确保数据流的有效及可靠传 ...

  6. 【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解...

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由E ...

  7. 超详细解析python爬虫爬取京东图片

    超详细图片爬虫实战 实例讲解(京东商城手机图片爬取) 1.创建一个文件夹来存放你爬取的图片 2.第一部分代码分析 3.第二部分代码分析 完整的代码如下所示: 升级版代码: 爬取过程中首先你需要观察在手 ...

  8. VUE 钩子函数超详细解析

    点击上方蓝色字体关注我吧 一起学习,一起进步,做积极的人! 前言 Vue 实例在被创建时,会经过一系列的初始化过程,初始化过程中会运行一些函数,叫做生命周期钩子函数,通过运用钩子函数,用户在可以在Vu ...

  9. iic总线从机仲裁_IIC协议底层原理超详细解析!示波器,逻辑分析仪多图预警

    1. 协议基础 1.1.     协议简介 IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发.主要是用来方便微控制 ...

最新文章

  1. Spring Boot + MyBatis + Druid + PageHelper 实现多数据源并分页
  2. MASK-RCNN是什么?MASK(掩膜)又是什么?
  3. 年化收益17.1%!这个看基本面长线炒股的AI有点厉害
  4. nginx一招配置,帮你快速隐藏php后缀名
  5. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了
  6. 视频教程-【国内首套H3C V7交换机实战课程-2】以太网端口和链路聚合配置与管理-H3C认证
  7. 游戏思考06:游戏核心逻辑设计—战斗系统基础及进阶(未完待续,12/14)
  8. 4PCS、super4PCS粗配准算法理解
  9. UDP协议全面实验分析详解
  10. Latex特殊符号、公式、颜色整合
  11. 根据月份,计算当月周数(非自然周)
  12. 在docker容器中操作es,并给es7.6添加用户鉴权设置密码
  13. 关于drawInRect: withAttributes: 等新方法的使用
  14. Android客户端与PC服务器如何实现Socket通信
  15. 阿里云生态峰会实录(上)
  16. 取消远程计算机控制,怎么脱离远程计算机控制?
  17. sql tuning advisor
  18. ES6新特性总结-面试必会
  19. jpa整合querydsl实现简单查询以及左联查询
  20. java selector 源码_Java NIO——Selector机制源码分析---转

热门文章

  1. java 判断date为空_java – 如何检查JSONArray元素是否为空
  2. android studio 本地html,android - 从当前HTML文件Android Studio中打开本地HTML文件? - 堆栈内存溢出...
  3. JAVA设置输入数据范围,如何使用Apache POI(SXSSF)为特定单元格设置数据(数字)格式区域设置?...
  4. php 许愿墙 阶段案例_文化墙制作要突出企业哪些重点?
  5. oracle存在于A不存在于B,Oracle试题
  6. mysql time 5分钟_MySQL 使用 PV 和 PVC 每天5分钟玩转 Docker 容器技术(154)
  7. windows环境的python的环境变量_win的环境变量配置(Python实例)
  8. e2 android,魅蓝E2做工怎么样?魅蓝手机E2拆机全过程图解
  9. ios kvo 要引入_iOS中KVO的使用
  10. 修改10g RAC public or private or virtual IP [Oracle]