浅谈TCP协议和UDP协议以及三次握手与四次挥手

342 阅读4分钟

I 先了解下TCP/IP协议五层模型

QQ图片20211010160306.png

这是协议层从底部到顶部的一个模型图

image.png

我们可以看出TCP协议和UDP协议都工作在传输层,而他们的目标都是在程序之间传输数据数据可以是文本,图片,以及视频,对于它们来说没有什么区别,就是一堆二级制数 ,那么他们到底有啥区别呢?

其实它们最大的区别就是UDP是基于非连接 ,而TCP基于连接

举一个简单的例子(不考虑传输速度)

UDP就像是在写信

image.png

UDP在寄出信后,不管对方是否能收到,不管收的信是否完整,先后寄两封信不管是否按照顺序接收,甚至收信人和地址也是不管,一切都是未知数,一切基于非连接
不需要建立连接 ,想发就发, 接受什么数据就传递什么数据 ,不备份, 发数据也不关心对象是否已经正确接收到数据 网络时好时坏时,udp没有拥塞控制,会一直以恒定的速度发数据,那么当网络环境差是,就会丢包

TCP就像在打电话

image.png 从拨打电话到互相接通,然后互相通话,再到通话结束关断 这一系列的流程都能得到及时的反馈,并且能够确认对方能够准确的接收到,大家都知道,打电话是基于连接的,也就是TCP,而写信是基于非连接的也就是UDP

TCP是如何保证这些步骤正常运行的呢?

image.png

II.TCP的三次握手和四次挥手

1.三次握手是建立连接的过程

当客户端向服务端发起连接时,会发一包连接请求数据过去询问一下能否与你建立连接,这包数据称为SYN包

image.png 如果对端同意连接,则回复一包SYN+ACK包

image.png 客户端收到后回复一包ACK包,连接建立!

image.png

这个过程称之为三次握手

这个过程中互相发送了三包数据,所以称为三次握手 为什么是三次握手而不是两次握手,服务端在回复SYN+ACK之后就建立连接,这是为了防止已失效的请求报文,突然又传到服务器引起错误,(假设采用两次握手建立连接,客户端向服务端发送了一个SYN包,来请求建立连接,因为某些原因,SYN包在传输过程中发生了滞留,没用到达服务器吗,为了建立连接,客户端会重发SYN包,假设这次数据包送达,服务端回复SYN+ACK之后建立了连接,但是第一包数据突然恢复,又发到了服务端,这个时候,服务端会误认为客户端又发起了一个新的连接,从而在两次握手后进入了等待数据状态,造成了状态不一致,如果是三次握手,服务端收不到最后的ACK包,就不会建立连接,其三次握手就是解决了网络信道不可靠的问题
三次握手:
A:是B吗?我要跟你通信,听得到我说话吗?
B:可以通信,你听得到我说话吗?
A:我也听得到。

进入了连接状态,客户端和服务端都进入了数据传输状态

什么是四次挥手?

处于连接状态的客户端和服务端都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭

加速客户端发起关闭请求,则需要向服务端发送一包FIN,表示要关闭连接,自己进入中止等待一状态,这是第一次挥手

image.png

服务端接收FIN包后向客户端发送一个ACK包,表示自己进入关闭等待状态,客户端接受后进入终止等待2状态,这是第二次挥手

image.png 服务端此时后还可以发送数据,客户端也可以接收数据,服务端发送完数据之后,服务端发送最后一包FIN包,进入最后确认状态,这是第三次挥手

image.png

客户端收到回复后回复ACK包,并且进入超时等待状态,进入超时连接后,经过超时时间后关闭连接,而服务器收到ACK包后,立即关闭连接这就是第四次挥手

image.png 为什么客户端要进入等待超时时间,这是为了保证对端已经收到ACK,因为假设客户端发送完最后一包ACK包后就释放了连接,一旦ACK包在网络中丢失,服务端会一直在最后确认状态,如果服务端在客户端等待时间没有收到ACK包,就会重新发送一包FIN包,再次进行确认状态,这个也是为了解决网络信道不可靠的问题,进行了可靠的连接断开