对于TCP协议来说,需要建立一个可靠的连接通道

那么对于TCP必须要确认我们所建立的连接是有效的,并且我们需要断开连接时也需要有效的一系列动作来确认状态

UDP顺便说一下,在UDP的世界里,我不管对方什么状态,只要知道对方地址,直接发包不管任何其他事情)

一般我们说的网络层通信其实不是很具体,网络层虽然可以实现主机与主机之间的通信,但是真正的通信实体其实

是主机中的进程,TCP实现了host to host 但是进程与进程之间的通信才是我们最终需要实现的目的,也就是A进程所

使用的端口连接B进程所使用的端口才能达到最终的应用目的。

 

TCP连接在构建时会发送多种类型的数据包来构建连接,每一种数据包都具有特殊意义,数据包的标识决定了该数据

包的意义,以下是基本说明

SYN:建立连接

ACK:回应表示

F I N:断开连接

PSH:数据包

RS T:重置(重传)

URG:紧急指针

 

TCP三次握手简单说明

目标:建立一个可靠的连接进行数据传输

1.TCP服务端进程先创建一个传输控制块TCB,时刻准备接收对端进程的连接请求,此时该服务器进入LISTEN监听状态)

2.(TCP客户端进程也先创建传输控制块TCB,然后向服务端发送报文,报文首部同部位SYN=1,同时选择一个初始序列号

seq=x这个时候TCP客户端进程进入SYN-SENT(同步已发送状态)。TCP规定,SYN报文段(SYN=1)的报文不能携带数据

但需要消耗掉一个序号)

3.(TCP服务端收到请求报文后,如果同意连接,则报文中应该是ACK=1SYN=1,确认号ACK=x+1,同时为自己初始化一个

序列号seq=y这个时候TCP服务器进入SYN-RCVD(同步收到)状态,这个报文不能携带数据,同样消耗一个序号)

4.TCP客户进程收到确认后,还要向服务器给出确认,确认报文的ACK=1然后ack=y+1自己的序号seq=x+1这个时候TCP连接建立

客户端进入ESTABLISHED(已经建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带则不消耗序号

5.当服务器收到客户端确认后也进入ESTABLISHED状态,此后双方可以正常通信。(下图为典型的三次握手行为)

 (下图为典型TCP握手抓包)

握手包.png

 

 TCP四次挥手简单说明

目的:client端要与sever端断开连接,由于是TCP协议,所以必须要挥手等待数据完全传输完成才可以断开以保证数据完整性

1.第一次挥手,client端发送FIN包并且携带seq包与ACK+1包来和server确认(典型)(注意:ACK 的值是对方 Seq + 数据长度。

2.第二次挥手,sever端发送ACKx+3包确认状态(此次抓包),不是通用规则。ACK 的值是 Client 的 FIN 序号 + 1

3.第三次挥手,服务端发送FIN包并且携带seq值确认数据完整性

4.第四次挥手,client端发送ACK确认信息挥手告别

(下图为典型的挥手包抓包)

以下为个人理解:可以看到42604261号发送了TCP保活探测双方是否keep-alive

4344号包开始,client端开始发送FIN包并且夹带了ACKsever

4349号包为服务端发送了FIN并且携带了ACK信息确认正常

4350号包client发送ACK确认状态,自此挥手结束此TCP通道正常关闭

挥手包.png

对于无图形化界面的服务器来说

直接使用sudo tcpdump+指定网卡+制定路径后保存一下pcap文件直接用wireshark去做分析的话更加的方便一些,目前感觉在生产环境中这样做分析更加贴合实际(如服务器没有tcpdump先安装一下多数发行版都不自带)

如下命令直接复制粘贴改一下网卡和路径非常省事。

sudo tcpdump -i enp0s3 -w /home/test/test01.pcap