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

前言

最近工作中会发现有超时的问题,还有就是在面试的时候很多都要求深入理解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.mfbz.cn/a/551809.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IIC总线读取温度湿度传感器数据实验

iic.c #include "iic.h"extern void printf(const char* fmt, ...); /** 函数名 : delay_us* 函数功能:延时函数* 函数参数:无* 函数返回值:无* */ void delay_us(void) //微秒级延时 {unsigned int i 2000;while(i-…

性能工具之emqtt-bench BenchMark 测试示例

文章目录 一、前言二、典型压测场景三、机器准备四、典型压测场景1、并发连接2、消息吞吐量测试2.1 1 对 1(示例)2.2 多对1(示例)2.3 1对多(示例) 五、遇到的问题client(): EXIT for {shutdown,eaddrnotava…

java学习之路-多态

文章目录 目录 文章目录 前言 1.多态 1.1 多态的概念 1.2 多态实现条件(重点) 多态实现的栗子 1.3重写 重写的规则 重写和重载的区别 1.4静态和动态绑定 1.5向上转型和向下转型 1.向上转型 2.向下转型 1.6多态的优点 前言 本文内容:多…

DHCP是什么意思 路由器中DHCP服务器怎么设置?

概述 DHCP是什么意思?很多朋友在路由器设置中,都会看到有一项“DHCP服务器”设置功能,而很多朋友对这个功能不太了解,也不知道怎么设置。其实,对于普通用户来说,无需去单独设置路由器DHCP服务器功能&#…

李沐46_语义分割和数据集——自学笔记

语义分割 语义分割将图片中的每个像素分类到对应的类别。 实例分割(目标检测的进化版本) 如果有物体,会区别同一类的不同物体。 语义分割重要数据集:Pascal VOC2012 %matplotlib inline import os import torch import torch…

【强化学习的数学原理-赵世钰】课程笔记(九)策略梯度方法(Policy Gradient Method)

目录 一.policy gradient 的基本思路(Basic idea of policy gradient) 二.定义最优策略的 metrics,也就是 objective function 是什么 三.objective function 的 gradient 四.梯度上升算法(REINFORCE) 五.总结 上…

DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)

DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任…

数字工厂管理系统与MES系统有什么区别

随着工业4.0时代的到来,数字化转型已经成为制造企业发展的必然趋势。在这个过程中,数字工厂管理系统和MES管理系统都扮演者至关重要的角色。然而,尽管两者都致力于优化生产流程和提高生产效率,但它们在实际应用、功能定位和系统架…

Datapump数据迁移方案

环境准备 确认源数据库和目标数据库的版本 确保源数据库和目标数据库的Oracle版本兼容,以保证Datapump工具能够正常工作。 硬件资源检查 确认源数据库和目标数据库服务器的硬件资源(如CPU、内存、存储空间)能够满足数据迁移的需求。 网络连…

基于STM32的智能垃圾分类识别系统设计(论文)_kaic

摘 要 智能垃圾分类技术逐渐受到了政府的重视和支持,越来越多的城市开始推行垃圾分类政策。因此设计一款能够对垃圾进行识别并分类的控制系统具有一定的现实意义。本设计采用STM32单片机作为整个系统的控制核心,利用K210开发板作为图像识别控制系统&…

在Postgres中,如何有效地管理大型数据库的大小和增长

文章目录 一、定期清理和维护1. VACUUM和ANALYZE2. 删除旧数据和归档 二、分区表三、压缩数据四、配置优化1. 调整维护工作负载2. 监控和日志 五、使用外部存储和扩展1. 外部表和FDW2. 扩展和插件 六、定期备份和恢复测试结论 管理大型数据库的大小和增长是数据库管理员&#x…

如何看懂电路图,理解电流回路

任何电器都需要电源来供电。电源有正极(+)和负极(-),为了向负载提供电力,电流必须从正极流出,通过负载后再回到负极。这构成了一个供电电流回路,负载得到电力供应后才能开始工作。如果其中的某个环节断开,就无法形成供电电流回路,负载将得不到供电,也无法正常工作。 在一…

Typescript 总结3——类

一、是什么 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础 类是一种用户定义的引用数据类型,也称类类型 传统的面向对象语言基本都是基于类的,JavaScript …

机器学习与深度学习 --李宏毅(笔记与个人理解)Day 20

Day 20 RNN 2 实际使用和其他应用 在实际的学习(training)过程中是如何工作的? step 1 Loss step 2 training Graindent Descent 反向传播的进阶版 – BPTT CLIpping 设置阈值~ 笑死昨天刚看完关伟说的有这玩意的就不是好东西 Why&#xff1…

window轻松使用k8s

Docker Desktop安装篇 1、win安装 1、下载安装包 https://www.docker.com/products/docker-desktop/ 官网下载安装包 2、配置win支持虚拟化 不勾选Hyper-V,它和Windows Subsystem for Linux (WSL) 是两套功能,这里不选他 3、安装WSL配置window支持lin…

2024电容笔专业对比评测:西圣、倍思、绿联哪款平替电容笔更好用?

在当今学习和工作环境中,iPad作为一种多功能的学习和生产力工具,受到越来越多人的青睐与需求。然而,要充分发挥iPad的功能,一个优质的电容笔是必不可少的配件之一。电容笔不仅可以帮助用户进行手写笔记、绘画创作,还能…

包装类的认识

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x1…

48.基于SpringBoot + Vue实现的前后端分离-雪具销售系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的雪具销售系统设计与实现管理工作系统…

探索分布式系统监控zabbix-------------监控Windows

扩展windows 10 server2012 server2016 server2019 监控 一、在虚拟机中安装zabbix的客户端 下载网站 Download and install Zabbix 安装系统一直托不进虚拟机中;因为没安装Tools组件 点击虚拟机,选择安装VMware Tools 查看主机名 二、在web页…

ArcGIS在洪水灾害普查、风险评估及淹没制图中的技术应用

2020年国务院办公厅印发《关于开展第一次全国自然灾害综合风险普查的通知》,定于2020年至2022年开展第一次全国自然灾害综合风险普查。水旱灾害风险普查是全国自然灾害综合风险普查的重要组成部分。其中,我国有超过 60%的国土面积、90%以上的人口均受到不…
最新文章