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

【计算机网络】TCP三次握手和四次挥手

2015-04-07 16:14 477 查看

一、TCP简介

TCP(传输控制协议,transmission control protocol)是可靠的、面向连接的数据传输协议,需要通过三次握手建立通信信道,他会把长数据切分成小数据包进行IP发送,以便进行差错控制(发送切分的小数据包,每发送一次都要等另一方确认,网络传输是不可靠的,如果中途某一个小数据包出错,则重新发送一次;如果不切分成小数据包,则只有等待长数据发送完成在进行ACK以及校验,这时候如果出错,则需要全部重传,这尼玛不是坑爹吗)。



二、三次握手

客户端通过三次握手和服务器端建立连接,进行通信,其过程如下图所示。



1. 三次握手过程详解

思想:客户端需要和服务器建立通信连接,但是不知道服务器是否可以建立链接,因此发起第一次握手,目的是告诉服务器端“我想和你建立链接”;当服务器收到请求建立链接数据包的时候,如果可以建立链接,则向客户端回应“我可以和你建立链接,我准备好了,你发起吧”,完成第二次握手;当客户端收到这个允许建立链接的响应数据包的时候,立即向服务器端发起确认,并进入ESTABLISHED状态,服务器收到该数据包之后,也进入ESTABLISHED状态,此时TCP链接建立完毕,三次握手完成。

细节:第一次握手的时候,客户端发送一个SYN=1的同步标志(该标志仅在三次握手时有效)和一个随机数seq给服务器端;第二次握手的时候,当服务器端收到SYN=1,表明客户端需要和自己建立TCP链接,如果服务器端授予链接,则也回复一个SYN=1的标志位(这个标志位表示三次握手,而且仅在三次握手中有效,三次握手中都必须出现)以及ACK=seq+1(用于校验)和一个随机数seq;第三次握手的时候,客户端收到服务器端授予链接的数据包,于是查看SYN=1标志位,确认是建立链接的数据包,校验ACK中的随机数是否是自己发送的随机数+1,如果是,则立即发送数据包向服务器端进行确认,包含SYN=1(三次握手标志位,很重要)以及ACK=seq+1(服务器端的随机数)和自己的seq+1给服务器端,发完后立即进入ESTABLISHED状态,服务器端收到之后,检查ACK和seq,确认无误也立即进入ESTABLISHED状态,链接建立,三次握手完毕。

2. 为什么不是一次握手

如果是一次握手,那么客户端在发完请求建立链接数据包的时候就要立即进入ESTABLISHED状态,网络传输时不可靠的(没有TCP进行差错控制和校验的话),如果这时候数据包丢失了服务器端收不到,那么就悲剧了,客户端已经绑定端口占用资源空等了,之后传输数据都不会得到ACK确认,会一直发送数据包给服务器,服务器由于没有收到请求建立链接的数据包从而认为后续到达的数据包都是垃圾信息全部丢弃,这样会造成客户端资源量费,消耗网络带宽,因此至少还需要服务器端的确认客户端才能建立链接分配资源。

3. 为什么不是两次握手

接着一次握手讨论,客户端在发送请求建立链接之后要等到服务器端确认才开启链接分配资源,那就意味着服务器端在收到请求建立链接的数据包之后就要进入ESTABLISHED状态——也就是客户端发起请求,服务器端收到请求后想客户端确认并立即进入ESTABLISHED状态,此时如果服务器端向客户端确认的数据包丢失,那么客户端不会和服务器端成功建立链接导致服务器端的资源量费,此时如果客户端有重试机制,那么就会导致服务器端建立两个以上的连接(一个是分配资源但是没有客户端),要是在网络抖动期间有大量客户端建立链接,那么服务器的资源浪费就太严重了,所以,三次链接更靠谱。

三、四次挥手

客户端通过四次挥手和服务器端解除通信连接,释放资源,其过程如下图所示。



1. 四次挥手详解

思想:假设是客户端发起关闭连接请求。首先明确的一点是TCP通信时双工通信,即客户端可以向服务器端发送数据,同时服务器端也可以向客户端发数据,因此在关闭的时候,每一个方向都要单独关闭。第一次挥手,此时客户端数据发送完了需要关闭连接,但是他不知道服务器端是否还有数据要发送可不可以关闭链接,于是发起结束链接的数据包告诉服务器端“我要关闭连接了,你是不是同意”;第二次挥手,服务器端收到之后,立即回复ACK,表明“哦,我已经知道你的数据发送完了,我回收我接收数据的资源,你可以回收你发送数据的资源了”,进入你不再发数据我不再收数据的状态,也就是各自关闭一半;第三次挥手,服务器端也没有数据发送了,于是发送关闭连接的数据包FIN给客户端,通知我的数据发完了,准备管理链接;第四次握手,当客户端收到之后,立即向服务器端确认并关闭资源,服务器端收到之后,进入closed状态,服务器端也关闭资源,四次挥手结束。

细节:http://blog.chinaunix.net/uid-7411781-id-3812206.html



2. 为什么不是一次挥手

这个比较容易理解,节省时间,不做讨论。

3. 为什么不是两次挥手

这个也比较容易理解,节省时间,不做讨论。

4. 为什么不是三次挥手

原因:http://blog.csdn.net/xifeijian/article/details/12777187,简单来说,第三次握手后服务器端向客户端ACK是附在随后服务器端向客户端通信的数据包之后,而不是单独的一个ACK数据包。

参考资料:

1. http://www.cnblogs.com/panjun-donet/articles/1142466.html
2. http://www.cnblogs.com/rootq/articles/1377355.html
3. 《HTTP权威指南》

4. http://blog.csdn.net/xifeijian/article/details/12777187
附注:

时间紧迫,写的简陋,烦请见谅。本文如有错漏,烦请不吝指正,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: