tcp三次握手以及四次挥手
2019-06-07 本文已影响0人
newway_001
image.png
三次握手
三次握手和两次握手相比,优势在哪里?
第一步: 他要发送一条建立连接的消息告诉对方咱两要通信了
第二步: 对方收到这个消息后,要回复他一个确认消息
上面两步(两次握手)做完了,两人才能够通信。
如果a发给b的请求信息。被阻塞,a收不到b的回信,会再次发送b一个请求通信的信息。
某一个时间段过后。b收到了a那个阻塞的信息。
b发送了给a一个确认的信息
由于此时,a并没有连接请求。所以,a并不会给b通信。
但是b会一直等待a的信息。。这回浪费cpu资源。
所以tcp连接中三次握手有其必要性。
四次挥手
1.客户端向服务器发送连接释放报文。
2.服务器接收到后,立刻回一个接收到的请求
3.等服务器发送完所有数据后,再向服务器发送连接释放报文
4.客户端收到后,发送最后确认,服务器收到后,进入关闭状态。
问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送
SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭
SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报
文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送
FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态
了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以
TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后
的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,超时后将会重发FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该
ACK。
Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置
一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么
Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL
(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时
间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,
Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束
TCP连接。
【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一
直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复
位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的
任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。
若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接
着就关闭连接。