UDP 概述
- UDP 只在 IP 的数据报服务之上增加了很少一点的功能
- 复用和分用的功能
- 差错检测的功能
- 主要特点
- UDP 是无连接的,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延
- UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表
- UDP 是面向报文的
- UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用是很重要的。很多的实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络上发生拥塞时丢失一些数据,但不允许数据有太大的时延
- UDP 支持一对一、一对多、多对一和多对多的交互通信
- UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短
UDP 首部格式
用户数据报 UDP 有两个字段:数据字段 和 首部字段
- 首部字段有 8 个字节,由 4 个字段组成,每个字段都是 2 个字节
- 首部中的检验和的计算方法有些特殊
- 在计算检验和时,要在 UDP 用户数据报之前添加12个字节的 [伪首部]
- 临时把 [伪首部] 添加在 UDP 用户数据报前面,得到一个 {临时的 UDP 数据报}
- 检验和就是按照这个 {临时的 UDP 用户数据报} 来计算的。[伪首部] 既不向下传送也不向上提交,而仅仅是为了计算检验和
UDP 基于端口的分用
如果接收方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送"端口不可达"差错报文给发送方。
TCP 概述
特点
- TCP 是面向连接的运输层协议
- 应用程序在使用 TCP 协议之前,必须先建立 TCP 连接
- 在传送数据完毕后,必须释放已经建立的 TCP 连接
- 也就是说,应用程序之间的通信好像在"打电话":通话之前要拨号建立连接,通话结束后要挂机释放连接
- 每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)
- TCP 提供可靠交付的服务,通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且还能做到按序到达
- TCP 提供全双工通信
- 面向字节流
面向字节流
- TCP - 流:流入或流出进程的字节序列
- "面向字节流"的含义:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。TCP 并不知道所传送的字节流的含义
- TCP 不保证 {接收方应用程序所收到的数据块} 和 {发送方应用程序所发出的数据块} 具有对应大小的关系
- TCP 发送的报文段大小与应用进程发送到 TCP 缓存中的数据块大小无关,并不是数据块多大,TCP 报文里就一次放多少,组装报文的过程和数据块大小无关系
- 读的时候同理,都在接收端的 TCP 缓存里,它一次往上扔几个和收到的报文大小无关
- 但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样
- 图中指出,TCP 和 UDP 在发送报文时所采用的方式完全不同。TCP 并不关心应用进程一次把多长的报文发送到 TCP 缓存中,而是根据对方给出的 [窗口值] 和 {当前网络拥堵的程度} 来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用程序给出的)
- 如果应用进程传送到 TCP 缓存的数据块太长,TCP 就可以把它划分短一些再发送
- 如果应用进程一次只发来一个字节,TCP 也可以等待积累有足够多的字节后再构成报文段发送出去
TCP 的连接
- TCP 把 [连接] 作为 最基本的抽象
- 每一条 TCP 连接有两个端点
- TCP 连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是运输层的协议端口
- {TCP 连接的端点} 叫做 [套接字 (socket)] 或插口
- 端口号拼接到 IP 地址 即构成了 [套接字]:
Socket = IP:port
- 每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定
- TCP连接、IP地址、套接字
- TCP 连接就是由协议软件所提供的一种抽象
- TCP 连接的端点是个很抽象的套接字,即(IP 地址:端口号)
- 同一个 IP 地址可以有多个不同的 TCP 连接
- 同一个端口号也可以出现在多个不同的 TCP 连接中
关于TCP的主要问题
- 如何实现可靠传输?
- 如何实现流量控制?
- 如何处理网络堵塞?