不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

使用wireshark抓包并分析TCP的三次握手

安装wireshark

1
2
3
4
5
6
7
8
9
10
11
12
# 添加wireshark 下载链接地址,然后更新软件源
sudo apt-add-repository ppa:wireshark-dev/stable
sudo apt-get update

# 在命令行安装wireshark
sudo apt-get install wireshark

# 续配置,新建wireshark 用户组,把当前用户加入wireshark 用户组
sudo groupadd wireshark
sudo chgrp wireshark /usr/bin/dumpcap
sudo chmod 4755 /usr/bin/dumpcap
sudo gpasswd -a your_username wireshark

TCP协议

概念

TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

特点

  • TCP是面向连接的运输层协议
  • 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
  • TCP提供可靠交付的服务
  • TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号
  • 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP应用程序交下来的数据仅仅是一连串的无结构的字节流

三次握手

抓包的关键

  • 确认比特ACK: ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。
  • 同步比特SYN: 在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
  • 推送比特PSH: 当发送端PSH=1时,接收端尽快的交付给应用进程。
  • 终止比特FIN: FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。

第一次握手

建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号Seq=x。
(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号Seq=X,表明传输数据时的第一个数据字节的序号是x)

第二次握手

服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包。
(标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号Seq(服务器)=Y,以及服务器对客户端初始序号的确认号Ack(服务器)=Seq(客户端)+1=X+1)

第三次握手

客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(Seq=X+1),确认号为Ack(客户端)=Y+1,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。

四次挥手

第一次挥手

首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号Seq=X。

第二次挥手

服务器收到这个FIN,它发送一个ACK,确认Ack为收到的序号加一(X+1)。

第三次挥手

关闭服务器到客户端的连接,发送一个FIN给客户端。

第四次挥手

客户端收到FIN后,并发回一个ACK报文确认,并将确认序号Seq设置为收到Ack序号。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

参考连接

使用wireshark抓包并分析tcp三次握手
Wireshark抓包分析TCP 3次握手、4次挥手过程
通过Wireshark抓包分析TCP的三次握手和四次挥手

------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!