# 传输层
知识结构
- 传输层提供的服务
- 传输层的功能;传输层寻址与端口;无连接服务和面向连接服务
- UDP
- UDP 数据报;UDP 校验
- TCP
- TCP 段;TCP 连接管理; TCP 可靠传输;TCP 流量控制与拥塞控制
# 5.1 传输层提供的服务
# 5.1.1 传输层的功能
传输层位于网络层之上,它为运行在不同主机上的进程提供了逻辑通信,而网络层提供主机之间的逻辑通信。
传输层提供的功能如下:
- 传输层提供应用进程之间的逻辑通信。与网络层的区别是,网络层提供的是主机之间的逻辑通信。
- 复用和分用。复用是指发送方不同的应用进程都可使用同一个传输层协议传送数据;分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。
- 传输层还要对收到的报文进行差错检查。
- 提供两种不同的传输协议,即 UDP 和 TCP。
# 5.1.2 传输层的寻址与端口
- 端口的作用
端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。
端口是传输层服务访问点,类比于 IP 在网络层或 MAC 地址在数据链路层的作用。只不过端口标识的是进程而不是主机。
- 端口号
应用进程通过端口号进行标识,端口号长度为 16bit,能够标识 65536 个不同的端口。
根据端口号范围将端口分类:
- 熟知端口号,0 ~ 1023,分配给了 TCP/IP 最重要的一些应用程序
- 登记端口号,1024 ~ 49151,提供给没有熟知端口号的应用程序使用
- 短暂端口号,49152 ~ 65536,提供给客户端程序动态选择
- 套接字
在网络中用 IP 标识主机,用端口号标识应用进程。所谓套接字,实际上是一个通信端点,即 套接字=(主机 IP地址,端口号)
,它能够唯一的标识一台主机和其上的一个应用。
# 5.1.3 无连接服务和面向连接服务
面向连接服务就是在通信双方进行通信之前,必须先建立连接,在通信过程中,整个连接情况一直被实时地监控和管理。通信结束后,应该释放这个连接。
无连接服务是指两个实体之间的通信不需先建好连接,需要通信时,直接将信息发送到“网络中”,让该信息的传递在网上尽力地往目的地传送。
# 5.2 UDP 协议
# 5.2.1 UDP 数据报
- UDP 概述
RFC 768 定义的 UDP 只是做了传输协议最基本的工作,仅在 IP 的基础上增加了两个最基本的服务:复用和分用以及差错检测。
UDP 常用于一次性传输较少数据的网络应用,如 DNS、SNMP 等。也常用于多媒体应用这类时延要求高于可靠性的常见。
UDP 提供尽最大努力的交付,但不保证可靠交付。
UDP 是面向报文的,一次交付一个完整的报文,报文不可分割,报文是 UDP 数据报处理的最小单位。
- UDP 的首部格式
UDP 数据报包含两部分:UDP 首部和用户数据。
UDP 首部由四个字段组成,各字段意义如下:
- 源端口
- 目的端口
- 长度。UDP 数据报的长度
- 校验和
# 5.2.2 UDP 校验
IP 数据报首部包含源 IP 地址和目的 IP 地址,UDP 数据报首部包含源端口和目的端口。
UDP 校验和的计算和 IP 相似,都使用二进制反码运算求和再取反。但不同的是 IP 只检验首部,UDP 检验首部和数据部分。
# 5.3 TCP 协议
# 5.3.1 TCP 协议的特点
TCP 是在不可靠的 IP 层之上实现的可靠的数据传输协议,它主要解决传输的可靠,有序、无丢失和不重复问题。
TCP 协议的主要特点如下:
- 面向连接
- 每条连接只能是一对一
- 提供可靠的交付服务
- 提供全双工通信
- 面向字节流
# 5.3.2 TCP 报文段
TCP 传送的数据单元称为报文段。
一个 TCP 报文段分为 TCP 首部和 TCP 数据两部分,整个 TCP 段作为数据部分封装在 IP 数据报中。
TCP 报文段即可以用来运载数据,又可以用来建立连接、释放连接和应答。各字段意义如下:
- 源端口和目的端口
- 序号字段 seq。TCP 连接传送的数据流是给每个字节编上一个序号,这里字段就是当前报文段的数据部分的第一个字节的序号。
- 确认号字段 ack
- 数据偏移。首部长度
- 保留字段
- 紧急位 URG
- 确认位 ACK
- 推送位 PSH
- 复位位 RST
- 同步位 SYN
- 终止位 FIN
- 窗口字段。允许对方发送的数据量
- 校验和
- 紧急指针字段
- 选项字段
- 填充字段。让首部长度对齐 4B
# 5.3.3 TCP 连接管理
TCP 连接的管理就是使运输连接的建立和释放都能正常进行。
在 TCP 连接建立的过程中,要解决以下三个问题:
- 要是每一方都能确定对方的存在
- 要允许双方协商一些参数
- 能够对运输实体资源进行分配
- TCP 连接的建立
连接的建立经历以下三个步骤,通常称为“三次握手”
第一步:客户端的 TCP 首先向服务器的 TCP 发送一个连接请求报文段。这个特殊的报文段中 SYN 设置为 1,表示为一个连接请求报文,随机选择一个起始序号字段 。
第二步:服务器的 TCP 收到连接请求报文后,如果同意连接,分配 TCP 连接所需的资源。在确认报文中,SYN 和 ACK 都置为 1,确认号字段设置为 ,随机选择一个起始序号字段 。
第三步:当客户机收到确认报文后,还要向服务器给出确认。客户机分配 TCP 连接所需的资源。这个确认报文中,ACK 置为 1,起始序号自增设置为 ,确认号字段设置为 。
这里第三步的报文段已经可以携带数据,若不携带数据则不消耗序号。
- TCP 连接的释放
参与 TCP 连接的两个进程中的任何一个都能终止该连接。TCP 连接释放的过程通常称为“四次握手”。
# 5.3.4 TCP 可靠传输
为了实现可靠传输,TCP 使用了校验、序号、确认和重传等机制来达到这一目的。
- 序号
TCP 把数据视为一个无结构但有序的字节流,序号建立在字节流之上。
- 确认
TCP 首部的确认号使期望收到对方的下一个报文段的数据的第一个字节的序号。
- 重传
有两种事件会导致 TCP 对报文段进行重传:超时和冗余 ACK。
TCP 规定每当比期望序号大的失序报文段到达时,就发送一个冗余 ACK,指明下一个期待字节的序号。
# 5.3.5 TCP 流量控制
TCP 提供一种基于滑动窗口协议的流量控制机制。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口。同时发送方根据其对当前网络拥塞情况估计出一个窗口值,这称为拥塞窗口。
传输层和数据链路层的流量控制的区别是:传输层定义端到端用户之间的流量控制,数据链路层定义两个相邻结点的流量控制。
# 5.3.5 TCP 拥塞控制
所谓拥塞控制,是指防止过多的数据注入网络。
发送方在确定发送报文段的速率时,既要考虑接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此发送窗口的上限值会去接收窗口和拥塞窗口中较小的值。