Java面试题

题目

对 tcp 了解吗?讲讲它的三次握手和四次挥手?为什么需要三次握手,为什么需要四次挥手。

答案

三次握手

第一次握手:客户端向服务器发送连接请求,这个时候报文首部中的同步为 SYN = 1,同时生成一个随机序列号 seq = x。

第二次握手:TCP 的服务器如果同意连接,就发出确认报文。确认报文是 ACK = 1,SYN = 1,并带有一个确认号 ack = x +1,同时自己也生成一个序列号 seq = y。

第三次握手:TCP 客户端进程收到确认后,向服务器给出确认,确认报文是 ACK = 1,ack = y + 1。

04 三次握手.png

四次挥手

第一次挥手:客户端发送结束请求给服务端,报文有 FIN = 1,其序列号为 seq = u。

第二次挥手:服务端收到客户端发起的结束请求后返回 ACK = 1 , ack = u +1 ,并且自己生成一个序列号 seq = v。

第三次挥手:服务端向客户端发送关闭报文,FIN = 1,ack = u + 1, seq = w。

第四次挥手:客户端收到服务端请求之后发送 ACK 确认, ACK = 1,ack = w + 1,自己生成一个序列号 seq = u + 1。

05 四次挥手.png

为什么需要三次握手

在网络连接中会存在这样的情况,当第一次发起握手请求的时候,由于网络原因,在某个网络节点滞留了,这个连接请求就认为失效了,然后请求到服务端,服务端收到请求后会给客户端回应。如果没有三次握手,那么服务端就会一直连着,会浪费资源。

为什么需要四次挥手

当客户端发起关闭请求的时候,只表示没有新的数据发送给服务端了,但是不能表示当前的请求中所有的数据全部发送了。当服务端收到请求之后不会立刻关闭连接,会等一段时间,当自己这边的数据处理完之后,会给客户端发送关闭请求,告诉客户端,可以关闭了。