5

灵魂拷问:TCP&UDP彻底搞懂了吗?

 1 year ago
source link: https://www.51cto.com/article/757978.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

对于TCP协议和UDP协议,大家应该都有所耳闻。TCP协议和UDP协议都工作在传输层,他们的目标都是在应用之间传输数据。我们常用的网络通信,比如浏览网页,查看邮件,电话通信等,都是通过这两种协议来进行数据传输的。

图片

01、TCP与UDP的区别

这两种协议有什么区别呢?他们又是如何工作的?跟着文档君往下看~

TCP协议和UDP协议最核心的区别是什么?看看下边图片你就知道了。

图片

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。可靠性,是TCP的最大特点,主要体现在:数据无丢失、无错误、无失序、无重复到达。就如同上图,TCP能将“孩子”(数据包)十分安全地传送给接收者。

UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠、快速传输的传输层通信协议。快速传输,是UDP的最大特点,主要体现在:数据发送前,不需要提前建立连接,能更高效地传输数据,但可靠性无法保证。就如同上图,UDP只负责把“孩子”(数据包)送出去,不管接收者有无收到。

直观感受了TCP协议与UDP协议的区别后,咱们来看看TCP协议是如何工作的?

02、TCP是如何工作的?

TCP通信的连接管理机制(可靠机制)总结为:三次握手建立连接,四次挥手断开连接。

< 三次握手建立连接 >

TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认。TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接。

图片

第一次握手

目的:这是一个请求建立连接的数据包,客户端先向服务器发送一个同步数据包。

数据包的TCP首部内容:

  • 同步SYN=1(客户端请求建立连接)
  • 序号seq=x(客户端所传送数据的第一个字节的序号)

第二次握手

目的:服务器收到客户端发送的第一个数据包后,判断出为主动建立连接的数据包。若服务器同意连接,则服务器发送一个数据包进行回应。

数据包的TCP首部内容:

  • 同步SYN=1(服务器建立连接)
  • 确认标记ACK=1(服务器同意连接)
  • 序号seq=y(服务器所传送数据的第一个字节的序号)
  • 确认号ack=x+1(已经收到客户端发送的x个字节数据,并告诉客户端下次应从数据的第x+1个字节开始发送)

第三次握手

目的:客户端收到服务器的确认之后,再给服务器发送一个数据包。

数据包的TCP首部内容:

  • 同步SYN=1(双方已同意建立连接)
  • 确认标记ACK=1(收到服务器的确认数据包)
  • 序号seq=x+1(发出的数据包就是数据的第x+1个字节)
  • 确认号ack=y+1(收到服务器发送y字节数据,并告诉服务器下次应从数据的第y+1个字节开始发送)

在客户端与服务器端传输的TCP数据中,双方的序号seq和确认号ack的值,都是在彼此seq和ack值的基础上进行计算的,这样做保证了TCP数据传输的连贯性。一旦出现某一方发出的TCP数据丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。

< 四次挥手断开连接 >

聚散终有时,当数据传输完成后,TCP客户端与TCP服务器需要通过四次会话断开连接,这个过程我们称之为四次挥手。

图片

第一次挥手

目的:客户端向服务器发送连接释放的请求数据包,并停止发送数据。

在连接释放数据包的TCP首部中:

  • 终止FIN=1(客户端要主动释放客户端和服务器的TCP连接)
  • 序号seq=x(x由客户端指定。随后等待服务器的确认)

第二次挥手

目的:服务器在收到连接释放的报文之后,给客户端发送确认报文。因此,客户端到服务器方向上的连接释放,TCP连接此时处于半关闭状态。半闭因为客户端已无法发送数据给服务器,半开因为服务器仍可以发送数据给客户端并被其接收。

在服务器发送给客户端确认报文的TCP首部中:

  • 确认标记ACK=1(收到了客户端发送的数据包,同意客户端释放连接)
  • 确认号ack=x+1(在收到客户端报文的基础上,将其序号seq值加1作为本段报文确认号ack的值)
  • 序号seq=y(y由服务器指定。随后等待客户端的确认)

第三次挥手

目的:若服务器已停止向客户端发送的数据,则释放连接,并向客户端发送确认报文。

在确认报文的TCP首部中:

  • 终止FIN=1(服务器释放服务器到客户端的TCP连接,不再向客户端发送数据)
  • 确认标记ACK=1(服务器对客户端的数据传送完毕)
  • 确认号ack=x+1(在收到客户端报文的基础上,将其序号seq值加1作为本段报文确认号ack的值)
  • 序号seq=z(z由服务器指定。随后等待客户端的确认)

第四次挥手

目的:客户端收到服务器的连接释放报文段后,向服务器发出确认报文。

在确认报文的TCP首部中:

  • 终止FIN = 1(客户端和服务器断开连接)
  • 确认标记ACK=1(收到服务器的确认报文,并同意服务器释放连接)
  • 确认号ack=z+1(在收到服务端报文的基础上,将其序号seq值加1作为本段报文确认号ack的值)
  • 序列号seq=x+1(在收到服务端报文的基础上,将其确认号作为本段报文序列号的值)

了解完TCP后,再来了解一下UDP是如何工作的~

03UDP是如何工作的?

UDP协议是面向无连接的,即发送数据之前不需要建立连接(无TCP协议复杂的三次握手,四次挥手的过程),发送数据就是简单的把数据包封装一下,然后从网卡发出去,数据包之间并没有状态上的联系。UDP 协议基本上是 IP 协议与上层协议的接口,UDP协议使用IP层提供的服务将应用层得到的数据从一台主机的某个应用进程传递到另一台主机的某个应用进程。

举个栗子~

当传输层从IP层收到UDP数据报文时,根据UDP数据报文首部中的目的端口,把UDP数据报文通过相应的端口传递给应用进程,如下图所示。

图片

如上图中应用进程4与端口2,如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于端口号的应用进程),则丢弃该报文,并由ICMP发送“端口不可达"差错报文给发送方。

ICMP(Internet Control Message Protocol,Internet控制报文协议)是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。

04总结一下

数据传输看似简单,其实非常智慧~

TCP和UDP服务的是程序,但程序和人是一样的,可以你来我往进行交流,也可以一股脑的倾诉。TCP就是彼此之间坦诚交流。消息有没有收到,收到的信息是否一致,都可以有及时的反馈。

图片

优点:可靠。

缺点:传输速率慢。

适用场景:通信软件的账户登录、支付等相关功能,采用可靠的TCP。

UDP就是倾诉,我不管你有没有听进去,不管你有无反馈,我就要不停地说。

图片

优点:传输速率快。

缺点:不可靠。

适用场景:QQ、微信等即时通信软件进行点对点通信,或者音视频通话时,通常采用传输快速的UDP。

TCP和UDP各有优缺点,就看你实际需求啦~

更多TCP干货,请戳三次握手,四次挥手,原来TCP这么有礼貌!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK