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

简介: 一、三次握手二、有限状态机 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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
231 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
9月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
639 18
|
9月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
464 5
|
10月前
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
1166 5
|
12月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
359 18
|
10月前
|
网络协议 Linux 开发者
深入Linux中UDP网络通信机制编程探索
以上步骤概述了Linux中UDP网络通信的编程机制。在实现时,因关注细节和上下文环境可能有所调整,但大致流程是一致的。这些知识片段旨在帮助开发者快速上手Linux下的UDP编程,并提供可靠的信息作为编程的基础。在编程实践中,应结合实际业务需求,设计合适的数据传输协议,确保数据的正确性和实时性。
226 0
|
Linux 数据安全/隐私保护
使用Linux命令行接入无线网络Wi-Fi的示例。
现在,你已经使用命令行成功地连接到 Wi-Fi 网络了。这两个示例涵盖了用 `nmcli` 和 `wpa_supplicant` 连接无线网络的常见场景,让你能够不依赖图形化界面来完成这个任务。在日常使用中熟练掌握这些基本操作能增强你对 Linux 系统的理解,帮助你更有效地处理各种问题。
1002 12
|
运维 网络协议 安全
【Shell 命令集合 网络通讯 】Linux 网络抓包工具 tcpdump命令 使用指南
【Shell 命令集合 网络通讯 】Linux 网络抓包工具 tcpdump命令 使用指南
753 0
|
网络协议 Linux 网络安全
curl(http命令行工具):Linux下最强大的网络数据传输工具
curl(http命令行工具):Linux下最强大的网络数据传输工具
834 0
|
监控 网络协议 Ubuntu
Linux网络监控工具 - iftop
Linux网络监控工具 - iftop
677 1