目录
一、传输层服务
1. 传输层服务与协议
1)传输层协议为运行在两个不同主机上的应用程序之间提供逻辑通信功能。
- 传输层实现两个不同主机上的应用程序之间的通信。
2)传输层协议运行在端系统而非路由器。
- 在发送端,传输层将从应用程序接收到的报文转换成传输层报文段。
- 在接收端,传输层处理接收到的报文段,并传递给应用层使用。
3)不只一种传输层协议可以用于应用程序。
- Internet 有两种协议:TCP 和 UDP
2. 传输层和网络层
应用层 => 传输层 => 网络层 => 物理层
1)传输层:提供了两个进程之间的逻辑通信。
- 可靠的、增强的网络层服务
- 至少有两种服务:数据交付、差错检测
- UDP 仅有的两种服务:数据交付、差错检测
- TCP 在此基础上还提供了几种附加服务
2)网络层:提供了两个主机之间的逻辑通信。
- 是尽力而为的交付服务
- 不确保报文段的交付,不保证报文段的按序交付,不保证报文段中数据的完整性
- 是不可靠的服务
3. Internet 传输层协议
1)TCP
- 连接控制:面向连接的服务
- 可靠数据传输:可靠的、按序递交的
- 流量控制
- 拥塞控制
2)UDP
- 尽力而为的:不可靠的、无序传递的
- 差错检测
- 是 IP 的直接扩展:多路复用和多路分解功能、差错检测
IP 是网络层协议
3)TCP 和 UDP 均不提供的服务
- 时延保证/定时服务
- 带宽保证/吞吐量服务
二、多路复用和多路分解
1. 多路复用和多路分解
1)在发送主机处进行多路复用
是指从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层。
2)在接收主机处进行多路分解
是指传输层检查这些字段,标识出接收套接字,进而将报文段定向到该套接字。即将传输层报文段中的数据交付到正确的套接字的工作。
3)图示
三、详解多路分解
1. 多路分解的工作过程
传输层报文段的格式:
1)主机接收到 IP 数据报
- 每个数据报有:源 IP 地址、目的 IP 地址
- 每个数据报搬运一个数据段
2)主机接收到传输层报文段
- 每个报文段有:源端口号、目的端口号
- 端口号是一个 16 bit 的数,其大小在 0~65535 之间
- 0~1023 的端口号称为周知端口号,保留给周知应用层协议使用
回忆:对于特定应用程序具有周知端口号
3)主机用 IP 地址和端口号指明数据段属于哪个套接字
4)传输层实现分解服务
在主机上的每个套接字能够分配到一个端口号,当报文段到达主机时,传输层检查报文段中的目的端口号,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进程。
2. 无连接的多路分解
UDP 套接字由 2 部分指定:
目的 IP 地址 | 目的端口号 |
当接收主机收到 UDP 报文段时:
- 检查报文段中的目的端口号
- 目的端口号指示 UDP 报文段属于哪个套接字
特点:即使两个报文段具有不同的源 IP 地址,或者源端口号,只要它们具有相同的目的 IP 地址和目的端口号,它们就会指向同一个的套接字。
4. 面向连接的多路分解
1)TCP 套接字由 4 部分指定:
源 IP 地址 | 源端口号 |
目的 IP 地址 | 目的端口号 |
当接收主机收到 TCP 报文段时:
- 检查报文段中的源端口号和目的端口号
- 源端口号和目的端口号指示 TCP 报文段属于哪个套接字
特点:即使两个报文段具有相同的目的 IP 地址和目的端口号,只要它们具有不同的源 IP 地址,或者源端口号,它们就会指向不同的套接字。
接收主机向发送主机回复数据时,应用程序 (应用层) 不再需要获取源 IP 地址和源端口号,直接选择相应的 Socket 进行发送即可。
2)服务器主机可同时支持很多个 TCP 套接字:
- 每个 TCP 套接字用 4 部分来表示
- 以 Web 服务器为例:对每个连接的客户都有不同的套接字
- 非持久 HTTP 将对每个请求有一个不同的套接字
四、无连接传输:UDP
1. UDP:用户数据报协议
1)特点
- 是无修饰的、不加渲染的 Internet 传输层协议
- 提供尽力而为的服务
UDP 报文段可能:
- 丢失
- 会传递失序的报文到应用程序
是无连接的服务:
- 在 UDP 接收者和发送者之间没有握手
- 每个 UDP 报文段的处理独立于其它报文段
2)UDP 为什么还能存在?
- 不需要建立连接,从而减少了延迟
- 实现起来比较简单:在发送者和接收者之间不需要连接状态
- UDP 报文段首部很小
- 没有拥塞控制,从而 UDP 能够用尽可能快的速度传递
3)更多内容
UDP 只在 IP 数据报服务之上增加了很少一点的功能,即复用/分解功能和差错检测功能。
虽然 UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点。
- UDP 是无连接的,即发送数据之前不需要建立连接。
- UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
- UDP 没有拥塞控制,很适合多媒体通信的要求。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小,只有 8 个字节。
UDP 是面向报文的。发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层。
UDP 对应用层交付下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。
接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进
程,一次交付一个完整的报文。
应用程序必须选择合适大小的报文。
2. UDP 是面向报文的
3. UDP 的首部格式
用户数据报 UDP 有两个字段:首部字段和数据字段。
首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。
- 通过端口号使目的主机将应用数据交给相应的套接字,即执行分解功能。
- 长度 = 首部的字节数 + 数据的字节数。
- 接收方使用校验和来检查在该报文段中是否出现了差错。
- 应用层数据占用 UDP 报文段的应用数据字段。
4. UDP 校验和与差错检测
1)UDP 校验和
目标:对传输的数据进行差错检测。
在计算检验和时,临时把伪首部和 UDP 用户数据报连接在一起,伪首部仅仅是为了计算检验和。
2)UDP 校验和例子
发送方:
- 将伪首部和 UDP 报文段以 16bit 进行划分
- 校验和:将所有的 16bit 相加
- 发送者将校验和值放入 UDP 的校验和域
接收方:
- 计算接收到报文段的校验和
- 检查计算的校验和是否等于校验和域中的值
- NO – 检测到错误
- YES – 没有检测到错误,但是可能是错误的
3)UDP 差错检验
用户数据和校验信息都可能在传输过程中出错,但不管谁错了都不再接收。
差错检测不是 100% 可靠!协议有可能漏掉一些错误,但很少;大的校验信息域能提供更好的检错能力。