CCNP 必备:Linux 网络抓包和 TCP 的三次握手

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 一、三次握手二、有限状态机 FSM:Finite State Machine三、TCP包头结构四、映射第四层到应用程序五、有限状态机六、客户端的典型状态转移七、TCP超时重传八、拥塞控制九、UDP特性

CCNP 必备:Linux 网络抓包和 TCP 的三次握手

 

目录:

一、三次握手

二、有限状态机 FSM:Finite State Machine

三、TCP包头结构

四、映射第四层到应用程序

五、有限状态机

六、客户端的典型状态转移

七、TCP超时重传

八、拥塞控制

九、UDP特性

 

 

回顾:六个重要的标记位分别为:urgackpshrspsinfin

两个主机通讯之前,只要进行tcp协议,必须进行三次握手。三次握手通讯过程,如果AB进行通讯,AB发一个同步消息,把syn的标记设为1,回应的数据包都标记为1

 

只要有tcp协议的,都可以看到三次握手。网络中有很多软件应用来进行通讯都是进行tcp的,例如:ssh可以进行tcp通讯(ssh192.168.30.128)。


前三次tcp就是三次握手,例如:

Arp是协议

image.png

后面的就是已经建立连接之后是sshv2协议。100128是第一个,第二个是从128100的,第三次握手从100又回到128.synsyn ack →ack

Tcp协议的完整名称为:transmission control protocol.

image.png

 

Source port为原端口56250(随机的)对应db ba

Destination port为目标端口22对应16

Segment number为序号00为相对编号)对应b0 40 9f 43(为绝对编号)。

Acknowledgment number 为确认编号为00代表无法确认)

fiags为标记。

image.png

 

syn为第一个包。

建立连接需要三次握手,主要标记了acksyn

怎么确认三次握手的第一次握手?

看所有位中是否只有syn1,其它位都是0.

image.png

 

此图为客户端主动发出断开请求,实则客户端和服务端都可发出断开请求。

主动提出断开连接的,提出标记位是FINfinish=1,数据包假设为u,状态切换为FIN-WAIT-1

对方收到断开连接的请求之后会立即响应,ACK=1;从ESTAB-LISHED切换成为CLOSE-WAIT,之后进行残留数据传送;

对方收到信息后从wait1切换到wait2

Fin=1为服务器同意断开,将残留数据传输完毕之后,客户端切换到time-wait阶段,此阶段将持续两倍MSL时间(消息的最大生存期),时间结束之后为closed

为什么要等两倍MSL时间?

数据可能先发后到,需要等待数据彻底收到。

image.png

 

 

一、TCP三次握手

上图包含了5种状态分别为:CLOSED,SYN-SENT,ESTAB-LISHED,LISTEN,SYN-RCVD;

 

只要采用tcp协议,就要采用三次握手

ab发送同步消息,第一次握手把标记位设为1b回应的数据包把synack都设为1,第三次握手ack1

Header Length头部长度 Source Port 源端口

Destination Length 目标端口

 

如何知道是否为三次握手?

SYN1,其余全为0

tcp程序发送时每个程序都有自己的端口号,tcp协议的第一个首部就是目标程序和源程序的端口号,第三个字段叫做序列号,即数据包的编号,第四个字段是确认的编号,还有六个重要标记类,

 

ssh 192.168.30.128基于tcp协议通讯

 

 

二、有限状态机 FSM:Finite State Machine

1)    CLOSED  没有任何连接状态。

2)    LISTEN  侦听状态,等待来自远方 TCP端口的连接请求。

3)    SYN-SENT  在发送连接请求后,等待对方确认。

4)    SYN-RECEIVED  在收到和发送一个连接请求后,等待对方确认。

5)    ESTABLISHED  代表传输连接建立,双方进入数据传送状态。

6)    FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认。

7)    FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求。

8)    TIME-WAIT  完成双向传输连接关闭,等待所有分组消失。

9)    CLOSE-WAIT  被动关闭,收到对方发来的关闭连接请求,并已确认。

10)LAST-ACK  被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失。

11) CLOSING 双方同时尝试关闭传输连接,等待对方确认。(同时发出分手)。

 

 

