tcp的三次握手和四次挥手
TCP与UDP的区别
他们两个的作用都是在程序中传输数据(文件、图片、视频等)
区别在于:
- TCP:基于连接
- UDP:基于非连接
举例理解:如果被人与人的通信比喻为进程与进程的通信,那么有两种方式,写信与打电话,写信就算非连接的,打电话就是连接的。
TCP是如何保证以上过程的?通过三次握手,确定传输、四次挥手
TCP三次握手
三次握手是建立连接的过程
第一次握手:当客户端向服务端发起连接时,会先发一包连接请求数据,询问下能否与你(服务端)建立连接,这个包称为syn包
第二次握手:如果服务端同意连接,会给客户端回复一包syn+ack包
第三次握手:客户端收到后在回复一包ack包,连接建立
由于建立连接过程中一共发送是三次包,所以叫三次握手
为什么是三次握手而不是两次握手?
三次握手本质上来说就是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立可靠的的连接。
服务端回复完syn+ack包就建立连接,那么如果第一次发起请求连接的syn包失效,丢失或延迟的话,服务端没有及时收到并回复,客户端为了建立连接会再次发送一个syn包再次请求连接,这次发送的syn包服务端正常接收并回复syn+ack包,但第一次发送的syn包,此时服务端才收到,依然会给客户端返回一个syn+ack包,这时就会出现,服务端认为这是两个请求连接,而客户端认为这是一个请求连接,造成状态不一致。
如果是三次握手的情况下就不会出现这种问题,服务端只要没有收到ack包,就不会认为建立连接成功
四次挥手
经过三次握手后,客户端和服务端就进入了数据传输状态,他们都可以发起关闭连接请求
假如客户端发起关闭请求,
- (第一次挥手)他需要向服务端发起一个FIN包表示要关闭连接,自己进入终止等待1状态,
- (第二次挥手)服务端收到FIN包回复一个ACK包,表示自己进入关闭等待状态,客户端接收到ACK包,进入终止2等待状态,【这个阶段服务端还是能发送未发送完的数据的,客户端也可以接收数据】,
- (第三次挥手)等服务端发送完数据后,服务端再次发送一包FIN包,进入最后确认状态,
- (第四次挥手)客户端收到fin包后,向服务端发送ack包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ack包后立即关闭连接。
为什么客户端需要进入超时等待连接?
这时因为防止服务端无法收到ack包,如果服务端未收到ack包(ack包丢失了),客户端就释放了连接,服务端将一直停留在等待关闭状态,
如果服务端没收到ack包,等待一段时间后会再次向客户端重发FIN包,客户端会响应这个fin包并重新刷新超时时间
四次挥手的目的:在不可靠的的网络信道中进行可靠的连接断开