目录
一、TCP和UDP是什么
二、TCP和UDP的区别
三、TCP协议三次握手
为什么是三次握手而不是两次握手 ?
在不可靠信道上建立可靠连接会产生什么问题呢?
四、四次挥手
为什么客户端需要等待超时时间?
总结:
我们日常生活中微信聊天,浏览网页,和你现在正在看的csdn 都是通过TCP和UDP这两种协议进行数据传输的。
TCP和UDP都工作在传输层,他们的目的都是在程序和程序之间传输数据(文本,视频,图片等)这些数据对于TCP和UDP来说都是一堆二进制数,那他们之间的区别是什么呢?
一、TCP和UDP是什么
TCP:
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP:
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
是不是看懵了。。。。。。
其实我们可以将UDP当作我们平时写信来传输数据,而TCP就是打电话来传输数据。
那这两者有什么区别呢?
二、TCP和UDP的区别
上面我们说了,UDP->写信,TCP->打电话。这两者本质的区别就是写信是基于非连接的,打电话是基于连接的。也就是说UDP是基于非连接的,TCP是基于连接的。
写信的时候我们要考虑:
<1> 发出去的信对方是否收到;
<2> 信的内容是否完整;
<3> 发出去的信的顺序是否正确;
打电话的时候就没有上面的顾虑:
<1> 电话接通,建立连接。
<2> 互相通话,你说出去的话能及时的得到对方的回应。
<3> 结束通话。
通过对上面的理解我们来看下面的总结:
- TCP面向连接,通过三次握手建立连接,四次挥手接除连接;UDP是无连接的,即发送数据之前不需要建立连接,这种方式为UDP带来了高效的传输效率,但也导致无法确保数据的发送成功。
- TCP是可靠的通信方式。通过TCP连接传送的数据,TCP通过超时重传、 数据校验等方式来确保数据无差错,不丢失,不重复,且按序到达;而UDP由于无需连接的原因,将会以最大速度进行传输,但不保证可靠交付,也就是会出现丢失、重复等等问题。
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能出现响应问题;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。
- 每一条TCP连接只能是点到点的;而UDP不建立连接,所以可以支持一对一,一对多,多对一和多对多的交互通信,也就是可以同时接受多个人的包。
三、TCP协议三次握手
三次握手是建立连接的过程。
我们对比下图来看:
当客户端向服务端发起连接时,会先发一包连接请求数据(SYN),询问服务端能否建立连接,如果服务端同意建立连接,会回复客户端一个(SYN+ACK)包数据,客户端收到之后,回复一包(ACK)包,连接建立。
因为这个过程中互相发送了三包数据,所以称之为三次握手。
为什么是三次握手而不是两次握手 ?
服务端回复完SYN+ACK之后就建立连接,为了防止已失效的请求报文,突然又传到服务器引起错误。
假设用两次握手建立连接,客户端向服务器端发送了一个(SYN)A包,来请求建立连接,因为一些未知的原因A包未到达服务器,在中间某个网络结点产生了滞留,为了建立连接,客户端会重发(SYN)B包,这次B包正常送达,服务端回复(SYN+ACK)之后建立连接,两次握手完成。但是这时候A包阻塞的网络结点突然恢复,A包又送达到服务端,服务端以为客户端又发送了一次连接,在发送完(SYN+ACK)包之后进入等待数据状态。客户端认为是一个连接,但是服务端认为是两个连接,造成了状态不一致问题。
如果是三次握手的话,服务端接收到A包,回复(SYN+ACK)包之后会等待客户端的ACK包,如果等不到,连接建立失败。
三次握手目的就是在不可靠的信道上建立可靠的连接。
在不可靠信道上建立可靠连接会产生什么问题呢?
一包数据可能会被拆成多包发送,就会产生丢包问题,这些数据包到达的先后顺序不同,就会产生乱序问题。
为了解决这两个问题TCP为每一个连接建立了一个发送缓冲区,从建立连接后的第一个序列号为0,后面每个序列号依次加1,发送数据时,从发送缓冲区取一部分数据组成发送报文,在TCP头中会附带序列号和长度,接收端在收到数据后需要回复确认报文,确认报文中的ACK=接收序列号+长度=下一包数据发送的起始序列号。服务端根据序列号和长度重构出完整的数据,如果传输过程中有数据包丢失,服务端会要求客户端重发。
四、四次挥手
处于连接状态的客户端和服务端,都可以发起关闭连接请求,需要四次挥手来进行连接关闭。
客户端主动发起连接关闭请求,它需要向服务端发送一包(FIN)包,表示要关闭连接,自己进入终止等待1状态,这就是第一次挥手。
服务端收到(FIN)包,发送一包(ACK)包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这就是第二次挥手。
服务端此时还可以发送未发送的数据,客户端也可以接收数据,等服务端发送完数据之后,发送一包FIN包,进入最后确认状态,这就是第三次挥手。
客户端收到之后,回复一包(ACK)包,进入超时等待状态,经过超时时间后关闭连接,服务端收到(ACK)包之后立即关闭连接,这就是第四次挥手。
为什么客户端需要等待超时时间?
为了保证服务端已收到(ACK)包,如果客户端发完(ACK)包之后就关闭,但是(ACK)包如果在发送过程中丢失,服务端就会一直停留在最后确认状态。
如果客户端发完(ACK)包之后等待一段时间,服务端如果没有收到(ACK)包会重发(FIN)包,客户端收到(FIN)之后继续发(ACK)包,并更新超时时间。
四次挥手和三次握手一样,在不可靠的网络链路种,进行可靠的连接断开。
总结:
UDP:性能损耗少,资源占用少,稳定性弱
eg:域名查询,语音通话,视频直播,隧道网络(VPN)
TCP:稳定可靠
eg:传输文件,发送邮件,浏览网页等;
本文参考:
【一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手】 https://www.bilibili.com/video/BV1kV411j7hA/?share_source=copy_web&vd_source=65d2d677bbcda991d3d564eaa4e4c4d3