三、TCP包头结构

image.png

(窗口为数据的大小,发送数据包是与对方协商数据有多大。)


• 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量。

• 校验和:提供额外的可靠性

• 紧急指针:标记紧急数据在数据字段中的位置

• 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节

• 标记位:关键的ACKSYN,FIN


常见选项:

>最大报文段长度:Maxium Segment Size, Mss

>窗口扩大:Windows Scaling

>时间戳:Timestamps

(前20个字节必须要有,其他的字节不做要求)

 

 

四、映射第四层到应用程序

FTPTelnetHTTP对应的都有端口号,DNS比较特殊,既会用TCP协议也会用UDP协议,DNS(网络文件系统,端口号不固定,有多个端口号)目前正在使用的端口号都可以查询到,例如|grep9527查询9527端口号是否被使用在某些环境中,基于安全的问题,可能会修改端口号,端口号是用来标识上层应用程序的地址的

大部分软件会用单端口,个别会用多端口。


NFS network file system 端口号不固定。

Tcp协议第一层为应用层application;第二层为传输层transport为上层提供服务,需要加标记,通过标记体现上层应用地址,通过上层编号找到对应的软件;

image.png

 

当一个数据包发来,最下面是物理层;上面是数据量层;在上面是网络层;在上面是传输层、绘画层等等;


TCP协议中没有这么复杂。上面一层叫应用层(有好多个),第二层为传输层(为上层提供服务,应该加标记,体现该数据应该发给那个软件)。

 

 

五、有限状态机

客户端先发送一个 FIN 给服务端,自己进入了 FIN_WAIT_1 状态,这时等待接收服务端的报文,该报文会有三种可能:

① 只有服务端的ACK

② 只有服务端的FIN(同时提出分手)

③ 基于服务端的ACK,又有 FIN


1、只收到服务器的ACK,客户端会进入 FIN_WAIT_2 状态,后续当收到服务端的FI N时,回应发送一个 ACK, 会进入到 TIMEWAIT 状态,这个状态会持续 2MSL(TCP 报文段在网络中的最大生存时间,RFC 1122 标准的建议值是 2min).客户端等待 2MSL,是为了当最后一个 ACK 丢失时,可以再发送一次。因为服务端在等待超时后会再发送一个FIN给客户端,进而客户端知道 ACK 已丢失


2、只有服务端的FIN 时,回应一个 ACK 给服务端,进入 CLOSING状态,然后接收到服务端的 ACK 时,进入 TIMEWAIT 状态


3、同时收到服务端的ACK FIN,直接进入 TIMEWAIT状态

 

六、客户端的典型状态转移

客户端通过 connect 系统调用主动与服务器建立连接 connect 系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT 状态

 

此后 connect系统调用可能因为如下两个原因失败返回:

1、如果 connect 连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于 TIME_WAIT 状态的连接所占用(见后文),则服务器将给客户端发送一个复位报文段,connect 调用失败。

2、如果目标端口存在,但connect 在超时时间内未收到服务器的确认报文段,则 connect 调用失败。

Connect调用失败将使连接立即返回到初始的 CLOSED 状态。如果客户端成功收到服务器的同步报文段和确认,则connect 调用成功返回,连接转移至 ESTABLISHED 状态。

 

处于 FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至 TIME_WAIT 状态,否则它将一直停留在这个状态。

如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2 状态并无益处。


连接停留在 FIN_WAIT_2 状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。

此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似,占用内存资源)

Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数:/proc/sys/net/ipv4/tcp_max_orphans(指定内核能接管的孤儿连接数目)孤儿连接太多会占用内存资源。


/proc/sys/net/ipv4/tcp_fin_timeout(指定孤儿连接在内核中生存的时间60秒)

 

Syn(半连接)攻击:

如果想要把对方的服务器拖垮,可以假装一个客户端发起请求,对方响应后发出SYN=1,ACK=1。但是没有第三步了而且客户端的发出地址是伪造的。服务器等待的时候会占用内存,造成服务器瘫痪。

可以安装防火墙等手段来预防。

 

