您的位置:首页 > 理论基础 > 计算机网络

认识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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络