TCP 与 UDP 协议分析

TCP 与 UDP 协议分析

TCP和UDP是什么?

TCP:传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信 协议。由IETF的RFC 793定义。

UDP:用户数据报协议(User Datagram Protocol),是一种面向无连接,不可靠、以数据报文段的形式传输的传输层通信协议。由RFC 768描述了UDP。

TCP 协议

TCP 三次握手

三次握手是 TCP 用来确保连接可靠建立的方式:

第一次握手:

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

A 给 B 发短信说:“ B,你现在有空吗?”

第二次握手:

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

B 此时收到了 A 的信息,然后对 A 说:“我有空,你呢?有空吗?”

第三次握手:

客户端收到之后回复一包ACK包,连接建立

A 此时收到了 A 的信息,然后说:“我也有空,那我给你说个事。”

在三次握手之后,A 和 B 都能确定这么一件事:双方的通信可以流畅的进行。这样,双方就可以开始进行正常的对 话了。

为什么叫三次握手而不是两次握手

服务端回复完 SYN+ACK 后就建立了连接,这是为了防止因为已失效的请求报文,突然传到服务器引起错误,假设采用两次握手建立连接,客户端向服务端发送了一个 SYN 包来请求建立连接,因为某些未知的原因 SYN 包并没有到达服务器,在中间某个网络节点产生了滞留

为了建立连接客户端会重发 SYN 包,这次的数据包正常送达,服务端回复 SYN+ACK 之后建立了连接


但是第一包数据阻塞的网络节点突然恢复,第一包SYN包又送达服务端,这时服务端会认为是服务端又发起了一个新的连接,从而在两次握手之后,进入等待数据状态

服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致,如果在三次握手的情况下,服务端收不到最后的ACK包,自然认为连接建立不成功

所以三次握手本质上来说,就是为了解决信道不可靠的问题,为了在不可靠的信道上建立可靠的连接,经过三次握手之后,客户端和服务端都进入了数据传输状态

传输确认

tcp 协议需要在不可靠的信道上保证建立可靠的连接,一包数据可能会被拆成多包发送,如何处理丢包问题,这些数据包到达的先后顺序不同,如何处理乱序问题

发送缓冲: 针对此问题,tcp 协议为每一个连接建立了一个发送缓冲区

发送报文: 从建立连接的第一个序列号为 0,后面每个字节的序列号就会增加 1,发送数据时,取一部分数据组成发送报文
在其 tcp 协议头中,互附带序列号和长度,接收端在收到数据后,需要回复确认报文

回复确认: 确认报文中的 ACK= 接收序列号 + 长度,也就是下一包数据需要发送的起始序列号,一问一答的发送方式能够使得发送端确认发送的数据已经被对方收到,发送端也可以一次连续发送多包数据,接收端只需要回复一次 ACK 就可以了

切割发送: 这样发送端可以把待发送的数据,分隔成一系列的碎片,发送到对端,对端根据序列号和长度,在接收后重构出来完成的数据,假设其中丢失了某些数据包,在接收端可以要求发送端重传

比如丢失了 100-199 这 100 个字节,接收端向发送端发送 ACK = 100 的报文,发送端收到后重传中的一包数据,接收端进行补齐。以上过程不区分客户端和服务端,tcp 是全双工的,两端均采用上述机制

TCP 四次挥手

四次挥手是 TCP 用来确保连接可靠关闭的方式:

第一次挥手:

处于连接状态的客户端和服务端,都可发起关闭连接请求,此时需要四次挥手来进行连接关闭。假设客户端主动发起连接关闭的请求,它需要向服务端发起 FIN 包,表示要关闭连接,自己进入终止等待 1 状态,这是第一次挥手

A 给 B 发短信说,“ B,我要准备吃饭了?”

第二次挥手:

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

B 此时收到了 A 的信息,然后先对 A 说:“我知道了。”

第三次挥手:

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

B 对 A 说:“我也要准备吃饭了。”然后放下了手机

第四次挥手:

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

