tcp三次握手和四次断开以及tcpdump的基本使用

news2024/11/29 16:27:08

前言

最近工作中会发现有超时的问题,还有就是在面试的时候很多都要求深入理解TCP/IP协议。突然感觉TCP/IP协议是一个既熟悉,又陌生的技术。又想到上大学的时候,老师说过
网络的圣经:“TCP/IP详解” 卷一 卷二 卷三,三本书。所以这次写一篇文档,好好学习一下。以下文档是根据TCP/IP详解 卷一和网络文章综合所得

一、tcpdump准备工作

1.操作系统版本

[root@web-server ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

2.tcpdump安装

yum -y install tcpdump

3.tcpdump版本

[root@web-server ~]# tcpdump --version
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips  26 Jan 2017

二、tcpdump用法

1. 网卡参数 -i

指定网卡的选项是必须的。我看网上很多资料不用指定网卡,可以直接过滤,不知道是不是tcpdump版本过低的问题
可以使用tcpdump -D 打印出可以监控的网络接口有哪些

1.1 指定固定网卡

指定接收ens32网卡的所有收发数据包,

 tcpdump -i ens32 -c 10

1.2 指定所有网卡

tcpdump -i any -c 10

2.指定协议

查看icmp协议的收发数据包.可以通过客户端ping服务器,来查看数据包的情况

tcpdump -i ens32 icmp
tcpdump -i ens32 arp
tcpdump -i ens32 tcp

3.指定端口 port

要想抓取应用层的访问数据包,就应该通过端口来抓取了。
服务端安装nginx,进行测试

tcpdump -i ens32  port  80

3.1 指定目标端口

tcpdump -i ens32  dst port  80

3.2 区别

如果不指定目标端口,会显示通过80端口上所有接收和发送的数据包
如果指定目标端口,只会显示访问80的数据包,通过80发送出去的数据包不会显示

4.过滤主机 host

4.1 过滤源主机IP地址

tcpdump   -i ens32  src host  192.168.1.3

5.组合使用

以上条件组合起来一起使用必须使用and进行连接.
例子1:获取源主机为1.3 在80端口上所有收发的数据包

tcpdump   -i ens32  src host  192.168.1.3 and port 80

例子2:查看正在Ping服务器(1.102)的所有主机

tcpdump   -i ens32  icmp and dst host 192.168.1.102

例子3:查看某台主机是否在ping服务器(1.20)

tcpdump  -i ens32 icmp and dst 192.168.1.102 and src 192.168.1.103

6.tcpdump数据格式

格式如下:

22:57:09.763679 IP 192.168.1.102.80 > 192.168.1.103.57296: Flags [S.], seq 1928661013, ack 1195573118, win 28960, options [mss 1460,sackOK,TS val 8656013 ecr 8681178,nop,wscale 7], length 0
格式:
1. 22:57:09.763679 :数据请求的时间
2. IP: 表示网络协议
3. 192.168.1.102.80: 源地址IP和端口号
4. > : 数据走向,也就说谁发给谁的数据包
5. 192.168.1.103.57296:目标IP地址和端口号 
6. Flags [P.]: 标识位

其它: seq号 ack号 win窗口  数据长度length

7、其他参数

7.1 -v和-vv

显示更详细的信息

7.2 -nn

以数字的形式显示端口号和IP地址

7.3 -P

查看进出口数据包。-P (in|out)

tcpdump  -i ens32  -P out  dst 192.168.1.103 -nn

7.4 -w

将捕获到的数据包保存到文件当中,文件后缀需要使用.pcap。 然后方便使用wireshark软件进行查看

7.5 -S

将TCP的序列号,以绝对值的形式输出。如果不使用-S参数,在抓包过程中ack的值会这样显示:ack=1,这样不便于观察。

7.6 -t

不显示时间戳

三、TCP协议

1.简介

tcp提供了一种面向连接的,可靠的的字节流服务。

1.1 面向连接

面向连接指的是:客户端和服务端要交互数组,必须要先建立连接。

1.2 可靠性

TCP协议的可靠性主要靠以下几个方面:
(1)应用数据会被TCP分割成 TCP认为最合适的数据块
(2)TCP发出一个数据段后,会启动一个定时器,等待目的端确认是否收到这个数据段,如果不能及时收到一个确认。将重新发送这个数据段
(3)目的端收到数据后,发送一个确认,这个确认不会立即发送,通常会推迟几分之一秒
(4)TCP协议会重新对数据段进行排序
(5)TCP会丢弃"重复"、"首部和数据的校验和有差错"的数据段

2.TCP报文

在这里插入图片描述

2.1 源端口和目标端口

源端口:表示是哪个进程发来的数据包
目标端口:表示这个数据包要发送给哪个进程

2.2 序号和确认号

(1)序号:指定了当前数据分片中分配给第一字节数据的序列号。在TCP传输流中每一个字节为一个序号。如果TCP报文中flags标志位为SYN,该序列号表示初始化序列号(ISN),此时第一个数据应该是从序列号ISN+1开始。

(2)确认号:表示TCP发送者期望接受下一个数据分片的序列号。该序号在TCP分片中Flags标志位为ACK时生效。
作用1:确认对端发来的包收到了。
作用2:期望对端开始传输数据时候,序列号从这个值开始
此值一般是在对端的序列号上加1

3.标志位

标志位含义备注
SYN连接请求或者接受连接请求在tcpdump中的表现形式为: 【S】
FIN连接结束,断开连接在tcpdump中的表现形式为: 【F】
RST重置连接在tcpdump中的表现形式为: 【R】
ACK确认标记位【.】代表ACK的确认包 或者URG标志位。其它的标志位均为0.一般情况下就ACK包
PSH催促标志位在tcpdump中的表现形式为: 【P】 推送数据
URG紧急标志位【.】代表ACK的确认包 或者URG标志位.其它的标志位均为0

注意:

1.PSH标志位:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中

2.RST标志位:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段即连接重置

四、TCP连接的建立

1.简介

TCP的连接也就是"三次握手"的过程。
所谓三次握手就是指:建立一个 TCP 连接时需要客户端和服务器端总共发送三个包来确认连接的建立

2.三次握手的过程

在这里插入图片描述

3.抓包实例

3.1 抓包命令

在server启动nginx,开始进行抓包,命令如下

tcpdump -i any -nn -S  port 80

3.2 抓包结果

使用telnet进行连接nginx的80端口

telnet 192.168.1.16 80

查看抓包内容,结果如下:

01:16:08.055233 IP 192.168.1.1.57853 > 192.168.1.16.80: Flags [S], seq 1599595106, win 64240, 
01:16:08.055284 IP 192.168.1.16.80 > 192.168.1.1.57853: Flags [S.], seq 4257773931, ack 1599595107, win 29200, 
01:16:08.055804 IP 192.168.1.1.57853 > 192.168.1.16.80: Flags [.], ack 4257773932, win 4106, length 0

4.结果分析

4.1 第一次握手

客户端发送给服务器端

192.168.1.1.57853 > 192.168.1.16.80

[S]: 发送SYN 标志位位1的 数据包,
seq: 初始的随机序列号值为1599595106

总结: SYN=1,seq=1599595106

4.2 第二次握手

服务端回应客户端

192.168.1.16.80 > 192.168.1.1.57853

[S.]: SYN和ACK标志位都为1,
ack: 确认序号为  1599595107,在客户端发来的序号之上 + 1
seq: 产生和客户端建立连接的初始化序列号4257773931

总结:
SYN=1,seq=4257773931
ACK=1,ack=1599595107

4.3 第三次握手

客户端确认

192.168.1.1.57853 > 192.168.1.16.80

[.] ACK标志位为1
ack:确认号4257773932

总结:
ACK=1,ack=4257773932

就第三次握手的情况来看,第三的包中并没有携带seq 序列号值。这是因为默认没有显示,可以使用-vv参数来查看
但是在windows中使用wireshark抓包,可以看到seq这个序列号。

5.状态验证

5.1 查看SYN_SENT

在服务端启动防火墙,客户端就无法连接nginx.
查看服务器抓包情况,可以看出客户端一直在发送建立连接的包

18:13:31.336551 IP 192.168.1.1.61419 > 192.168.1.16.80: Flags [S], seq 1643209252, win 64240
18:13:31.341627 IP 192.168.1.1.61420 > 192.168.1.16.80: Flags [S], seq 142056919, win 64240
18:13:31.587559 IP 192.168.1.1.61422 > 192.168.1.16.80: Flags [S], seq 3305175899, win 64240
18:13:34.336935 IP 192.168.1.1.61419 > 192.168.1.16.80: Flags [S], seq 1643209252, win 64240
18:13:34.344128 IP 192.168.1.1.61420 > 192.168.1.16.80: Flags [S], seq 142056919, win 64240

查看客户端状态,处于SYN_SENT状态。这里的连接数量不重要,主要是看状态

C:\Users\pangbb>netstat -an |findstr /i 1.16|findstr /i 80
  TCP    192.168.1.1:61419      192.168.1.16:80        SYN_SENT
  TCP    192.168.1.1:61420      192.168.1.16:80        SYN_SENT
  TCP    192.168.1.1:61422      192.168.1.16:80        SYN_SENT

5.2 查看SYN_RECV

环境:

server: nc -l 16868

在服务端的抓包命令:
tcpdump -i any -nn -S port 16868

此时开启客户端(linux)的设置iptables策略。1.16为服务端地址。含义就是不接受服务端返回

iptables -A INPUT -s 192.168.1.16 -j DROP

然后发起连接

nc -v 192.168.1.16 16868

查看服务端状态

[root@node1 ~]# netstat -antp |grep 16868
tcp        0      0 0.0.0.0:16868           0.0.0.0:*               LISTEN      7308/nc             
tcp        0      0 192.168.1.16:16868      192.168.1.18:34786      SYN_RECV    -                   
tcp6       0      0 :::16868                :::*                    LISTEN      7308/nc

五、TCP连接的断开

1.简介

在TCP连接中的断开 常被称为"四次断开"或者"四次挥手"
之所以断开需要四次:
这是因为TCP的"半关闭"造成的.TCP是全双工的,因此每个方向必须单独地进行关闭

2.四次断开过程

2.1 过程图

这里的过程图,没有过多些回复包的seq序列号。这里主要是看状态的转换

在这里插入图片描述

2.2 端口状态

(1)主动断开方:

FIN_WAIT1
FIN_WAIT2
TIME_WAIT 

(2)被动断开方

CLOSE_WAIT
LAST_ACK

3.nc实现标准4次断开

3.1 启动抓包命令

tcpdump -i any -S -nn port  16868

3.2 启动nc

在server上使用以下命令启动16868端口

nc -l 16868

3.3 客户端连接

在客户端cmd中使用telnet连接server的16868端口

telnet 192.168.1.16  16868

nc命令不会主动断开连接。不手动断开是不会断开连接的。

3.4 断开连接

使用telnet连接nc端口后,可以在客户端输入点数据。也可以不输入数据。
然后在"服务端"端开始断开连接,注意:一定要在服务端主动断开。也就是停止nc命令。

3.5 查看抓包结果

这里展现了标准的tcp 4次断开结果

# 服务端主动断开nc命令,服务端向客户端发起断开请求 第一次
192.168.1.16.16868 > 192.168.1.1.50907: Flags [F.], seq 2801815419, ack 3112729795, win 229, length 0

# 客户端收到服务端断开连接的请求,回复ACK 进行确认。 第二次
192.168.1.1.50907 > 192.168.1.16.16868: Flags [.], ack 2801815420, win 4106, length 0

# 客户端开始向服务端发起断开连接请求, 第三次
192.168.1.1.50907 > 192.168.1.16.16868: Flags [F.], seq 3112729795, ack 2801815420, win 4106, length 0
    
# 服务端确认客户端的请求。第四次
192.168.1.16.16868 > 192.168.1.1.50907: Flags [.], ack 3112729796, win 229, length 0

4.nginx断开实例

3.1 启动nginx

nginx

3.2 开始抓包

tcpdump -i any -nn -S port 80

使用浏览器访问nginx,得到以下抓包数据

# nginx主动发起 第一次断开连接的请求
01:50:13.124555 IP 192.168.1.16.80 > 192.168.1.1.55320: Flags [F.], seq 3869309450, ack 202349151, win 254, length 0
01:50:13.124900 IP 192.168.1.1.55320 > 192.168.1.16.80: Flags [.], ack 3869309451, win 4102, length 0

# 后续的包不通场景有些不同,这里只是想表达 nginx会主动发断开的FIN包

3.3 状态转换

在建立完连接之后,nginx在 “keepalive_timeout” 时间内,客户端没有传输数据,nginx就会自动断开连接。发送FIN包,进行断开.
(1)当nginx主动发起FIN断开连接后,服务端将进入 “FIN_WAIT2” 状态
(2)此时客户端进入"CLOSE_WAIT"
(3)当客户端端像nginx发起FIN后,nginx的连接进入"TIME_WAIT"

5.断开得状态复现

1、主动关闭方发送FIN,此时主动关闭方状态为:FIN_WAIT_1
2、被动关闭方收到后,回复ack,此时被动关闭方状态为:CLOSE_WAIT
3、主动关闭方收到ack后,状态为FIN_WAIT_2
4、被动关闭方发送FIN,此时状态为LAST_ACK
5、主动关闭方收到后,回复ack,此时状态为TIME_WAIT 。
6、被动关闭方收到ack后,状态为CLOSED

为了方便看到TCP断开状态得转换和查看。server和client都使用"nc"进行实现
server端使用linux 192.168.1.16 使用nc
client端使用linux 192.168.1.18 也使用nc

5.1.FIN_WAIT_1

5.1.1 启动server
nc -l 16868

#开始启动抓包
tcpdump -nn -S -i any port 16868
5.1.2 client开始连接
nc -v 192.168.1.16 16868
5.1.3 设置客户端防火墙策略

此策略得目的就是不接受服务端发来得FIN 断开请求包

ptables -A INPUT -s 192.168.1.16 -j DROP
5.1.4 断开服务端

直接ctrl + c 断开即可

5.1.4 查看服务端状态
[root@node1 ~]# netstat -antp |grep 16868
tcp        0      1 192.168.1.16:16868      192.168.1.18:34826      FIN_WAIT1   -

5.2 FIN_WAIT_2

先还原正常建立连接得正常状态. 清除所有防火墙策略

5.2.1 启动server
nc -l 16868

#开始启动抓包
tcpdump -nn -S -i any port 16868
5.2.1 client开始连接
nc -v 192.168.1.16 16868
5.2.3 断开服务端

直接ctrl + c 断开即可。此时 client得nc 不会自动断开。必须手动断开才可以

5.2.4 查看抓包结果

这里发现客户端已经回复了ACK得的确认包

18:43:08.639049 IP 192.168.1.16.16868 > 192.168.1.18.34828: Flags [F.], seq 1714549503, ack 38581695, win 227, options [nop,nop,TS val 77246674 ecr 77160729], length 0
18:43:08.641121 IP 192.168.1.18.34828 > 192.168.1.16.16868: Flags [.], ack 1714549504, win 229, options [nop,nop,TS val 77241592 ecr 77246674], length 0

5.2.5 查看服务端状态

此时服务端得连接状态已经变成了FIN_WAIT2

[root@node1 ~]# netstat -antp |grep 16868
tcp        0      0 192.168.1.16:16868      192.168.1.18:34836      FIN_WAIT2   - 
5.2.6 查看客户端状态

此时发现客户端已经进入到CLOSE_WAIT状态

[root@node4 ~]# netstat -antp |grep 16868
tcp        0      0 192.168.1.18:34836      192.168.1.16:16868      CLOSE_WAIT  4308/nc 

5.3 TIME_WAIT

TIME_WAIT状态 是为了等待足够的时间以确保对端能够收到自己发送的断开确认包。

5.3.1 启动server
nc -l 16868

#开始启动抓包
tcpdump -nn -S -i any port 16868
5.3.2 client开始连接
nc -v 192.168.1.16 16868
5.3.3 断开服务端

查看服务端已经处于FIN_WAIT2状态

5.3.4 断开客户端

此时发现服务端已经变成了TIMW_WAIT状态了

[root@node1 ~]# netstat -antp |grep -i 16868
tcp        0      0 192.168.1.16:16868      192.168.1.18:34836      TIME_WAIT   - 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1603154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring之CGLIB和JDK动态代理底层实现

目录 CGLIB 使用示例-支持创建代理对象,执行代理逻辑 使用示例-多个方法,走不同的代理逻辑 JDK动态代理 使用示例-支持创建代理对象,执行代理逻辑 Spring会自动在JDK动态代理和CGLIB之间转换: 1、如果目标对象实现了接口,默…

基于51单片机智能鱼缸仿真LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机智能鱼缸仿真LCD显示 1. 主要功能:2. 讲解视频:3. 仿真4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接: 基于51单片机智能鱼缸仿真LCD显示( proteus仿真程序设计报告讲解视频) 仿真图prot…

【Web】NewStarCTF 2022 题解(全)

目录 Week1 HTTP Head?Header! 我真的会谢 NotPHP Word-For-You Week2 Word-For-You(2 Gen) IncludeOne UnserializeOne ezAPI Week3 BabySSTI_One multiSQL IncludeTwo Maybe You Have To think More Week4 So Baby RCE BabySSTI_Two UnserializeT…

IDEA 安装、基本使用、创建项目

文章目录 下载基本使用修改颜色主题Keymap插件 创建项目创建模块新建 Java 类运行新建 Package打包 Jar运行 jar 包 查看文档 下载 官方下载地址:https://www.jetbrains.com/zh-cn/idea/download/?sectionmac 这里我下载 macOS 社区版,IDEA 2024.1 (C…

mPEG-Glutaramide Acid结合了聚乙二醇(PEG)和戊二酸(GAA)的性质

【试剂详情】 英文名称 mPEG-GAA,Methoxy PEG GAA, mPEG-Glutaramide Acid 中文名称 聚乙二醇单甲醚酰胺戊二酸, 甲氧基-聚乙二醇-戊二酰胺酸 外观性状 由分子量决定 分子量 400,600,2k,3.4k,5k&…

代码随想录算法训练营第五十七天 | 647. 回文子串、516. 最长回文子序列

代码随想录算法训练营第五十七天 | 647. 回文子串、516. 最长回文子序列 647. 回文子串题目解法 516. 最长回文子序列题目解法 动态规划总结链接感悟 647. 回文子串 题目 解法 题解链接 动态规划 class Solution { public:int countSubstrings(string s) {// dp[i][j]:表示…

[Java EE] 多线程(二): 线程的创建与常用方法(下)

2.3 启动一个线程–>start() 之前我们已经看到了如何通过重写run()方法来创建一个线程对象,但是线程对象被创建出来并不意味着线程就开始运行了. 覆写run方法是给线程提供了所要做的事情的指令清单创建线程对象就是把干活的人叫了过来.而调用start方法,就是喊一声"行…

Java处理CSV类库:OpenCSV

一:CSV简介 Comma-Separated Values(CSV), 因分隔符没有严格指定规范标准,可以使用逗号,也可以使用其他字符(如制表符\t、分号;等),所以CSV也称为 逗号分隔值或者字符分隔值。csv文件是使用纯文本来存储表…

【数据库】为什么要添加一个与业务无关的主键?

关注获取更多: 你是否想过,为什么mysql要设置一个自增的主键,或者使用uuid生成一个和业务无关的主键id,在数据库设计中,主键是用来唯一标识每一行数据的关键。通常情况下,我们会选择与业务相关的字段作为…

CMEF | 澳鹏Appen精彩亮相第89届中国国际医疗器械博览会

4月14日,为期四天的第89届中国国际医疗器械博览会(CMEF)盛大收官。如今,人们的健康需求在人口老龄化等一系列因素的影响下持续增长,这意味着卫生系统也面对着更多具有复杂健康需求的患者。信息化、数字化、智能化已经成…

Zynq学习笔记--数字视频帧以及同步信号

目录 1. 介绍 2. 重要概念 3. 仿真测试 4. 总结 1. 介绍 Zynq芯片,作为一款集成了高性能FPGA和ARM处理器的系统级芯片(SoC),为视频处理提供了强大的硬件支持。该芯片内置的丰富视频方面的IP模块,使得从事视频处理项目的开发者能够高效、…

PHP 使用 PHPMailer 发送电子邮件

1. PHPMailer 介绍 phpMailer 是一个非常强大的 php 发送邮件扩展包,可以设定发送邮件地址、回复地址、邮件主题、html邮件内容和上传附件等,使用起来非常方便。它目前有着有近 4 千万的下载量,是 PHP 开发者实现邮件发送功能的首选扩展包 它…

阅读小程序|基于微信阅读网站小程序的系统设计与实现(源码+数据库+文档)

目录 基于微信阅读网站小程序 一、前言 二、系统设计 三、系统功能设计 小程序端: 后台 管理员进入指定功能操作区之后可以管理图书订单。其页面见下图。管理员审核订单,查看订单是否支付,为购买图书的用户推送对应的章节。 管理员进…

西瓜书学习——第一、二章笔记

[] 什么是机器学习? 研究关于“学习算法”(一类能从数据中学习出其背后潜在规律的算法)的一门学科。 PS:深度学习指的是神经网络那一类学习算法,因此是机器学习的子集。 假设空间和版本空间 举个栗子:假设现已收集到某地区近几年的房价和学校数量数据&#xf…

【基础物理实验】【AFM虚拟实验】基于AFM的物质表面微观结构及力学性质表征仿真实验(下)【北京航空航天大学】

本次实验(上)见博客:【基础物理实验】【AFM虚拟实验】基于AFM的物质表面微观结构及力学性质表征仿真实验(上)【北京航空航天大学】 本次实验(中)见博客:【基础物理实验】【AFM虚拟实…

『哈哥赠书 - 51期』-『数字风控体系:设计与实践』

⭐️ 赠书 - 《数字风控体系:设计与实践》 ⭐️ 数字风控概述 从2007年开始到2014年左右,高速移动网络和智能手机迅速在大众中普及,开启了移动互联网时代。在这个背景下,企业的产品与服务也出现了两个重要的趋势。 第一个趋势是…

(十三)C++自制植物大战僵尸游戏多用户存档实现(二)

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs UserData.h 在头文件中定义了枚举类型openUserDataReturnType,用于表示打开用户数据文件的返回状态。FileExistError表示文件存在但是打开错误,FileExistCorrect表示文件在且正确&#xff0…

活动理论的散点图

import pandas as pd import matplotlib.pyplot as plt# 假设您已经有一个名为 data.xlsx 的 Excel 文件 # 您可以使用以下代码读取数据# 读取 Excel 文件 try:data pd.read_excel(data.xlsx) except Exception as e:print(f"Error: {e}")# 假设您的数据包含以下列:…

2024 OceanBase开发者大会:专场论坛亮点抢先看

4 月 20 日,2024 OceanBase 开发者大会将在上海闵行区漕宝路 3199 号宝龙艾美酒店召开。 此次盛会专为开发者们量身打造,OceanBase诚挚邀请了来自不同行业的最佳实践用户、业界享有盛誉的技术专家,以及OceanBase数据库领域的精英们齐聚一堂。…

线程池学习(通俗易懂)

线程池 线程池是什么ThreadPoolExecutor模拟实现线程池结语 线程池是什么 假设我们要频繁的创建线程和销毁线程,但是创建线程和销毁线程是有成本的. 所以我们可以提前创建一批线程,后面需要使用的时候,直接拿就可以了,这就是线程池. 当线程不再使用的时候,就归还到池子里.为什…