计算机网络系列 -- TCP和UDP

253 阅读5分钟

TCP和UDP的区别

连接方面

  1. TCP是面向连接的:通信前需要建立连接,通信结束需要释放连接。
  2. UDP是无连接的:通信前不需要建立连接,通信结束也无需释放连接。 TCP建立连接和断开连接的详细过程见 计算机网络系列 -- TCP的三次握手、四次挥手

数据安全

  1. TCP提供可靠交付服务:TCP发送的数据无重复、无丢失、无错误、与发送端顺序一致
  2. UDP是不可靠的:它是尽力而为交付,不能确保每一个数据包都送达

传输内容单位

  1. TCP是面向字节流的:TCP以字节为单位。虽然传输的过程中数据被划分成一个个数据包,但这只是为了方便传输,接收端最终接受到的数据将与发送端的数据一模一样
  2. UDP是面向报文的:UDP数据传输的单位是报文,且不会对数据作任何<拆分>和<拼接>操作
在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层
在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作

网络拥塞

什么是拥塞控制?目的是什么?

当网络非常拥堵的时候,发送的数据可能要经过很久才能抵达或直接丢失。此时需要【降低发送速率】
目的:1. 缓解网络压力 2. 保证分组按时到达
  1. TCP 会根据网络拥塞情况对发送速率作调整
  2. UDP 始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊:
弊端:网络拥塞时有些报文【可能会丢失】,因此UDP不可靠。 
优点:有些使用场景允许报文丢失,如:直播、语音通话,但【对实时性要求很高】,此时UDP还是很有用武之地的

通信方式

  1. TCP 只能提供一对一的通信(一条 TCP 连接的两端只能有两个端点)
  2. UDP 支持一对一、一对多多对多多对一通信(UDP可以任意方式的通信)

首部开销

  1. TCP 头部至少由 20 字节
  2. UDP 首部开销小,只有 8 字节,相比于TCP要高效很多

应用场景

  1. TCP:效率要求相对,但对准确性要求相对的场景
  • 网站
  • 文件传输
  • 邮件发送
  1. UDP:效率要求相对,对准确性要求相对的场景
  • 直播
  • 视频通话
  • QQ/微信聊天
  • 游戏

附加问题

TCP 的可靠性具体体现在哪些方面?

  1. 连接过程中体现:
a. 校验和(校验数据是否损坏);
b. 序列号(用于检测丢失的分组和重复的分组);
c. 确认应答ACK(接收方告知发送方正确接收分组以及期望的下一个分组);
d. 定时器(第三次握手失败服务器会一直等待);
e,超时重传(第三次握手失败服务器会超时重传5次);
  1. 网络拥塞(可能会因为拥塞而丢包)
a. TCP会降速处理
b. UDP只会一直恒速处理

TCP的头部包含哪些内容?

  1. 源端口目的端口

端口号标识来自哪里,要连接哪里

  1. 序号 seq —— 当前TCP数据报数据部分的第一个字节的序号

我们知道,TCP是面向字节的,它会对发送的每一个字节进行编号,而且不同数据报之间是连续编号的。 由于本字段4字节,可以给[0,2^32-1]个字节进行编号(大约4G),而且序号循环使用,当发送完2^32-1个字节后,序号又从0开始

一般来说,当2^32-1个字节被发送的时候,前面的字节早就发送成功了,因此序号可以循环使用

  1. 确认号 ack

表示当前主机作为接收端时,期望接收的下一个字节的编号是多少。 也表示,当前主机已经正确接收的最后一个字节序号+1。

  1. 数据偏移(报文长度length

它表明了数据报头部的长度。

  1. 标识符
SYN=1 
SYN在建立连接时使用。 
当SYN=1ACK=0时,表示当前报文段是一个连接请求报文。 
当SYN=1ACK=1时,表示当前报文段是一个同意建立连接的应答报文。

FIN=1 
FIN=1表示此报文段是一个释放连接的请求报文。

ACK=1 
ACK被置1后确认号字段才有效。 
此外,TCP规定,在连接建立后传送的所有报文段都必须把ACK1RST=1 
当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。

URG=1URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。 
紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。 
如control+c:这个命令要求操作系统立即停止当前进程。此时,这条命令就会存放在数据包数据部分的开头,并由紧急指针标识命令的位置,并URG字段被置1PSH=1 
当接收方收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后再提交。 
一些交互式应用需要这样的功能,降低命令的响应时间。
  1. 检验和

用于接收端检验整个数据包在传输过程中是否出错