传输层
传输层提供的服务
传输层的功能
- 提供应用进程间的逻辑通信(网络层提供主机之间的逻辑通信),传输层之间的通信好像是沿水平方向传送数据,但事实这两个传输层之间并没有一条水平方向的物理连接
- 复用和分用,复用:指发送方不同的应用进程都可使用同一个传输层协议传送数据;
分用:指接收方的传输层在去掉报文的首部后能把这些数据正确交付到目的的应用进程 - 差错检测,对收到的报文的首部和数据部分都进行差错检测(网络层只检查IP数据报首部,并不检查数据部分)
- 提供两种不同的传输协议,即面向连接的TCP和无连接的UDP。
传输层的寻址与端口
端口
数据链路层按MAC地址寻址,网络层按IP地址寻址,而传输层是按端口号寻址;数据链路层的SAP是MAC地址,网络层的SAP是IP地址传输层的SAP是端口
端口是传输层服务访问点(TSAP),标识主机中的应用进程,端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程
在协议栈层间的抽象的协议端口是软件端口,它与路由器或交换机上的硬件端口是不同的概念。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议京城与传输实体层间交互的一种地址。传输层使用的是软件端口
端口号
应用进程通过端口号进行表示,端口号长度16bit,能表示65536个不同的端口号。端口号只标识本计算机应用层中的个进程,在因特网中不同计算机的相同端口号是没有联系的。根据端口号范围可分为以下两类:
(1)服务器端使用的端口号:
- 熟知端口号:范围:0~1023,给TCP/IP最重要的一些应用程序,让所有用户都知道
应用程序 | 熟知端口号 |
---|---|
FTP | 21 |
TELNET | 23 |
SMTP | 25 |
DNS | 53 |
TFTP | 69 |
HTTP | 80 |
SNMP | 161 |
- 登记端口号:范围:1024~49151,为没有熟知端口号的应用程序使用的
(2)客户端使用的端口号,数值为49152~65535.由于这类端口号仅在客户进程运行时才动态地选择,因此又称短暂端口号(临时端口号)。通信结束后,刚用的客户端口就不存在,从而这个端口号就可供其他客户进程以后使用
套接字
在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中不同的应用进程,在网络中采用发送方和接收方的套接字来识别端点。套接字,实际上是一个通信端点,即
套接字Socket=(IP地址:端口号)
,它唯一地标识网络中的一台主机和其上的应用(进程)
传输层的两个协议
面向连接的传输控制协议TCP
传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认、流量控制、计时器及连接管理等
TCP的特点
- TCP是面向连接的传输层协议,TCP连接是一条逻辑连接
- 每条TCP链接是能有两个端点,每条TCP链接只能是端到端(进程对进程)
- TCP提供可靠交付的服务,保证传送的数据无差错、不丢失、不重复且有序
- TCP提供全双工通信,允许双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
发送缓存暂时用来存放准备发送的数据和已发送但未收到确认的数据
接收缓存暂时存放按序到达但尚未被接收应用程序读取的数据和不按序到达的数据 - TCP面向字节流,把应用程序交下来的数据仅视为一连串的无结构的字节流
可靠,面向连接,时延大,适用于大文件
TCP报文段
TCP报文段首部各字段的含义如下:
- 源端口号:指出发送应用进程的端口号
- 目的端口号:指出接收方应用进程的端口号
- 序号:在一个TCP连接中传送的字节流的每一个字节都按顺序编号,本字段表示报文段所发送数据的第一个字节的序号
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明序号N-1位置的所有数据都已正确收到
- 数据偏移(首部长度):以4B为单位,即1个数值是4B,TCP报文段的数据起始处距离TCP报文段的起始处有多远
- 紧急位URG:URG=1时,标明此报文段中有紧急数据,是最高优先级的数据,应尽快传送,不用在缓存里派对,配合紧急指针字段使用
- 确认位ACK: ACK=1时,确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1
- 推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付
- 复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传送连接
- 同步位SYN: SYN=1时,表明是一个连接请求/接收报文
- 终止位FIN: FIN=1时,表明此报文发送方数据已发完,要求释放连接
- 窗口:指的是发送本报文段的一方接收窗口,即现在允许对方发送的数据量
- 校验和:校验首部+数据,校验使要加上12B伪首部,第四个字段为6
- 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数
- 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认等
- 数据:要传输的用户数据
TCP连接管理
TCP的传输连接分为3个阶段:连接建立、数据传送和连接释放。TCP传输连接的管理就是使传输的建立和释放都能正常地进行
TCP连接的建立采用客户/服务器模式,主动发起连接建立的应用进程称为客户,而被动等待连接的应用进程为服务器
在TCP连接建立的过程中,需要解决以下三个问题:
- 要使每一方能够知道对方的存在
- 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)
- 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
TCP的连接建立
连接的建立经历以下3个步骤,通常称为三次握手
连接建立前,服务器进程处于LISTEN状态,等待客户的连接请求
- 第一步:客户端发送连接请求报文段,无应用层数据
SYN=1,seq=x(随机)
,此时,TCP客户进程进入SYN-SENT(同步已发送)状态 - 第二步:服务器端为该TCP链接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据
SYN=1,ACK=1,Seq=y(随机),ack=x+1
,此时服务器进入CLOSE-WAIT(关闭等待) - 第三步:客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据
SYN=0,ACK=1,seq=x+1,ack=y+1
TCP的连接释放
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中缓存和变量将被释放
参与TCP链接的两个进程中的任何一个都能终止该连接。TCP连接释放的过程通常称为四次握手
- 第一步:客户端发送释放连接报文段,停止发送数据,主动关闭TCP连接
FIN=1,seq=u
- 第二步:服务端回送一个确认报文段,客户到服务器这个方向的连接就释放了——半关闭状态
ACK=1,seq=v,ack=u+1
- 第三步:服务器发完数据,就发出连接释放报文段,主动关闭TCP连接
FIN=1,ACK=1,seq=w,ack=u+1
- 第四步:客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭
ACK=1,seq=u+1,ack=w+1
TCP可靠传输
TCP任务是在IP层不可靠的服务的基础上建立一种可靠数据传输服务。TCP提供的可靠数据传输服务保证接收方进程从缓存区独处的字节流与发送方发出的字节流完全一样。TCP是用来校验、序号、确认和重传等机制实现可靠传输
1.序号: TCP连接传送的数据流中的每个字节都编上一个序号,序号字段的值是本报文所发送的数据的第一个字节的序号
TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不是报文段指上
2.确认: TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号
3.重传: 超时和冗余ACK会导致TCP对报文段进行重传
(1)超时
TCP每发送一个报文段,就对这个报文段设置一次计时器,计时器设置的重传时间到期但还未收到确认时,就要重传这一段报文段。
报文段发出的时间和收到相应确认的时间之差称为报文段的往返时间RTT
(2)冗余ACK(冗余确认)
冗余ACK再次确认某个报文段的ACK,而发送方先前已经收到该报文段的确认
TCP流量控制
流量控制是匹配发送方的发送速率与接收方的读取速率
TCP提供一种基于滑动窗口协议的流量控制机制
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值
TCP流量控制的示例:
传输层和数据链路层的流量控制的区别是:传输层定义段到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制。另外,数据链路层的滑动窗口协议大小不能动态变化,而传输层的可以动态变化
注意:TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器
若持续计时器设置的时间到期,就发送一个零窗口探测报文段。接收方收到探测报文段时,给出现在的窗口值
TCP拥塞控制
出现拥塞的条件:对资源需求的总和>可用资源
网络中有许多资源同时呈现供应不足->网络性能变坏->网络吞吐量将随输入负荷增大而下降
防止过多的数据注入网络,保证网络中的路由器会链路不会过载。
拥塞控制与流量控制的性质对比:
- 拥塞控制就只是使得网络能够承受现有的网络负荷
- 拥塞控制是一个全局性的过程,涉及的所有主机、所有的路由器以及与降低网络传输性能有关的所有因素
- 流量控制通常指发送端与接收端之间的点对点通信量的控制
- 流量控制抑制发送数据的速率,以便接收端来得及接收
拥塞控制4种算法
假定:(1)数据单方向传送,而另一个方向只传送确认(2)接收方总是有足够大是缓存空间,因而发送窗口取决于拥塞程度
接收窗口: 接收方根据接收缓存设置的值,并告知发送方,反映接收方容量
拥塞窗口: 发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量
一个传输轮次: 发送了一批报文段并收到它们确认的时间
一个往返时延RTT: 开始发送一批拥塞窗口内的报文段到下一批拥塞窗口内的报文段的时间
1.慢开始算法
指的是发送方在开始时只发送一个报文段,目的是试探一下网络的拥塞情况,然后逐渐增大cwnd的值(从cwnd=1 -> cwnd=2 -> cwnd=4 -> cwnd=8)
慢开始算法的原理 :在主机刚开始发送报文段时,可先设置拥塞窗口cwnd=1,即设置为一个最大报文段长度MSS的数值;在每收到一对新的报文的确认后,将拥塞窗口加1,即增加一个MSS的数值。当慢开始把cwnd增加到门限阈值,改用拥塞避免算法
2.拥塞避免算法
拥塞避免算法的原理:让拥塞窗口cwnd缓慢增加——每经过一个往返时延就把发送方的拥塞窗口加1,呈线性规律增加;当检测到网络拥塞时,立即将cwnd降为1,并设置第二次门限阈值为第一次门限阈值的一半,再开始新一轮的慢开始算法和拥塞避免算法…
根据cwnd的大小执行不同的算法,归纳如下:
- cwnd < ssthresh时,使用慢开始算法
- cwnd > ssthresh时,停止使用慢开始算法改用拥塞避免算法
- cwnd = ssthresh时,既可使用慢开始算法又可使用拥塞避免算法
3.快重传算法
快重传算法的原理:首先要求接收方每收到一个失序的报文段后就立即发出重复确认。当发送方连续收到3个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。
冗余ACK不仅可以用来检测丢包的发生,还能用于网络拥塞的检测
4.快恢复算法
快恢复算法的原理:当发送方连续收到三个冗余ACK时,把慢开始门限阈值ssthresh设置为此时发送方cwnd的一半,然后开始执行拥塞避免算法,使拥塞窗口缓慢线性增大
无连接的用户数据报协议UDP
用户数据报协议提供面向市区的简单信息传输服务。传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。
UDP的特点
- 发送数据之前不需要建立连接
- UDP的主机不需要维持复杂的连接状态表
- UDP用户数据报只有8个字节的首部开销
- 网络出现的拥塞不会使源主机的发送速率降低(没有拥塞控制)。这对某些实时应用(如IP电话、实时视频会议)是很重要的
- UDP支持一对一、一对多、多对一和多对多的交互信息
不可靠,无连接,时延小,适用于小文件
UDP的首部格式
UDP数据报包含两个部分:UDP首部和用户数据。UDP首部有8B,由4个字段组成,每个字段长度都是2B
- 源端口: 用来标识源主机上使用的UDP端口,在需要对方回信时选用,不需要是此字段值为0
- 目的端口: 用来标识目的主机上使用的UDP端口。若目的主机应用层没有对应端口的应用进程,则该UDP数据报会被丢弃
- 长度: 用来标识UDP数据报的长度,包括首部和数据,其最小值是8仅含首部
- 校验和: 检测UDP数据报在传输中是否有错,有错则丢弃,该字段可选,当源主机不想计算校验和时,该字段直接全为0
UDP首部和伪首部
其中伪首部包括源IP地址字段、目的IP地址字段、全0字段、协议字段(UDP固定位17)、UDP长度字段
伪首部只有在计算校验和时才出现,不向下传送也不向上递交
17:封装UDP报文的IP数据报首部协议字段是17
该字段可选,当源主机不想计算校验和时,该字段直接全为0