三报文握手
1.概述
TCP是面向连接的协议。TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段,即我们说的“三次握手”(严格讲是一次握手过程中交换了三个报文)。
2.过程
一开始客户端和服务器端中的TCP进程都处于关闭状态,假设客户端主动打开连接,服务器端被动打开连接;这时客户端TCP进程创建传输控制模块TCB,服务器端进程也创建传输控制模块TCB并监听客户请求,以便及时响应。
- 第一次
客户端打算建立TCP连接时,向服务器端发送连接请求报文段,其首部中的同步位SYN=1,ACK=0,并选择一个初始序号seq=x,这时客户端TCP进程进入同步已发送状态(SYN-SENT)。 - 第二次
服务器端收到连接请求报文段后,如果同意连接,则向客户端发送确认报文段,其首部中的同步位和ACK位都为1,确认号为ack=x+1,并选择一个初始序号为seq=y,这时服务器端TCP进程进入同步已收到状态(SYN-RCVD)。 - 第三次
客户端收到服务器端的确认后,还需要向服务器端发送确认报文段,其首部中的同步位和ACK位都为1,确认号为ack=y+1,自己的序号为seq=x+1,这时客户端TCP进程进入已建立连接状态(ESTABLISHED)。
当服务器端收到客户端的确认后,也进入已建立连接状态(ESTABLISHED)。
3.过程图示
四报文握手
在三报文握手中的第二次报文发送时,可以先发送一个确认报文段(ACK=1,ack=x+1),再发送一个同步报文段(SYN=1,seq=y),这就变成了四报文握手。
几个问题
- 1.为什么客户端最后还要发送一次确认呢(第三次)?
为了防止已失效的连接请求报文段又发给服务器端而产生错误。
比如客户端发送的第一个请求报文段在某些网络节点滞留了,导致连接释放后的某个时间才到达服务器端,服务器端会向客户端发送确认报文段。
如果不采用三报文握手,那么新的连接就建立了,但客户端不知道建立了连接,就不会发送数据导致服务器端一直等待;
而采用三报文握手,客户端不会向服务器端的确认发出确认,服务器端收不到确认,就不会建立连接。