下图为各种状态的复合图。虚线为服务器端发送的;实线为客户端发送的。

 image.png

 

下图为三次握手四次挥手总结图

前三次为三次握手,中间是传数据,最后则是分手。

image.png

首先建立连接,ctrl+c强行断开连接。前三次为三次握手,中间是传数据,最后则是分手。

 

例如:

两个主机之间各有两个程序在通讯。当两个软件分别进行连接的时候。浏览器访问外国网站,这时就有三次握手。有几个应用程序通讯,就有几个握手,几个分手。

image.png

 

开始时客户端为断开连接状态,连接服务器发送同步包变为sent状态,对方回应synack,同时切换到estabilished状态,如果想断开连接则发送fin,进入wait1,等待对方发确认,如果对方回应ack则进入wait2,同时发送ack,接收fin,进入time wait 等待30秒后完成断开

 

TCP的各种特性

1、面向连接

2、可靠

3、可基于半关闭

 image.png

Ack=1代表0包已经收到了。

 

 

七、TCP超时重传

异常网络状况下(开始出现超时或丢包),TCP 控制数据传输以保证其承诺的可靠服务

 

TCP 服务必须能够重传超时时间内未收到确认的TCP 报文段。为此,TCP 模块为每个 TCP 报文段都维护一个重传定时器,该定时器在 TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP 模块将重传 TCP 报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP 的重传策略

 

TCP超时重传相关的两个内核参数:

/proc/sys/net/ipv4/tcp-retries1,指定在底层IP 接管之前 TCP 最少执行的重传次数,默认值是3

/proc/sys/net/ipv4/tcp_retries2,指定连接放弃前TCP 最多可以执行的重传次数,默认值 15(一般对应13~30min)

固定窗口:

 image.png

滑动窗口:

image.png

 

 

八、拥塞控制

网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。这种情况就叫做拥塞

 

TCP 为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制

 

TCP 拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)。拥塞控制算法在Linux 下有多种实现,比如 reno 算法、vegas 算法和cubic 算法等。它们或者部分或者全部实现了上述四个部分

当前所使用的拥塞控制算法

/proc/sys/net/ipv4/tcp_congestion_control

 

 

九、UDP特性

Udp无状态,格式简单。无三次握手,四次挥手。但效率高。有一定的错误检查功能。


1)    工作在传输层

2)    提供不可靠的网络访问

3)    非面向连接协议

4)    有限的错误检查

5)    传输性能高

6)    无数据恢复特性image.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
20天前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
45 4
|
20天前
|
机器学习/深度学习 安全 网络协议
Web安全-Linux网络命令
Web安全-Linux网络命令
17 1
|
16天前
|
网络协议 Linux
Linux 网络配置
了解基本命令与权限后,如何让Linux系统联网?可通过编辑`/etc/sysconfig/network-scripts/`下的`ifcfg-ethX`文件配置网卡,其中`ethX`代表第X块网卡。对于DHCP自动获取或静态IP,需设置`BOOTPROTO`参数,并指定IP、子网掩码和网关等。配置完成后,运行`/etc/init.d/network restart`重启网络。DNS可在`/etc/resolv.conf`中设置,添加`nameserver`行即可,无需重启网卡。配置好后,可用`ifconfig`查看IP信息,并通过远程工具如SecureCRT连接服务器。
34 0
|
23天前
|
域名解析 负载均衡 网络协议
Linux网络接口配置不当所带来的影响
总而言之,Linux网络接口的恰当配置是保证网络稳定性、性能和安全性的基础。通过遵循最佳实践和定期维护,可以最大程度地减少配置错误带来的负面影响。
63 0
|
1月前
|
存储 Linux 网络安全
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
|
1月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
|
1月前
|
网络协议 Linux Shell
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
|
15天前
|
设计模式 Java Linux
Linux的20个常用命令
Linux的23个常用命令
Linux的20个常用命令
|
1天前
|
Linux Docker 容器
9. 同步执行Linux多条命令
9. 同步执行Linux多条命令
|
1天前
|
Linux Shell
10-10|linux命令查询 关键字在文本中出现的行数
10-10|linux命令查询 关键字在文本中出现的行数