详述TCP的三次握手和四次挥手及示意图

一.

TCP(传输控制协议:面向连接的可靠性传输协议,除完成传输层的基本工作外,还需保障传输的可靠性。)

TCP是基于OSI开放式系统互联参考模型七层中的传输层,在基于提供端口号与分段的任务而提供相应服务的两种协议之一(另一种为UDP)

详述TCP的三次握手和四次挥手及示意图_第1张图片

1.握手过程中的符号简称:

TCB 传输控制块,打开后服务器/客户端进入监听(LISTEN)

SYN TCP报文标志位,该位为1时表示发起一个新连接

ACK TCP报文标志位,该位为1时,确认序号有效,确认接收到消息。TCP规定,在连接建立后所有报文的传输都必须把ACK置1

seq sequence number,报文初始序列号,代表发送的第一个字节的序号。

ack acknowledgement number,报文确认序号,代表希望收到的下一个数据的第一个字节的序号。

2.TCP的三次握手过程:

注意:不管请求还是应答,都是带两种数据:请求号SYN/应答号ACK+数据包报文号;

请求时要发请求号SYN,应答时要发送应答号ACK;在数据包传送时,发送方要发送当前数据包报文号seq和确认收到上一个数据包的确认报文号ack。

三次握手示意图:

详述TCP的三次握手和四次挥手及示意图_第2张图片

前期:

TCP服务器创建传输控制块TCB,进入监听LISTEN状态,准备接收请求。

第一次握手:客户端——请求(发送请求SYN+数据包当前序列号seq,无需应答)

客户端创建传输控制块TCB,进入监听LISTEN状态。设置SYN=1,表示这是握手报文,并发送给服务器设置发送的数据包序列号seq=x此时客户端处于同步已发送SYN-SENT状态

第二次握手:服务器——确认(发送应答ACK+请求SYN+确认收到上一个数据包的确认号ack+当前数据包序列号seq)

设置ACK=1,表示确认应答。

设置ack=x+1,表示已收到客户端x之前的数据,希望下次数据从x+1开始设置SYN=1,表示握手报文,并发送给客户端

设置发送的数据包序列号seq=y此时服务器处于同步已接收SYN-RCVD状态

第三次握手:客户端——确认服务器的确认 (发送应答ACK+确认收到上一个数据包的确认号ack+当前数据包序列号seq,连接已建立,无需请求)

设置ACK=1,表示确认应答。

设置ack=y+1,表示收到服务器发来的序列号为seq=y的数据包,希望下次数据从y+1开始设置seq=x+1,表示接着上一个数据包seq=x继续发送至此三次握手结束,连接建立

二.

1.序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

2.确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效(注意:为了防止混淆确认号和ACK,一般确认号写作ack,而ACK就写作ACK)

3.同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

4.TCP四次挥手的过程

1客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN_WAIT_1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

2服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE_WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE_WAIT状态持续的时间。

3)客户端收到服务器的确认请求后,此时,客户端就进入FIN_WAIT_2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据,版关闭状态,skynet就支持这种半关闭状态,redis,nginx,memeched均不支持)。

4服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST_ACK(最后确认)状态,等待客户端的确认。

5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME_WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(报文最大生存时间)(有的是2分钟,有的30s,1s等)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

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

  四次挥手示意图:

详述TCP的三次握手和四次挥手及示意图_第3张图片

你可能感兴趣的:(tcp/ip,网络,网络协议)