前提
面试的时候会经常被问道什么是TCP的三次握手,为什么要三次,又为什么要四次挥手?回到这个问题之前先理解客户端与服务器是怎么建立连接,怎么通信以及断开链接的,所以有必要搞懂接下来一连串的英文缩写。有6种英文缩写表示的是tcp的标志位:SYN(synchronous建立联机) ACK(Acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)。还有两个其他缩写:seq(sequence number顺序号码),ack(acknowledge number确认号码)。
三次握手
小抄中是这么说的:TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。
这小抄除了能应付纸上考试还能干啥!!!
我们直接照着图看,清晰明了,上图——
当然这个图不是我画的,是引用过来的哈。
- 第一次握手:建立连接。Client发送连接请求报文段,将SYN位置为1,seq随机的为x;然后,Client进入SYN_SEND状态,等待Server的确认。Server由SYN=1知道,Client请求建立连接;
- 第二次握手:Server收到SYN报文段,需要确认联机信息,设置ack为x+1(客户端的seq+1);同时,自己还要发送SYN请求信息,将SYN位置为1,seq再随机为y;此时服务器进入SYN_RECV状态;
- 第三次握手:Client收到后检查ack是否正确。即第一次发送的seq+1,以及位码ack是否为1,若正确,Client会再发送ack=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1,则连接建立成功。客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
四次挥手
上图吧
小抄又来了:所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
总结
有了上面的鞭辟入里的讲解,就可以回答开头说的问题了。
三次握手而不是两次呢?
为什么要四次挥手呢?
对题上的问题,这篇博客写得很好,推荐一下http://www.jellythink.com/archives/705