抓包分析TCP的三次握手和四次握手

问题描写叙述:

       在上一篇《怎样对Android设备进行抓包》中提到了,server的开发者需要我bug重现而后提供抓包给他们分析。因此抓好包本身也试着分析了一下。发现里面全是一些TCP协议和HTTP协议。因此要想进行抓包分析,必须先了解TCP的原理。这里介绍了TCP的创建链接的三次握手和断开链接的四次握手。网络


问题分析:


一、TCP创建链接的三次握手


一、1前言:介绍三次握手以前,先介绍TCP层的几个FLAGS字段,这个字段有例如如下的几种标示

SYN表示创建链接,tcp

FIN表示关闭链接。post

ACK表示响应,spa

PSH表示有 DATA传输数据,.net

RST表示链接重置。server


一、2 三次握手的步骤

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到server,主机B由SYN=1知道,A要求创建联机;blog

 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1。ack=1,随机产生seq=7654321的包。开发

 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1。以及位码ack是否为1。若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则链接创建成功。get

 完毕三次握手,主机A与主机B開始传送数据。it

从抓包分析中可以很是清晰的看到TCP三次握手。下图就是完整的三次握手。client41826port和server的80port创建了链接



二、tcp断开链接的四次握手

tcp断开链接有两种方式,第一种是正常的四次握手断开的,另一种是RST异常断开的


二、1 正常断开的四次握手:

下图来自网络


假设Client端发起中断链接请求,也就是发送FIN报文。

Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了"。但是假设你还有数据没有发送完毕。则没必要急着关闭Socket,可以继续发送数据。因此你先发送ACK。"告诉Client端,你的请求我收到了,但是我还没准备好。请继续你等个人消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端肯定数据已发送完毕,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭链接了"。Client端收到FIN报文后,"就知道可以关闭链接了。但是他仍是不相信网络。怕Server端不知道要关闭。因此发送ACK后进入TIME_WAIT状态。假设Server端没有收到ACK则可以重传

“。Server端收到ACK后,"就知道可以断开链接了"。Client端等待了2MSL后依旧没有收到回复。则证实Server端已正常关闭,那好。我Client端也可以关闭链接了

Ok,TCP链接就这样关闭了!


二、2 用抓包来看断开链接的四次握手

下图中的四个箭头就是标准的四次握手了。

首先server80port想41826port发出FIN的断开链接请求

而后第二个箭头41826收到请求以后想server80port回复了一个ACK

接着第三个箭头41826向server80port发送断开请求FIN

最后第四个箭头,server80向client发送断开的回复ACK

这样四次握手以后,server和client都确认了断开链接,可以看到断开链接是双向的。


二、3 RST异常关闭链接

有时候也会出现异常断开链接的状况,也就是RST。比方说下图,server80向client32875发送断开请求FIN,client也经过这条链路回复了ACK,但是此时还有数据需要发送。因此没有急着回复FIN,而是先将get请求发送出去,发送了get请求以后再发送的断开请求FIN。但是此时server不知道什么缘由在没有确认client的确认前就断开了,因此在接到get请求以后,返回了一个RST,异常断开了这条链路。


结论:

TCP的三次握手和四次握手平时看书本看起来很是生涩难懂,但是经过一次http的抓包分析以后,对于tcp的七次握手有了新的了解和认识。

这些理论知识我仍是了解的不够深刻,仅仅是学以至用,用来分析网络抓包。只是要想作好网络应用,仍是很是有必要对tcp,http作深刻一点的了解

相关文章
相关标签/搜索