目录
一.TCP/UDP的区别
二.三次握手
三.四次挥手
四.常见面试题
一.TCP/UDP的区别
TCP:TCP协议是面向连接,连接稳定可靠适用于网络连接连接较高的场景,可以准确无误的把数据传递给对方,但传输速度上可能会存在一定的延迟。TCP的应用场景如传输文件,发送邮件,浏览网页等。
UDP:UDP协议是非连接的,是面向报文的。UDP协议传输速度快,对CUP的内存资源占用远小于TCP,但对网络传输过程中产生的丢包UDP不能保证。所以适用于对数据传输实时性要求高,但是对少量丢包没有要求的场景,比如域名查询,语音通话,视频直播等。
二.三次握手
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。
第一次握手:客户端端向服务端发送SYN包,并进入SYN_SENT状态,等待服务器确认。
第二次握手:服务器收到客户端的 SYN包之后,必须确认客户端的SYN,会以自己的SYN包作为应答,即SYN+ACK包,此时服务端进入SYN+RCVD状态。
第三次握手:客户端接收到服务端的SYN+ACK包,向服务端发送消息确认包ACK,发送完毕后客户端服务端都进入ESTABLUSHED(TCP连接成功)状态,完成三次握手。
三.四次挥手
第一次挥手:客户端向服务器发送FIN报文,发完后进入FIN_WAIT_1
状态,即主动关闭TCP连接,不再发送数据,但可以接收服务器发来的报文,等待服务器回复。
第二次挥手:服务器接到FIN报文后,返回一个ACK报文,表明自己接收到此报文,服务器进入CLOSE_WAIT
关闭等待状态。
第三次挥手:服务器关闭客户端连接,发送FIN报文给客户端,此时服务器处于LAST_ACK状态,等待客户端回应。
第四次挥手:客户端收到FIN报文后,发送一个ACK给服务器作为应答,此时客户端处于TIME_WAIT
状态,这个状态是为了等待足够的时间以确保TCP接收到连接中断请求的确认。
四.常见面试题
1.为什么需要三次握手,而不是两次握手?
第一次握手:客户端发包,服务端收到。可以说明客户端发送正常,服务端接受正常。
第二次握手:服务端发包,客户端收到。可以说明客户端接收正常,但如果客户端没有应答的话,服务端并不知道客户端是否收到。
第三次握手:客户端发包,服务端收到。客户端应答,说明服务端发送正常。
2.为什么需要四次挥手?
服务端接收到FIN报文后,可能不会立马关闭,所以要先回复客户端一个ACK报文,告诉客户端:“你发的FIN报文我收到了”,只有等服务端所有的数据都发送完了,才可以回复FIN报文,因此不能一起发送,需要四次挥手。
3.如果已经建立了连接,但客户端出故障了怎么办?
TCP还有一个保活计时器,客户端出现故障时,服务器不能一直等下去,白白浪费资源。服务端每收到一次客户端请求后都会重新复位这个计时器,通常设置为两小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文,以后每隔75秒发送一次,若连续发送10个探测报文后仍然没有反应,服务端就会认为客户端出了问题,接着就会关闭连接。