TCP协议是面向连接的可靠的通信协议。类似于打电话。
UDP协议是非面向连接的不可靠的传输协议。类似于发短信。
1、TCP的三次握手,为什么不是两次或者四次?
首先,我们要知道三次握手是为了什么。
客户端首先给服务器端报告:我要和你建立连接,顺便把我的发送能力发给服务器,让服务器知道。
服务器判断是否可以和你建立连接,并把服务器的接收能力,返回给客户。
TCP的三次握手是为了防止客户端已失效的连接请求突然又传送到了服务端,因而产生错误。
如果客户端只发送一次连接请求,服务器端接收到后就直接认为已经建立新的传输连接,一直在等待客户端发送数据,就会产生服务器端资源的浪费。
所以只有三次握手才能够保证,双方的发送能力和接收能力达到了一个协商好的过程。但是协议没有100%可靠的,所以三次已经够了,如果4次也不能保证100%可靠的。TCP本身就是一个稳定的可靠的连接。
2、解释一下TCP的四次挥手?
(1)Client 发出FIN报文段时,只是表示 Client 已经没有数据要发送了,Client 告诉 Server,它的数据已经全部发送完毕了;但是,这个时候 Client 还是可以接受来自 Server 的数据;
(2)当 Server 返回ACK报文段时,表示它已经知道 Client 没有数据发送了,但是 Server 还是可以发送数据到 Client 的;
(3)当 Server 也发送了FIN报文段时,这个时候就表示 Server 也没有数据要发送了,就会告诉 Client ,我也没有数据要发送了;
(4)Client返回ACK报文段,表示我知道服务器端已经没有数据要发送了。
之后彼此就会愉快的中断这次TCP连接。
可以简单理解为:
(1)客户端:我没有数据要发送了(FIN);(2)服务器端:我知道了(ACK);(3)服务器端:我没有数据要发送了(FIN);(4)客户端:我知道了(ACK);
简而言之,这样是为了尽可能的保证双方在数据发送和接收过程中没有丢失数据。
3、三次握手过程中的状态变化?
(1)请求端(客户端)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序列号(ISN),这个SYN为报文段1.
客户端状态:CLOSED——SYN-SENT
服务器端状态:CLOSED——LISTEN
(2)服务器发回包含服务器的初始序列号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个字符。
客户端状态:SYN-SENT——ESTABLISHED
服务器端状态:LISTEN——SYN-RCVD
(3)客户必须将明确序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)
服务器端状态:SYN-RCVD——ESTABLISHED
4、四次挥手过程中的状态变化?
(1)Client 发出FIN报文段时,只是表示 Client 已经没有数据要发送了,Client 告诉 Server,它的数据已经全部发送完毕了;但是,这个时候 Client 还是可以接受来自 Server 的数据;
客户端状态:ESTABLISHED——FIN-WAIT-1
服务器端状态:ESTABLISHED——CLOSE-WAIT
(2)当 Server 返回ACK报文段时,表示它已经知道 Client 没有数据发送了,但是 Server 还是可以发送数据到 Client 的;
客户端状态:FIN-WAIT-1——FIN-WAIT-2
服务器端状态:CLOSE-WAIT——LAST-ACK
(3)当 Server 也发送了FIN报文段时,这个时候就表示 Server 也没有数据要发送了,就会告诉 Client ,我也没有数据要发送了;
客户端状态:FIN-WAIT-2——TIME-WAIT
服务器端状态:LAST-ACK——CLOSED
(4)Client返回ACK报文段,表示我知道服务器端已经没有数据要发送了。
客户端状态:TIME-WAIT——CLOSED