五、传输层
5.1 传输层提供的服务
1.传输层的功能
-
提供应用进程之间的逻辑通信(端到端通信)
- 区别于网络层提供的主机之间的逻辑通信
- 逻辑通信:传输层之间的通信好像沿水平方向传送数据,但事实上这两个传输层并没有水平方向物理连接
- 即使网络层协议不可靠,传输层同样能为应用程序提供可靠服务
-
复用和分用
-
复用是发送方将不同应用进程使用同一个传输协议发送
-
分用是接收方剥去报文首部后将数据正确交付到目的进程
-
区别于网络层的复用和分用:
复用是发送方不同协议封装成IP发送,分用是接收方在网络层剥去首部后正确地交付到协议
-
-
- 传输层对报文进行差错检测(首部+数据部分)
- 区别于网络层只检查IP数据报首部
- 同时提供两种传输协议,面向连接的TCP和无连接的UDP
- 区别于网络层要么提供面向连接的虚电路服务,要么提供无连接的数据报服务,只能选择一个
2.传输层寻址与端口
端口的作用
- 服务访问点SAP(区别于 网络层的IP 数据链路层的MAC 他们标识的是主机 而端口标识的是进程)
- 让应用进程将数据通过端口向下交付给传输层
- 让传输层知道应当将报文段中的数据向上通过端口交付给应用层响应进程
- 标识主机的应用进程
注:传输层使用的是软件端口
- 软件端口是抽象的协议端口
- 硬件端口是硬件设备交互端口
端口号
-
端口号长度16bit,标识65536个端口号
-
端口号只具有本地意义,只能标识本计算机中应用层的进程
-
端口号分类
- 服务器端端口号
- 熟知端口号 0~1023,指派给TCP/IP重要应用程序
- 登记端口号 1024~49151,供没有熟知端口号的程序用
- 客户端端口号 49152~65535,仅在客户端程序运行时才动态选择,也叫短暂端口号(临时端口)
- 服务器端端口号
套接字
-
端口号拼接IP地址构成套接字Socket,网络中采用发送方和接收方套接字识别端点
-
套接字,实质上就是一个通信端点,唯一标识网路中一台主机和其一个进程
-
主机A通信和主机B通信的报文段包含目的端口号和源端口号
- 完全的返回地址是IP地址+源端口号,而源端口号是返回地址的一部分
-
3.无连接服务与面向连接服务
无连接服务和面向连接服务
- 面向连接服务:双方通信前,必须先建立连接,通信过程中,连接情况被实时监控管理,结束后,释放连接
- 可以保证可靠和顺序交付
- 无连接服务:两个实体之间通信不需要建立连接,需要通信时直接将信息尽力而为地发送到目的网络中
- TCP提供面向连接服务,不提供广播和组播服务,增加了许多开销,适合可靠性高场合 FTP HTTP TELNET
- UDP提供无连接服务,主要是:多路复用和错误检查,IP知道分组投递给哪个主机,而UDP不知道投递给哪个具体应用,且也不需要建立连接,也无须给出确认,速度快实时性好,适用于TFTP DNS SNMP RTP
注:
- TCP和虚电路区别
- 传输通道不同。虚电路的交换节点必须保存虚电路状态信息,TCP报文段是抽象的网络层逻辑信道,对网络层不可见
- 能否提供无连接服务。采用虚电路就不能提供无连接服务,而TCP不影响网络层无连接服务
- UDP和数据报区别
- 传输通道不同。IP是经过路由的存储转发,而UDP是传输层端到端的逻辑信道,在网络层封装在IP数据内,对网络层不可见
5.2 UDP协议
1.UDP数据报
-
UDP仅在IP服务上增加了两个服务:复用分用和差错检测
-
UDP适用于很多场合,优点是
- 无须建立连接,不会引入建立连接时延
- 无连接状态,不跟踪序号 确认号参数等
- 首部开销小 TCP有20B首部开销,而UDP仅有8B开销
- 应用层更好控制发送的数据和发送时间 因为UDP没有拥塞控制,不会影响主机发送效率
- UDP支持一对一、 一对多、 多对一、 多对多
-
常用于通信量较小服务 DNS SNMP 等,以及多媒体业务(IP电话 视频会议 流媒体)
-
UDP不保证可靠交付,所有维护可靠性的工作由应用层完成
-
UDP面向报文,一次仅发送一个报文,既不合并也不拆分
- 接收方一次也是交付一次完整的报文。报文不可分割,报文是UDP最小单位
- 因此 应用程序必须选择合适大小报文,太长,导致IP层分片,太短,IP数据率低
首部格式
- 首部8B,4个字段,每个字段2B
- 源端口,需要对方回信选用,不需要全0
- 目的端口,终点交付,必须使用
- 长度,包括首部和数据,最小为8
- 检验和,有错丢弃,全0表示不计算检验和
注:传输层从IP层收到UDP数据报时 根据目的端口上交相关应用进程,不正确时丢弃并发送端口不可达ICMP
2.UDP校验
- UDP前添加12B伪首部,仅用作临时计算校验和,既不向下传送也不向上递交
- 与计算IP校验和相似,但是请注意,UDP检验的是首部与数据部分而不是仅首部
- 将UDP看作一个个16位的字串,数据部分不是偶数字节末尾补0
- 计算16位字所有的二进制反码求和,如果全1说明无差错
- 此例中,数据报长度是15B,需要添加1个全0字节
注:
- UDP数据报不是偶数个字节,要填入全0字节,但是清注意,这和伪首部一样是不发送的
- UDP检验和如果检验出是错的,既可以丢弃,也可以交付并附上错误报告
- 通过伪首部,不仅可以检查源 目的端口号,也可以检验IP数据报的源IP地址和目的IP地址
- UDP检错效果不强,但优势在于简单且处理速度快。
* 5.3 TCP协议
1.TCP段
TCP协议
- TCP是面向连接的协议,TCP连接是一条逻辑连接
- TCP只能有两个端点,每条TCP是点到点的(一对一)
- TCP提供可靠交付服务,保证数据的无差错、不丢失、不重复和失序
- TCP是全双工通信,TCP两端都有发送缓存和接收缓存
- 发送缓存:①准备发送的数据 ②发送了但未确认数据
- 接收缓存:①按需到达但未被应用读取数据 ②未按序到达数据
- TCP面向字节流
- UDP发送的报文长度是由应用进程决定,而TCP是根据 min{接收窗口,拥塞窗口}
TCP报文段
- TCP传送的数据单元是报文段
- TCP报文段除了传输数据还可以:建立连接、释放连接、应答
- 首部20B固定,增加的选项是4B的整数倍
- 源端口和目的端口,各占2B,传输层的复用和分用通过端口实现
- 序号,占4B,范围是0~2^32-1,TCP面向字节流,按顺序编号,序号的值是发送的第一个字节序号
- 确认号,占4B,是期望收到发来的序号,表明前N-1个数据有序到达了
- 数据偏移(首部长度),占4位,表示的是数据起始处到TCP报文段起始处有多元,以4B为单位,由于最大值是15,所以TCP首部的最大值是60B
- 保留 6位,今后使用,目前置0
- 位
- 紧急位 URG :URG=1 表明数据应尽快传送,与首部中紧急指针字段配合使用,第一字节到紧急指针的字节是紧急数据
- 确认位 ACK:ACK=1 表明确认号字段有效,TCP规定,建立连接后所有报文段置1
- 推送位 PSH:PSH=1字段应尽快交给应用进程而不是等缓存满了再上交
- 复位位 RST:RST=1时 TCP连接出现差错,必须释放连接,然后重新建立连接
- 同步位 SYN:SYN=1表示是连接请求或连接响应报文报文
- SYN=1 ACK=0 是连接请求报文
- SYN=1 ACK=1 是连接响应报文
- 中止位 FIN:FIN=1表示是连接释放报文
- 窗口 2B,范围0~2^16-1,是允许对方发送的数据量(字节数)
- 校验和 2B ,校验的是首部和数据部分,和UDP一样 在前面加上12字节伪首部(协议字段17改成6 UDP长度改为TCP长度,其余一样)
- 紧急指针 2B,仅在URG=1有意义,指出紧急数据有多少字节(紧急数据在数据部分的最前面)
- 选项。如最大报文段长度MSS,指出数据字段最大长度**(仅仅是数据字段)**
- 填充。使得首部长度为4B的整数倍
2.TCP连接管理
-
TCP连接解决三个问题:①确知对方存在 ②允许双方协商参数 ③能够对实体资源分配
-
TCP连接是有两个端点,端点不是主机,不是IP地址,不是应用进程,而是套接字
- 每条TCP连接唯一地被通信的两个端点(套接字)确定
-
TCP的连接采用C/S模式,主动发起的是客户,被动等待的是服务器
三次握手
- 第一次握手,SYN不能携带数据,消耗一个序号,进入**SYN-SENT(同步已发送)**状态
- 第二次握手,确认报文不能携带数据,消耗掉一个序号,进入**SYN-RCVD(同步已收到)**状态
- 第三次握手,可以携带数据,若不携带数据则不消耗序号,此时进入**ESTABLISHED(已建立连接)**状态
- 注:服务器的资源在第二次握手分配,客户端的资源在第三次握手分配,这就使得服务器易于收到SYN泛洪攻击,这也是为什么不能携带数据的原因
四次挥手
- 第一次,FIN=1 seq=u,u是最后一个发送字节的序号加一,FIN报文不携带数据,消耗一个序号,此时进入FIN-WAIT1(中止等待状态),理解为全双工关闭了一条数据通路
- 第二次,发出确认,seq=v 没有FIN=1,是前面传送的序号加一,服务器进入CLOSE-WAIT(关闭等待状态),但服务器到客户机的连接没关上,服务器发送数据,客户机仍要接收
- 第三次,仍是由服务器发出,当服务器没有数据,通知释放连接,发出FIN=1 释放报文字段,ack不变,seq=w(中途可能发送数据),进入**LAST-ACK(最后确认)**状态 收到确认报文,进入CLOSED状态
- 第四次,客户机收到连接释放,发出确认,ACK=1 ack=w+1,seq=u+1,然后必须经过2MSL的等待,才进入CLOSED状态
3.TCP可靠传输
-
可靠传输:保证接收方进程从缓存区读出的字节流与发送方发送的字节流一致
-
通过检验、序号、确认、重传机制达到
-
检验与UDP同
-
序号,序号是发送的第一个字节序号,从0开始编号,第二个报文序号3
- 确认,是期望收到第一个字节序号,采用累计确认
- 重传:两种情况,超时和冗余ACK
- 计时器到期重传,超时重传时间应当略大于加权平均往返时间
- 冗余确认:TCP规定每当收到比期望收到的序号大时,就发送冗余ACK,连续三个重复ACK 快重传
4.TCP流量控制与拥塞控制
- 流量控制:消除发送方因发送速率过快而在接收方溢出的可能性,是一种速度匹配服务
- TCP基于滑动窗口进行流量控制,这里是通过接收方的接收窗口rwnd来动态控制
- 发送的实际大小是 min {接收窗口,拥塞窗口}
- 传输层和链路层的区别
- 传输层是端到端的流量控制 数据链路是相邻结点的流量控制
- 数据链路层的窗口大小不能动态变化,传输层的窗口可以动态变化
-
快重传:收到3个重复冗余ACK 直接重传报文段,注意实际是收到了4个相同的ACK,第一个是好的后面3个是冗余的
-
快恢复:收到三个冗余ACK,慢开始门限 变为 cwnd一半(防止拥塞),但是可能不是真的拥塞(因为未按序到达数据能到达对方,能收到重复确认)
- 跳过了从1的满开始过程,直接从满开始门限拥塞避免的线性增长
-
流量控制实际通过接收方决定,拥塞控制通过发送方所在的网络状况决定
- 超时时使用满开始和拥塞避免
- 冗余ACK使用 快重传和快恢复