day26-1 TCP三次握手和四次挥手
目录
TCP三次握手和四次挥手
三次握手建立连接
如果你要去服务端下载视频,客户端和服务端之间必须得连接,在建立连接之前,客户端和服务端都是出于关闭状态的。建立连接就是三次握手:
- 客户端会向服务端发送一个请求,如下载视频,会有一个SYN报头
- 服务端会接收到客户端的请求,然后会响应客户端,并且把SYN报头改装好后又返回客户端,会有ACK报头
- 客户端开始进入建立连接状态,再发一条带上ACK的请求给服务端,让服务端也进入连接状态
为什么要三次握手
-
一次握手:客户端直接进入连接状态,直接发送请求给服务端,直接进入连接状态
只要有请求,服务端未确认就进入连接状态,都不知道在和谁连接
-
二次握手:
- 1.客户端暂不进入连接状态,发一条请求给服务端
- 2.服务端直接进入连接状态,发送一条确认请求给客户端,客户端收到请求直接进入连接状态
在服务端进入连接状态后,如果客户端在连接之前死机了,服务端就一直处于等待与客户端连接的状态,别的客户端就不能访问该服务端,造成资源浪费
四次挥手关闭连接
在建立连接后要关闭连接,关闭连接就是四次挥手:
-
客户端会带上FIN报头向服务端发送要断开连接的请求
-
服务端接收到客户端的请求后,返回一个带有ACK报头的请求说确认了
注意:FIN报头并没有返回,服务端此时还有可能传输数据
-
服务端数据传输结束之后,服务端又会发送一次带FIN报头的请求,告诉客户端我所有的数据都发完了
-
客户端向服务端进行一次确认,我收到了你中途发的数据
为什么要四次挥手
如果只有三次挥手:客户端可能在发送关闭连接请求后挂掉了,服务器是返回请求给客户端了,然而客户端压根就没有接收到第2-3步之间的数据传输,所有必须得有第四次客户端向服务端确认
为什么客户端最后还要等待2MSL
- 保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
- 客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文
为什么建立连接是三次握手,关闭连接是四次挥手
- 建立连接的时候,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
如果已经建立了连接,但是客户端突然出故障了
- TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。