本文为Java后端面试自学内容,记于此以便学习和回忆,如有侵权或错误,欢迎讨论指教!
三次握手
声明本文为简单的概括,有可能不是很详细
三次握手也就是建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
过程看文字好复杂,其实就是确保两者已经建立通信。
简单理解第一次 客户端发送连接请求
第二次 服务端应答确认连接请求
第三次 客户端确认 服务端确认建立链接
为什么两次不可以呢
没有第三次,服务端应答确认后认为链接已经成功,会造成数据的丢失。客户端会一直申请造成资源的浪费
四次挥手
四次挥手就是终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
简单理解 客户端发起连接释放请求,服务端回应确定报文,然后客户端等数据发送完,服务端继续发送没有完成的数据,然后发送确定报文,客户端收到回应确认完成四次挥手。