UDP和TCP的区别
首先,声明本文来制后端领域作者,敖丙
TCP和UDP都位于计算机网络模型中的运输层,他们负责传输应用层产生的数据。
UDP是什么
UDP的全称是User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。
数据报是与分组交换网络关联的传输单元。
UDP的特点主要有
- UDP能够支持容忍数据包丢失的带宽密集型应用程序
- UDP具有低延迟的特点
- UDP能够发送大量的数据包
- UDP能够允许DNS查找,DNS是建立在UDP之上的应用层协议。
TCP是什么
TCP的全称是Transmission Control Protocol,传输控制协议。它能够帮助你确定计算机链接到Internet以及它们之间的数据传输。通过三次握手来建立TCP链接,三次握手就是用来启动和确认TCP连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。
TCP的主要特点有
- TCP能够确保连接的建立和数据包的发送
- TCP支持错误重传机制
- TCP支持拥塞控制,能够在网络拥堵的情况下延迟发送
- TCP能够提供错误校验和甄别有害的数据包。
TCP | UDP |
TCP是面向连接的协议 | UDP是无连接的协议 |
TCP在发送数据前需要建立连接,然后再发送数据 | UDP无需建立连接就可以直接发送大量数据 |
TCP会按照特定顺序重新排列数据包 | UDP数据包没有固定顺序,所有数据包都相互独立 |
TCP传输的速度比较慢 | UDP的传输会更快 |
TCP的头部字节有20字节 | UDP的头部字节只需要8个字节 |
TCP是重量级的,在发送任何用户数据之前,TCP需要三次握手建立连接 | UDP是轻量级的,没有跟踪连接,消息排序等 |
TCP会进行错误校验,并能够进行错误恢复 | UDP也会错误检查,但会丢弃错误的数据包 |
TCP有发送确认 | UDP没有发送确认 |
TCP会使用握手协议,例如SYN,SYN-ACK,ACK | UDP无握手协议 |
TCP是可靠的,因为它可以确保将数据传送到路由器 | UDP不能保证将数据传送到目标 |
TCP三次握手和四次挥手
TCP三次握手
消息类型 | 描述 |
SYN | 这个消息时用来初始化和建立连接的 |
ACK | 帮助对方确认收到的SYN消息 |
SYN-ACK | 本地的SYN消息和较早的ACK数据包 |
FIN | 用来断开连接 |
- SYN:它的全称是Synchronize Sequence Numbers,同步序列编号。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立TCP连接时,首先会发送的一个信号。客户端在接受到SYN消息时,就会在自己的段内生成一个随机值X。
- SYN-ACK:服务器收到SYN后,打开客户端连接,发送一个SYN-ACK作为答复。确认号设置为比接收到的序列号多一个,即X+1,服务器为数据包选择的序列号是另一个随机数Y。
- ACK:Acknowledge character,确认字符,表示发来的数据已确认接收无误。最后,客户端将ACK发送给服务器。序列号被设置为所接收的确认值即Y+1。
Client(Alice)------SYN(sequenceNum=x)------>Server(Bob)-------SYN-ACK(sequenceNum=y,AcknowledgeNum=x+1)------>Client(Alice)------SYN-ACK(AcknowledgeNum=y+1)------>Server(Bob)
TCP四次挥手
在连接终止阶段使用四次挥手,连接的每一端都会独立的终止。下面描绘一下:
Initialtor(ESTABLISHED connection)| Receiver(ESTABLISHED connection)
active close FUN_WAIT_1 ------FIN------>CLOSE_WAIT passive close -------ACK------>FIN_WAIT_2;
CLOSE_WAIT passive close ------FIN------>TIME_WAIT------ACK------>Receiver CLOSED;
Initialtor CLOSED
- 首先,客户端应用程序决定要终止连接(这里服务端也可以选择断开连接)。这会使客户端将FIN发送到服务器,并进入FIN_WAIT_1状态。当客户端处于FIN_WAIT_1状态时,它会等待来自服务器的ACK响应。
- 然后第二步,当服务器收到FIN消息时,服务器会立刻向客户端发送ACK确认消息。
- 当客户端收到服务器发送的ACK响应后,客户端就进入FIN_WAIT_2状态,然后等待来自服务器的FIN消息;
- 服务器发送ACK确认消息后,一段时间(可以进行关闭后)会发送FIN消息给客户端,告知客户端可以进行关闭;
- 当客户端收到从服务端发送的FIN消息时,客户端就会由FIN_WAIT_2状态变为TIME_WAIT状态。处于TIME_WAIT状态的客户端允许重新发送ACK到服务器为了防止信息丢失。客户端在TIME_WAIT状态下花费的时间取决于它的实现,在等待一段时间后,连接关闭,客户端上所有的资源(包括端口号和缓冲区数据)都被释放。