1.为什么要三次握手,而不是两次?
(1)B资源浪费问题(先发后至导致的)
a. A主动和B建立TCP连接,A的第一个SYN=1消息拥塞,超时后发出第二个SYN=1消息;
b. B收到第二个SYN=1消息,响应SYN=1、ACK=1消息,建立连接,传输数据,然后断开;
c. 此时,第一个SYN=1消息到达B,B响应,发出SYN=1、ACK=1消息;
d. A会忽略这条响应消息,而B会以为连接建立成功了,造成B的资源浪费。
(2)可能的死锁问题
a. A主动和B建立TCP连接,A的SYN=1消息到达B,B响应SYN=1、ACK=1消息;
b. B响应消息丢包了。此时B以为连接建立,A等待B的确认;
c. B会开始发送数据消息;A仍然等待确认、或者超时之后重新发送SYN=1消息;
d. B认为连接建立了,会忽略A的SYN消息,狂发数据;A认为连接没建立,会等待、或重发。此时一定会有带宽资源浪费,有可能死锁。
2.断开连接,主动方为何要等待2MSL?
a. A发FIN=1请求断开,B响应ACK=1确认;
b. B继续发送“剩余”数据;
c. B发FIN=1、ACK=1断开,A响应ACK=1确认;
d. 如果主动方A,响应之后立即CLOSED,当上步的“ACK=1消息”丢失,会导致B重发FIN=1、ACK=1消息,而A已经不能接收了。
因此,需要等一段;目前约定的是等2*MSL(MSL=报文最大寿命=2min)。