美文网首页
【转载】TCP的三次握手和四次挥手

【转载】TCP的三次握手和四次挥手

作者: Gs1993 | 来源:发表于2017-12-07 11:04 被阅读0次

    作者:myvin
    原文出处:http://www.cnblogs.com/myvin/p/4862167.html

    TCP的三次握手和四次挥手

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
    在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

    三次握手

    TCP连接是通过三次握手来连接的。

    第一次握手

    当客户端向服务器发起连接请求时,客户端会发送同步序列标号SYN到服务器,在这里我们设SYN为m,等待服务器确认,这时客户端的状态为SYN_SENT

    第二次握手

    当服务器收到客户端发送的SYN后,服务器要做的是确认客户端发送过来的SYN,在这里服务器发送确认包ACK,这里的ACK为m+1,意思是说“我收到了你发送的SYN了”,同时,服务器也会向客户端发送一个SYN包,这里我们设SYN为n。这时服务器的状态为SYN_RECV

    一句话,服务器端发送SYNACK两个包。

    第三次握手

    客户端收到服务器发送的SYNACK包后,需向服务器发送确认包ACK,“我也收到你发送的SYN了,我这就给你发个确认过去,然后我们即能合体了”,这里的ACK为n+1,发送完毕后,客户端和服务器的状态为ESTABLISH,即TCP连接成功。

    在三次握手中,客户端和服务器端都发送两个包SYNACK,只不过服务器端的两个包是一次性发过来的,客户端的两个包是分两次发送的。

    三次握手示意图如下(纯手绘,见谅见谅):

    image

    四次挥手

    当A端和B端要断开连接时,需要四次握手,这里称为四次挥手。

    断开连接请求可以由客户端发出,也可以由服务器端发出,在这里我们称A端向B端请求断开连接。

    第一次挥手

    A端向B端请求断开连接时会向B端发送一个带有FIN标记的报文段,这里的FINFinish的意思。

    第二次挥手

    B端收到A发送的FIN后,B段现在可能现在还有数据没有传完,所以B端并不会马上向A端发送FIN,而是先发送一个确认序号ACK,意思是说“你发的断开连接请求我收到了,但是我现在还有数据没有发完,请稍等一下呗”。

    第三次挥手

    当B端的事情忙完了,那么此时B端就可以断开连接了,此时B端向A端发送FIN序号,意思是这次可以断开连接了。

    第四次挥手

    A端收到B端发送的FIN后,会向B端发送确认ACK,然后经过两个MSL时长后断开连接。

    MSL是Maximum Segment Lifetime,最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。
    

    四次挥手示意图如下(纯手绘,见谅见谅):

    image

    两次握手可以么?

    TCP连接时是三次握手,那么两次握手可行吗?

    在《计算机网络》中是这样解释的:已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ACK包。这样就会白白浪费资源。

    而经过三次握手,客户端和服务器都有应有答,这样可以确保TCP正确连接。

    为什么TCP连接是三次,挥手确是四次?

    在TCP连接中,服务器端的SYNACK向客户端发送是一次性发送的,而在断开连接的过程中,B端向A端发送的ACKFIN是是分两次发送的。因为在B端接收到A端的FIN后,B端可能还有数据要传输,所以先发送ACK,等B端处理完自己的事情后就可以发送FIN断开连接了。

    为什么在第四次挥手后会有2个MSL的延时?

    前文说到

    MSL是Maximum Segment Lifetime,最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。
    

    假定网络不可靠,那么第四次发送的ACK可能丢失,即B端无法收到这个ACK,如果B端收不到这个确认ACK,B端会定时向A端重复发送FIN,直到B端收到A的确认ACK。所以这个2MSL就是用来处理这个可能丢失的ACK的。

    相关文章

      网友评论

          本文标题:【转载】TCP的三次握手和四次挥手

          本文链接:https://www.haomeiwen.com/subject/slcdixtx.html