TCP/IP协议三次握手和四次挥手

TCP/IP简介:

TCP/IP 是不同的通信协议的大集合。

是指能够在多个不同网络间实现信息传输的协议族。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议族, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP/IP协议参考ISO,OSI模型共有七层,但在TCP/IP协议中,它们被简化为了四个层次。如图:

TCP/IP协议三次握手和四次挥手_第1张图片

三次握手建立连接

三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。

TCP/IP协议三次握手和四次挥手_第2张图片

图中字符的含义:

 SYN:连接请求/接收 报文段

 seq:发送的第一个字节的序号

 ACK:确认报文段

 ack:确认好,希望收到的下一个数据的第一个字节的序号

TCP协议中,主动发起请求的一端称为客户端,被动连接的一端称为服务端。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。

刚开始的时候,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后便进入LISTEN状态,此时准备接收客户端发来的连接请求。

1、第一次握手:

客户端向服务端发送一个 SYN 报文(SYN = 1),并指明客户端的初始化序列号 ISN(x),即图中的 seq = x,表示本报文段所发送的数据的第一个字节的序号。请求发送后,客户端进入SYN_SENT 状态。

 SYN-SENT:在发送连接请求后等待匹配的连接请求

 SYN=1,ACK=0表示该报文段为连接请求报文

 x为本次TCP通信的字节流的初始序号

 TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号

2、第二次握手:

服务器收到客户端的 SYN 报文之后,会发送 SYN 报文作为应答(SYN = 1),并且指定自己的初始化序列号 ISN(y),即图中的 seq = y。同时会把客户端的 ISN + 1 作为确认号 ack 的值,表示已经收到了客户端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 x + 1,此时服务器进入 SYN-RCVD 的状态。

SYN-RCVD:在收到和发送一个连接请求后等待对连接请求的确认

 SYN=1,ACK=1表示该报文段为连接同意的应答报文

 seq=y表示服务端作为发送者时,发送字节流中的第一个字节序号

 ack=x+1表示服务端希望客户端发送的下一个数据报初始序号是从x+1开始

3、第三次握手:

客户端收到服务器端响应的 SYN 报文之后,会发送一个 ACK 报文,把服务器的 ISN + 1 作为 ack 的值,表示已经收到了服务端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1),此时客户端进入 ESTABLISHED状态。服务器收到 ACK 报文之后,也进入ESTABLISHED状态,此时双方连接的建立完成。

ESTABLISHED:代表一个打开的连接,数据可以传送给用户

四次挥手连接释放

TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。

TCP连接是双向的,在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。

TCP/IP协议三次握手和四次挥手_第3张图片

1、第一次挥手

 客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端进入 FIN_WAIT_1 状态,等待服务端的确认。

 FIN-WAIT-1 :等待远程TCP的连接中断请求,或先前的连接中断请求的确认

 FIN=1表示该报文段是一个连接释放请求

 seq=u,u-1是客户端向服务端发送的最后一个字节的序号

2、第二次挥手

服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端进入 CLOSE_WAIT状态。

 CLOSE_WAIT :等待从本地用户发来的连接中断请求

 ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答

 seq=v,v是服务端释放应答报文段第一个字节序号

 ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节

第二次挥手完成后,客户端到服务端方向的连接已经释放,服务端不会再接收客户端的数据,客户端也没有数据要发送了。但服务端到客户端方向的连接仍然存在,服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3、第三次挥手

服务端将最后的数据发送完毕后,就向客户端发送连接释放报文,其报文头包含:FIN=1,ack=u+1,由于在CLOS-WAIT状态,服务端很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器进入LAST-ACK状态。

LAST_ACK : 等待原来发向远程TCP的连接中断请求的确认

4、第四次挥手

客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端进入TIME_WAIT状态。

 TIME_WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

该状态会持续2MSL(最长报文段寿命)时间,这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态,撤销TCB。

服务端只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

常见问题:

1、TCP建立连接为什么是三次握手,而不是两次或四次?

两次握手会将已失效的连接请求报文段再次传送到服务端,会造成服务端资源的浪费。

三次握手已经能说明握手时的通信是正常的,四次握手就显得浪费了。

2、TCP关闭连接时为什么是四次挥手?

 由于 TCP 的半关闭(half-close)特性,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

 任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

3、为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?

 1.为了保证服务端能收到客户端的确认应答。

若客户端发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,服务端等待超时后就会重新发送连接释放请求,但此时客户端已经关闭了,不会作出任何响应,因此服务端就无法正常关闭。

2.防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。

 客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。


 福利

 

你可能感兴趣的:(软件测试,tcp/ip,网络,服务器,功能测试)