一.c. TCP握手为什么三次、不能是二次、或四次?
i.不能是两次:
防止已经失效的连接报文突然又传到了服务端,产生错误
如果不采用三次握手,服务端直接建立连接,会白白浪费资源
三次握手告诉服务端,客户端有没有收这个数据,连接的序号是否是有效的·服务端收到正常的数据后,建立tcp连接,否则关闭端口,减少服务器开销
ii.不能是四次:
三次已经创建可靠连接,没有必要多一次握手花费更多建立连接。
iii.TCP二次握手:
在TCP三次握手的过程中,当用户首次访问Server时,发送SYN包Server根据用户IP生成Cookie(已加密),并与SYN-ACK一同发回Client;当Client随后重连时,在SYN包携带TCP Cookie;如果Server校验合法,则在用户回复ACK前就可以直接发送数据;否则按照正常三次握手进行。
二.三次握手中每一次没收到报文会发生什么情况
i.第一次握手:
客户端没有收到确认报文,等待一段时间会重新发送SYN报文
ii.第二次握手:
服务端会触发超时重传,重传SYN-ACK报文前。
ii.第三次握手:
服务端会触发超时重传,重传到收到ACK报文或达到最大次数关闭连
接
三.第二次握手传回了ACK,为什么还要传回SYN
i.ACK:
是为了告诉客户端传过来的数据已经接受无误
ii.SYN:
告诉客户端,服务端已经响应客户端的报文。服务端在本次连接没有需要超时处理的事情
四.第三次握手可以携带数据吗?
第三次握手可以携带数据。
在 TCP 三次握手过程中,前两次握手主要用于建立连接,确认双方的发送和接收能力。第三次握手时,客户端在发送的 ACK 报文中可以携带数据。如果此时携带数据,那么服务器在收到带有数据的第三次握手报文后,就可以直接对数据进行处理,而无需等待客户端再发送一个专门的数据报文,这样可以减少一次数据传输的往返时间,提高通信效率。
五.客户端在发送完最后一个确认报文后,为什么不直接进入关闭状态?而是要进入时间等待状态,2MSL后才进入关闭状态,这是否有必要呢?
i.如果客户端最后一个确认报文丢失后,服务器无法进入关闭状态,会反复重传FIN报文。因此等待时间2msl,可以确保服务器可以收到最后TCP确认报文
ii.客户端发送最后一个TCP确认报文段后,经过2MSL时长,可以使当前所有产生的报文段从网络中消失。
六.为什么是2MSL
i.2MSL是报文最大生存时间,任何超过该时间的报文都将丢弃
ii.2MSL是因为网络中存在发送方的数据包,当这些发送方的数据包被接受方处理后又会被响应,所以来回需要2MSL