赞
踩
建立TCP连接需要三次握手,而断开连接则需要四次挥手。
有以下几种标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
一、三次握手
第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X=0。
第二次握手:服务器收到客户端发来的报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Y=0,将确认序号(Acknowledgement Number)设置为客户的序列号加1,即X+1=0+1=1。
第三次握手:客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,即第一次发送的序号加1(X+1=1)。以及标志位ACK是否为1。若正确,客户端再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。服务器端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。
连接建立过程如下图:
例题:
TCP建立连接的过程采用三次握手,已知第三次握手报文的发送序列号为1000,确认序列号为2000,请问第二次握手报文的发送序列号和确认序列号分别为多少?(1999,1000)。
解析:
一般是客户端先向服务器发送请求:
第一次握手发送一个序列号;
第二次握手的序列号是单独发送的,第二次握手的确认号是第一次握手序列号+1;
第三次握手的序列号是第二次握手的确认号,第三次握手的确认号是是第二次握手的序列号+1;
二、四次挥手
中断连接端可以是Client端,也可以是Server端。
第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X=1,确认序号为Z=1。
第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即X=X+1=2。序号为收到的确认序号=Z。
第三次挥手:服务器关闭与客户端的连接,发送一个FIN。标志位FIN和ACK置为1,序号为Y=1,确认序号为X=2。
第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=2。序号为收到的确认序号X=2。
断开连接过程如下图:
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假想网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
主动打开的的一方称为客户端,被动打开的一端称为服务端。
主动打开就是指利用TCP报文请求建立连接的一方。就比如你给别人打电话,你先拨号,你就是主动打开。
被动打开就是接受的另一方的请求报文并同意建立连接的一方。就比如你给别人打电话过去,对方接听了,打就是被动打开。
被动打开:因为有链接需要处理,因此被动打开。
主动打开:因为需要和对方建立链接,因此主动打开。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。