TCP 三次握手 和 四次挥手

概述

咱们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那咱们就不得不提 TCP 的三次握手和四次挥手。服务器

建连三次握手

下图为创建链接三次握手的流程图网络

下面经过咱们 wireshark 抓包工具来分析三次握手并发

三次握手数据包tcp

第一次握手

创建链接。客户端发送链接请求报文段,将SYN位置为1,Sequence Number为x;(x 是随机生成的一个 int 数值)而后,客户端进入SYN_SEND状态,等待服务器的确认;工具

第二次握手

服务器收到SYN报文段。服务器收到客户端的SYN报文段,须要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,本身本身还要发送SYN请求信息,将SYN位置为1,Sequence Number为 y (y 是随机生存的一个 int 数值);服务器端将上述全部信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;spa

第三次握手

客户端收到服务器的SYN+ACK报文段。而后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕之后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。计算机网络

断连四次挥手

第一次挥手:

Client (可使客户端,也能够是服务器端),设置Sequence Number和Acknowledgment Number,向 Server发送一个FIN报文段;此时,Client 进入FIN_WAIT_1状态;这表示 Client 没有数据要发送给 Server了;3d

客户端发送第一次挥手后,就不能在向 服务端发送数据了。server

第二次挥手:

Server 收到了 Client 发送的FIN报文段,向 Client 回一个ACK报文段,Acknowledgment Number 为 Sequence Number 加 1;Client 进入 FIN_WAIT_2 状态;Server 告诉 Client ,我“赞成”你的关闭请求;blog

Server 第一次响应后,还能够继续向 Client 发送数据,这里只是告诉 Client ,我收到你发送的关闭请求。

第三次挥手

Server 向 Client 发送 FIN 报文段,请求关闭链接,同时 Server 进入 CLOSE_WAIT 状态;

当 Server 的数据响应完成后,再告诉 Client,我这边也能够关闭请求了, 这时
Server 就不能再向 Client 发送数据了

第四次挥手

Client 收到 Server 发送的 FIN 报文段,向 Server 发送 ACK 报文段,而后 Client 进入
TIME_WAIT 状态;Server 收到 Client 的 ACK 报文段之后,就关闭链接;此时,Client
等待2MSL后依然没有收到回复,则证实 Server 端已正常关闭,那好,Client 也能够关闭链接了。

什么是MSL

MSL是Maximum Segment Lifetime英文的缩写,中文能够译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。由于tcp报文(segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文,而ip头中有一个TTL域,TTL是time to live的缩写,中文能够译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报能够通过的最大路由数,每通过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中经常使用的是30秒,1分钟和2分钟等。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后能够再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当链接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中能够经过设置SO_REUSEADDR选项达到没必要等待2MSL时间结束再使用此端口。

TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

为何要三次握手?

为何要三次握手

TCP 创建链接,其实经过两次握手就能够创建链接了,为何要三次呢?是否是画蛇添足呢?

一、《计算机网络》中是这样说的:

为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误。
在书中同时举了一个例子,以下:
已失效的链接请求报文段”的产生在这样一种状况下:client发出的第一个链接请求报文段并无丢失,而是在某个网络结点长时间的滞留了,以至延误到链接释放之后的某个时间才到达server。原本这是一个早已失效的报文段。但server收到此失效的链接请求报文段后,就误认为是client再次发出的一个新的链接请求。因而就向client发出确认报文段,赞成创建链接。假设不采用“三次握手”,那么只要server发出确认,新的链接就创建了。因为如今client并无发出创建链接的请求,所以不会理睬server的确认,也不会向server发送数据。但server却觉得新的运输链接已经创建,并一直等待client发来数据。这样,server的不少资源就白白浪费掉了。采用“三次握手”的办法能够防止上述现象发生。例如刚才那种状况,client不会向server的确认发出确认。server因为收不到确认,就知道client并无要求创建链接。”

二、网络故障

好比,如今网络出现了故障,只能发请求数据包,而接收不到响应数据包,那么只要发送一次请求,服务器就创建请求,这样确定也是不对的,网络请求有来有回才能完成通信。因此三次握手是必不可少的。

为何要四次挥手呢

TCP协议是一种面向链接的、可靠的、基于字节流的运输层通讯协议。TCP是全双工模式,这就意味着,当 Client 发出FIN报文段时,只是表示 Client 已经没有数据要发送了,Client 告诉 Server,它的数据已经所有发送完毕了;可是,这个时候 Client 仍是能够接受来自 Server 的数据;当 Server 返回ACK报文段时,表示它已经知道 Client 没有数据发送了,可是 Server 仍是能够发送数据到 Client 的;当 Server 也发送了FIN报文段时,这个时候就表示 Server 也没有数据要发送了,就会告诉 Client ,我也没有数据要发送了,以后彼此就会愉快的中断此次TCP链接。若是要正确的理解四次分手的原理,就须要了解四次分手过程当中的状态变化。

相关文章
相关标签/搜索