A 此时收到了 B 的确认信息,然后向 B 发送一个包说:“好的,知道了。”这时才放下手机去吃饭

在四次挥手之后,A 和 B 都能确定这么一件事:双方的通信都可以正常关闭,这样,双方就可以确定对方已经完全知道了自己要确认关闭连接。

为什么客户端需要等待超时时间

这是保证对方已经收到 ACK 包,因为假设客户端送完最后一包 ACK 包后就释放了连接,一旦 ACK 包在网络中丢失,服务端将一直保留在最后确认状态


为什么握手要三次,挥手需要四次?

三次握手是客户端与服务端建立通信的过程

第一次:客户端向服务端发送请求,确认服务端是否能够收到请求

第二次:服务端向客户端响应,告诉客户端,我已经收到你的请求。并且准备好接收其他请求

第三次:客户端再次发送请求,告诉服务端,我已经收到了你的恢复,并且我也准备好了

四次挥手是客户端与服务端结束通信的过程

第一次:客户端向服务端发起结束的请求

第二次:服务端向客户端响应,收到你结束请求的通知了

第三次:服务端向客户端发起,服务端收到这样的请求后,会去处理现有的数据请求,在现有的数据请求处理完成以后,会正式回复客户端的结束请求

第四次:客户端向服务端发起,表示已经收到了你的结束回复

TCP与UDP的区别

TCP:

稳定可靠(适用于要求较高的场景,需要准确无误的传输给对方,比如传输文件,发送邮件,浏览网页等)

UDP:

速度快,但是可能产生丢包,所以适用于对实时性要求较高,但是对少量丢包,并没有太大要求的场景,比如域名查询,电话通信,视频直播等

udp 还有重要的应用场景:即隧道网络(即常用的 VPN,以及在 SDN 中用到的 VXLAN 也是一种)

  1. 连接方面

TCP面向连接(如打电话先拨号建立连接)

UDP无连接,即发送数据报之前不用建立连接

  1. 安全方面

TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复且按序到达

UDP尽最大努力交付,即不保证可靠交付

  1. 传输效率

TCP传输效率较低,UDP传输效率较高

  1. 连接数量的区别

TCP连接只能是一对一、点对点的

UDP支持一对一、一对多、多对一和多对多的交互通信

  1. 首部

TCP报文首部20个字节,UDP首部8个字节

  1. 可靠

TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

  1. 面向方式

TCP面向字节流。实际上是TCP把数据看成一串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能出现响应问题

UDP是面向报文的。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低

TCP 和 UDP 的使用场景

TCP 的使用场景

相对于 UDP,TCP 实现了数据传输过程中的各种控制,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。在对可靠性要求较高的情况下,可以使用 TCP。(特别是需要可靠连接,比如付费、加密数据等等方向都需要依靠 TCP )

UDP 的使用场景

  • 包总量较小的通信(DNS,SNMP)

  • 视频、音频等多媒体通信(即时通信)QQ就是使用的UDP协议

  • 广播通信

TCP 维护可靠的通信方式

  1. 数据分片:在发送端对用户数据进行分片,在接收端进行重组,由 TCP 确定分片的大小并控制分片和重组。

  2. 到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认包

  3. 超时重发:发送方在发送分片后计时,若超时却没有收到相应的确认包,将会重发对应的分片

  4. 滑动窗口:TCP 连接双方的接收缓冲空间大小都固定,接收端只能接受缓冲区能容纳的数据

  5. 失序处理:TCP 的接收端需要重新排序接收到的数据

  6. 重复处理:如果传输的 TCP 分片出现重复,TCP 的接收端需要丢弃重复的数据

  7. 数据效验:TCP 通过保持它首部和数据的检验和来检测数据在传输过程中的任何变化

参考资料

  1. TCP与UDP

  2. 对TCP和UDP的简单理解——通俗易懂,图文并茂

posted @ 2022-12-22 23:15  ppqppl  阅读(66)  评论(0编辑  收藏  举报