传输层
传输层服务
功能
向应用层提供通信服务,属于面向通信部分的最高层,也是用户功能中的最底层;为不同主机上的进程提供了逻辑通信,而网络层为主机之间提供逻辑通信,即使网络层协议不可靠(分组丢失、混乱或重复),传输层也能为应用程序提供可靠的服务。
功能如下:
- 端到端的逻辑通信,逻辑通信是指逻辑上是同层直接的传输;
- 复用和分用(网络层也有),发送方的不同进程可以使用同一个传输层协议,接收方剥去报文首部后可以将数据交付给正确的目的进程;
- 差错检验,而网络层只检查 IP 首部;
- 提供面向连接的 TCP 和无连接的 UDP,网络层要么提供虚电路,要么提供数据报;
寻址和端口
端口能够让应用层的各种应用进程将数据通过端口交给传输层,以及让传输层知道端口与应用的对应;端口是传输层服务访问点(TSAP),类似于 IP 地址在网络层或 MAC 地址在数据链路层的作用,但端口标识应用进程,后两者标识主机。
端口号长 16bit,能够标识 65536 个不同的端口号,只具有本地意义,可以分为两类:
- 服务器端使用的端口号,一种是 熟知端口号,, 由 IANA(互联网地址指派机构)指派给 TCP/IP 的重要应用,另一类为 登记端口号,,必须在 IANA 登记,防止重复;
- 客户端使用的端口号,,仅在客户进程运行时才动态选择,又称为 短暂/临时端口号,通信结束后就释放;
熟知端口号
FTP | TELENT | SMTP | DNS | FHTP | HTTP | SNMP |
---|---|---|---|---|---|---|
21 | 23 | 25 | 53 | 69 | 80 | 161 |
套接字,由 IP 地址和端口号组成,唯一标识一台主机上的一个应用进程。
UDP 协议
UDP 数据报
仅在 IP 数据报服务上增加了两个最基本的服务:复用和分用,差错检测,由如下优点:
- 无须建立连接;
- 无连接状态,消耗更小;
- 分组首部开销小;
- 应用层能更好控制发送的数据和时间,UDP 没有拥塞控制;
- 支持一对一、一对多、多对一和多对多。
比较适合于一次传输较少数据的应用,如 DNS、SNMP 等,或者一些多媒体(IP 电话、实时视频会议、流媒体等)。
首部格式
长 8B,四个字段均分,分别为:
- 源端口,需要对方回信时才用,不需要时全为 0;
- 目的端口,终点交付报文时必须用到;
- 长度,UDP 数据报的长度(包括首部和数据),最小是 8,即仅有首部;
- 校验和,可选,不选全为 0;
校验
计算校验和时要向 UDP 数据报(包含真实的首部)前增加 12B 的伪首部,单纯用于计算校验和,伪首部有 4B 的源 IP 地址、目的 IP 地址、1B 的 0 和 17(标识使用 UDP 协议),以及 2B 的 UDP 长度。
若数据部分长度不是偶数字节,则填充 0,将数据报视为很多 16 位的字串,通过二进制反码求出这些 16 位字的和,将和写入校验和字段;接收方检验也是相同操作。
TCP 协议
特点
解决传输的可靠、有序、无丢失和不重复问题,主要特点有:
- 面向连接,是一条逻辑连接;
- 点对点、是一对一的;
- 提供可靠交付服务;
- 提供全双工通信,TCP 连接的两端都有发送和接收缓存;
- 面向字节流;
UDP 长度由发送报 文决定,而 TCP 报文长度根据接收方 窗口值 和 网络拥塞程度 控制;
TCP 报文段
首部前 20B 是固定的,有一些可选项,数据部分为 4B 的整数倍。首部包括:
- 2B 的源端口和目的端口;
- 4B 的序号;
- 4B 的确认号,期望对方下一个报文段的序号,若确认号为 N,则表示 N-1 及之前的报文都正确收到;
- 4 位的数据偏移,表示数据段距离报文段的起始处有多远;单位是 32 位 4B,因此 TCP 首部的最大长度为 60B;
- 6 位的保留,为今后使用,置零;
- 紧急位 URG,1 位,表示应该尽快传送;
- 确认位 ACK,1 位,连接建立后的所有 ACK 都是 1;
- 推送位 PSH(push),1 位,表示应该尽快交付给接受应用,而不是等缓存满了再上交;
- 复位位 RST(reset),表示连接出现严重差错,需要重新连接;
- 同步为 SYN,表示这是一个连接请求或连接接受报文;
- 终止位 FIN,释放连接;
- 窗口,2B,表示现在允许对方发送的数据量;单位字节;
- 校验和,2B,包括首部和数据两部分,计算时同样要加上 12B 的伪首部,只需要将协议字段的 17 改为 6,长度改为 TCP 长度,其余和 UDP 一致;
- 紧急指针,2B,指出紧急数据有多少字节,紧急数据在数据段的最前面,因此相当于指针;
- 选项,可变长度,最初只规定了一种选项,最大报文段长度(MSS),表示数据字段的最大长度;
- 填充,使整个首部的长度是 4B 的整数倍。
一般 MSS 不能太小也不能太大,因为首部会占用一部分,太小了利用率低,太大了 IP 传输时会分片。
TCP 连接管理
分为三个阶段:
- 连接建立,要确保双方感知对方存在,允许双方协商参数,如最大窗口值等,能够对运输实体资源进行分配,如缓存大小等;
- 数据传送;
- 连接释放。
TCP 把连接作为最基本的抽象,其连接的断电不是主机、IP 地址也不是应用,而是 套接字,每条 TCP 线路被两个端点套接字确定;
连接的建立采用客户服务器模型,主动发起连接建立的是 客户。
三次握手,服务器进程需要始终保持监听状态,等待用户连接请求
- 客户向服务器发送 连接请求 报文,其中同步位 SYN 置 1,同时选择一个初始序列号 x;TCP 规定,该协议不能携带数据,但要消耗掉一个序号;
- 若服务器同意连接,则发回确认,同时为该 TCP 连接分配缓存和变量;确认报文中 SYN 和 ACK 都为 1,确认号则是 x+1,同时为自己选择一个序号 y,同样不能携带数据以及需要消耗序号;
- 当客户受到确认时,还要向服务器发送确认,并且分配缓存和变量;ACK 为 1,确认号 y+1,需要 x+1,可以携带数据,如不携带数据则不消耗序号。
由于服务器端的资源在第二次握手分配资源,容易遭到 SYN 洪泛攻击。
三次握手可以防止失效的请求到达服务器,如第一次连接请求在某个结点长时间滞留,客户超时重发,建立连接后关闭,此时第一次的连接请求到达服务器,服务器将会一直等待。
若使用相同固定的序号建立连接,在频繁建立连接的双方中会出现问题。
四次挥手:
- 客户向服务器发送 释放报文 段,FIN 为 1,序号为 u,等于前面已传送过的数据的最后一个字节序号加 1,即使不带数据,也消耗序号;
- 服务器回复确认,ack 为 u+1,seq 为 v,等于前面已传送过的数据的最后一个字节序号加 1,此时处于半关闭状态,但服务器若要发送数据,客户仍要接收,因为服务器到客户的 TCP 连接还未关闭;
- 若服务器没有向客户机发送的数据,就通知 TCP 释放连接,FIN 为 1,序号为 w(因为中间可能服务器又发送了一些数据),确认号仍然是上次的 u+1;
- 客户还必须返回确认,ack 为 w+1,序号为 u+1 ,再等待 2MSL(最长报文段寿命)后才进入连接关闭状态。
等待 2MSL 的原因是确保返回的确认报文段到达服务器,否则客户关闭而服务器一直不能关闭;
可靠传输
TCP 为每个传输的字节都编上序号,序号是数据段第一个字节的序号;发送方会缓存已发送但还未受到确认的数据,若传输出现问题,只需要让确认号为丢失的字节序号即可。
当超时未受到确认帧时,重传该报文;采用自适应算法,记录 RTT 往返时间(数据报和收到相应确认的时间差),并进行加权求平均 ;RTO 超时重传时间应该稍微大于 。
当接受到比期望序号更大的数据段时,发送三个 冗余 ACK 表示 后一个 序号的字节丢失,会重传 丢失的字节;属于选择重传,
流量控制
基于滑动窗口协议的流量控制机制,基本原理 见,并且允许在通信过程中调整窗口大小。
拥塞控制
发送窗口的上限取拥塞窗口和接收窗口中的较小者。
慢开始:先令拥塞窗口为 1,每受到一个确认则窗口加倍;
拥塞避免:当拥塞窗口达到一个门限值时,就开始线性增长,直到发生拥塞,此时门限值减小为出现拥塞时拥塞窗口的一半,并重新从慢开始增大窗口大小。
慢开始增长的拥塞窗口也不能超过门限值。
快重传:当受到冗余 ACK 时,不必等待重传计时器超时,直接重传;
快恢 复:当受到冗余 ACK 时将门限值设为当前拥塞窗口的一半,同时拥塞窗口也折半而不是从 1 开始,并开始线性增长。
后面两种是接收到冗余 ACK 才会使用,因为虽然此时网络拥塞导致丢失数据,但是至少 3 个冗余 ACK 仍然被正确交付了,因此网络拥塞没有太严重,所以直接从门限开始。