目录
面试总结
计算机网络是面试Java开发工程师中的常客,平均下来基本上每次面试都会问个三五个,下面这些问题都是一些高频问题了,如果还要说一个更高频的话可能就是TCP的三次握手和四次挥手,URL网页跳转过程以及涉及到的相关协议,HTTPS的密钥交换过程
总的来说计算机网络的问题基本就涵盖在这一块,还是建议有个全面的了解
问题总结与答案整理(仅供参考)
1. TCP三次握手和四次挥手
1.1 TCP三次握手和四次挥手的过程
三次握手:
- 客户端向服务端发送一个SYN=1的请求报文
- 服务端向客户端发送一个ACK=1,SYN=1的确认报文
- 客户端向服务端发送一个ACK=1的确认报文
四次挥手:
- 客户端发送一个FIN=1的报文,并且停止发送数据
- 服务端收到报文后,向客户端发送一个ACK=1的确认报文
- 服务端最后的数据发送完毕后,向客户端发送一个FIN=1的报文,并且停止发送数据
- 客户端收到后,发回一个ACK=1的确认报文
1.2 为什么TCP建立连接需要三次握手,断开连接需要四次挥手
TCP建立连接需要三次握手的原因在于只有经过三次握手之后客户端与服务端才能都确认自己的发送与接收是正常的
第一次握手:客户端无法确认任何东西,服务端能够确认客户端发送正常,自己接收正常
第二次握手:客户端能够确认自己和服务端均收发正常,服务端依然只能怪确认客户端发送正常,自己接收正常
第三次握手:双方都能确认自己和对方收发正常
断开连接需要四次挥手的原因在于客户端或者服务端在发出连接释放的通知后,只能代表自己没有数据要发送了,而对方有可能还有数据要发送
前两次挥手:只能表明客户端没有数据要发送了,但服务端可能还有数据要发送,所以客户端处于一个半关闭状态
后两次挥手:代表服务端也没有数据要发送了,待客户端确认后即可断开连接
1.3 TCP四次挥手为什么有Time-Wait(等待2MSL)过程
这是为了保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN=1报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL(maximum segment lifetime)时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器
1.4 TCP如果没有完成第四次挥手会发生什么
服务端发送FIN数据包并携带ACK至客户端之后直接断开连接,如果客户端没有收到这个FIN数据包,那么客户端会一直处于等待关闭状态
1.5 TCP第三次握手可以传输数据吗
可以传输数据,但是会消耗序列号
上述几个问题推荐通过两张动图-彻底明白TCP的三次握手与四次挥手