认识TCP三次握手
2016-06-17 17:33
316 查看
上节在学习HTTP协议的时候,了解到OSI模型的七层,其中最重要的就是应用层(HTTP/Telnet/Smtp/Dsn/Ttp),传输层(TCP/UDP)和网络层,所以在测试中,压力测试中的网络吞吐量,传输层是重点测试方向,在测试之前,需先了解一些Web网站一个虚拟连接的建立是如何实现的,也就是TCP的三次握手,四次挥手。
首先先了解TCP吧……
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。下面假设服务器是A,客户机是B来进行讲解。
第一:客户机向服务器发送连接请求报文。即当B(客户端)要和A(服务器)通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接。 即(B)à[SYN]à(A)
备:SYN是该协议中的一个标志位。如果该位被置为1,则表示这个报文是一个请求建立连接的报文。
只有当A收到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。
第二:服务器端收到SYN标记后会发一个对SYN的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作。即(A)à(SYN/ACK) à(B)
备:ACK也是该协议的一个标志位。如果该位被置为1,则表示这个报文是一个用于确认的报文。
第三:客户端收到服务器端发送的SYN/ACK包后,再像服务器端发送ACK确认包,告知服务器连接已经成功建立。即BàACKàA
备:客户端在向服务器端发送ACK确认包后,表示TCP三次握手成功,同时TCP连接的每个包都会设置ACK位。借鉴个图吧,理解更轻而易举。
补充:
对于我们日常的分析有用的就是前面的五个字段。
它们的含义是:
URG:Urget pointer is valid (紧急指针字段值有效)
SYN: 表示建立连接
FIN: 表示关闭连接
ACK: 表示响应
PSH: 表示有 DATA数据传输
RST: 表示连接重置
实际使用过程中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。PSH为1的情况,一般只出现在
DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。
抓包实际应用。
抓包过程中,比如fiddler工具,在抓取数据时,会在Inspectors里呈现连接的状态,就需要对具体呈现的值进行解析。
双方建立连接
Client --> 置SYN标志 序列号 = J,确认号 = 0 ----> Server
Client <-- 置SYN标志 置ACK标志 序列号 = K, 确认号 = J + 1 <-- Server
Clinet --> 置ACK标志 序列号 = J + 1,确认号 = K + 1 --> Server
a ----》b
a 发送数据完毕,(PSH,ACK) aseq = x,ack=y,datalen = z
b 接受到以后发送(ACK) bseq = aack, back = aseq + alen, datalen=blen
b 发送数据完毕 (PSH,ACK)bseq = bseq + blen,back = back,datalen = blen
a 确认接受 (ACK) aseq = back ,aack = bseq + blen
注:PSH标志指示接收端应尽快将数据提交给应用层。从我协议分析的经历来看,在数据传输阶段,几乎所有数据包的发送都置了PSH位;而ACK标志位在数据传输阶段也是一直是置位的。
Client --> 置PSH标志,置ACK标志 序列号 = 55555, 确认号 = 22222,数据包长度 = 11 ---> Server
Client <-- 置ACK标志,序列号 = 22222, 确认号 = 55566 (=55555 + 11),数据包长度 = 0 <--- Server
Client <-- 置PSH标志,置ACK标志 序列号 = 22223, 确认号 = 55566,数据包长度 = 22 <--- Server
Client --> 置ACK标志,序列号 = 55566, 确认号 = 22244(=22222+22),数据包长度 = 0 ---> Server
数据交换:
数据传输
在数据传输阶段,按照常理应用层数据的传输是这样的:(我们假定建立连接阶段Client端最后的确认包中序列号 = 55555, 确认号 = 22222)
首先先了解TCP吧……
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。下面假设服务器是A,客户机是B来进行讲解。
第一:客户机向服务器发送连接请求报文。即当B(客户端)要和A(服务器)通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接。 即(B)à[SYN]à(A)
备:SYN是该协议中的一个标志位。如果该位被置为1,则表示这个报文是一个请求建立连接的报文。
只有当A收到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。
第二:服务器端收到SYN标记后会发一个对SYN的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作。即(A)à(SYN/ACK) à(B)
备:ACK也是该协议的一个标志位。如果该位被置为1,则表示这个报文是一个用于确认的报文。
第三:客户端收到服务器端发送的SYN/ACK包后,再像服务器端发送ACK确认包,告知服务器连接已经成功建立。即BàACKàA
备:客户端在向服务器端发送ACK确认包后,表示TCP三次握手成功,同时TCP连接的每个包都会设置ACK位。借鉴个图吧,理解更轻而易举。
补充:
对于我们日常的分析有用的就是前面的五个字段。
它们的含义是:
URG:Urget pointer is valid (紧急指针字段值有效)
SYN: 表示建立连接
FIN: 表示关闭连接
ACK: 表示响应
PSH: 表示有 DATA数据传输
RST: 表示连接重置
实际使用过程中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。PSH为1的情况,一般只出现在
DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。
抓包实际应用。
抓包过程中,比如fiddler工具,在抓取数据时,会在Inspectors里呈现连接的状态,就需要对具体呈现的值进行解析。
双方建立连接
Client --> 置SYN标志 序列号 = J,确认号 = 0 ----> Server
Client <-- 置SYN标志 置ACK标志 序列号 = K, 确认号 = J + 1 <-- Server
Clinet --> 置ACK标志 序列号 = J + 1,确认号 = K + 1 --> Server
a ----》b
a 发送数据完毕,(PSH,ACK) aseq = x,ack=y,datalen = z
b 接受到以后发送(ACK) bseq = aack, back = aseq + alen, datalen=blen
b 发送数据完毕 (PSH,ACK)bseq = bseq + blen,back = back,datalen = blen
a 确认接受 (ACK) aseq = back ,aack = bseq + blen
注:PSH标志指示接收端应尽快将数据提交给应用层。从我协议分析的经历来看,在数据传输阶段,几乎所有数据包的发送都置了PSH位;而ACK标志位在数据传输阶段也是一直是置位的。
Client --> 置PSH标志,置ACK标志 序列号 = 55555, 确认号 = 22222,数据包长度 = 11 ---> Server
Client <-- 置ACK标志,序列号 = 22222, 确认号 = 55566 (=55555 + 11),数据包长度 = 0 <--- Server
Client <-- 置PSH标志,置ACK标志 序列号 = 22223, 确认号 = 55566,数据包长度 = 22 <--- Server
Client --> 置ACK标志,序列号 = 55566, 确认号 = 22244(=22222+22),数据包长度 = 0 ---> Server
数据交换:
数据传输
在数据传输阶段,按照常理应用层数据的传输是这样的:(我们假定建立连接阶段Client端最后的确认包中序列号 = 55555, 确认号 = 22222)