5.1运输层概述
如何为运行在不同主机上的应用进程提供直接的通信服务使运输层的任务
它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道
因特网的运输层位应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP
5.2运输层端口号、复用与分用的概念
运行在计算机上的进程使用进程标识符PID来标志
因特网上不同操作系统又使用不同格式的进程标识符
TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程
端口号使用16比特表示,取值范围0~65535
熟知端口号:01023,IANA把这些端口号派给了TCP/IP体系中最重要的一些应用协议49151,为没有熟知端口号的应用程序使用
登记端口号:1024
短暂端口号:49152~65535,留给客户进程选择暂时使用
端口号只具有本地意义,不同计算机中的相同端口号使没有联系的
5.3UDP和TCP的对比
用户数据报协议UDP
无连接的UDP
UDP支持单播、多播以及广播
UDP使面向应用报文
提供不可靠传输,不使用流量控制和拥塞控制
首部开销小,仅8字节
传输控制协议TCP
面向连接TCP
TCP仅支持单播
面向字节流
提供可靠传输
首部最少20字节,至多60字节
5.4TCP的流量控制
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收
利用滑动窗口机制来实现TCP连接上对发送方的流量控制
当发送窗口被调控为0且接收方发送的ACK帧丢失了,发送方抑制等待接收方非零窗口的通知,接收方也一直等待发送方发送的数据,这种状态就称为死锁
发送方可启用持续计时器,当持续计时器超时发送零窗口探测报文,当接收到rwnd!=0时就可打破死锁局面
5.5TCP的拥塞控制
若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做拥塞
若出现拥塞而不进行控制,整个网络的吞吐量将随输入符负荷的增大而下降
拥塞控制算法
慢开始
cwnd呈指数增长
慢开始指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢
拥塞避免
cwnd呈线性加1
当启动重传计时器超时判断网络很可能出现了拥塞
将ssthresh值更新为发生拥塞时swnd值的一半
将cwnd值减少为1,并重新开始执行慢开始算法
快重传
可以让发送方尽早知道发生了个别报文段的丢失
就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传
要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认
即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传
快恢复
就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法
发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半‘开始执行拥塞避免算法
也有的快恢复是把快恢复时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh + 3
发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化
拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减少一些
判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发送超时重传)
发送方将拥塞窗口作为发送窗口swnd。即swnd = cwnd
维护一个慢开始门限ssthresh状态变量
当cwnd < ssthresh**时,使用慢开始算法
当**cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法
当cwnd = ssthresh时,即可使用慢开始算法,也可使用拥塞避免算法
5.6TCP超时重传时间的选择
加权平均往返时间RTTs
$$
RTTs1 = RTT1\\
新的RTTs = (1 -α) * 旧的RTTs + α * 新的RTTs样本\\
0 <= α < 1\\
已成为建议标准的RFC6298推荐的α值为0.125
$$
RTT偏差的加权平均RTTD
$$
RTTD_1 = RTT\frac{1}{2}\\
新的RTTD = (1-β) × 旧的RTTD + β * |RTTs - 新的RTT样本 |\\
0 <= β < 1\\
已成为建议标准的RFC6298推荐的β值为0.25
$$
$$
RTO = RTTs +4 × RTTD
$$
出现超时重传时,新RTO=2倍的旧RTO
5.7TCP可靠传输的实现
TCP基于以字节为单位的滑动窗口来实现可靠传输
发送方的发送窗口并不总是和接收放的窗口一样大
网络传送窗口值需要经历一定的时间滞后,并且这个时间还是不确定的
发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸
对于不按序到达的数据应如何处理,TCP并无明确规定
TCP通常对不按序到达的数据先临时存放再接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程
TCP要求接收方必须有累计确认和捎带确认机制
接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传
TCP的通信是全双工通信
5.8TCP的运输连接管理
TCP的连接建立
TCP是面向连接的协议,它基于运输连接来传输TCP报文段
TCP运输连接有以下三个阶段
建立TCP连接
数据传送
释放TCP连接
TCP的连接建立要解决三个问题
使TCP双方能够确知对方的存在
使TCP双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
使TCP双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
TCP使用“三报文握手”建立连接
TCP客户端发送同步位SYN=1 序号字段seq = x
SYN=1的数据段不能携带数据
TCP服务器发送SYN=1和确认位ACK=1 序号字段seq = y 确认号字段ack = x +1
TCP客户端发送确认位ACK=1 序号字段seq = x +1 ack = y +1
普通的确认报文段如果不懈怠数据,则不消耗序号
TCP的连接释放
客户TCP向服务器TCP发送进程终止报文段,终止位FIN = 1 , ACK = 1 , seq = u(等于TCP客户进程之前已传送过的数据最后一个字节的序号+1),ack = v(等于TCP客户进程之前已收到过的数据最后一个字节的序号+1)
服务器TCP向客户TCP发送TCP普通确认,该报文段ACK = 1 , seq = v ,ack = u+1
这时服务器TCP还可以向TCP客户发送报文段
服务器TCP向客户TCP发送TCP连续释放,该报文段FIN = 1,ACK = 1 , seq = w ,ack = u+1
客户TCP向服务器TCP发送TCP普通确认,该报文段ACK = 1 , seq = u+1 ,ack = w+1
TCP客户端进入时间等待要等待2MSL后才进入关闭
MSL使最大报文段寿命,RFC793建议位2分钟
TCP服务器进程每收到TCP客户进程的数据, 就重新设置并启动保活计时器(2小时定时)
若保活计时器定时周期内未收到TCP客户进程发来的数据,则当保活计时器到时后,TCP服务器就向TCP客户发送一个探测报文段,若一连10次探测报文段后TCP进程仍无响应,则关闭连接
5.9TCP报文段首部格式
为了实现可靠传输,TCP采用了面向字节流的方式
固定首部(20字节)
源端口(16字节)
用来标识发送该TCP报文段的应用进程
目的端口(16字节)
标识接收该TCP报文段的应用进程
序号(32比特)
指出本TCP报文段数据载荷的第一个字节的序号
确认号(32比特)
指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
数据偏移(4比特,并以4字节为单位)
指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,这个字段实际是指出了TCP报文段的首部长度
保留(6比特)保留今后使用,目前应置为0
ACK:取值位1时确认号字段才有效,0为无效
窗口(16比特,以字节为单位)
指出发送本报文段的一方的接收窗口
校验和(16比特)
检查范围包括TCP报文段的首部和数据载荷两部分
同步标志位SYN:在TCP连接建立时同步序号
终止标志位FIN:用来释放TCP连接
复位标志位RST:用来复位TCP连接,当RST=1时,表明TCP连接出现了异常,必须释放连接
推送标志位PSH:接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付
进击标志位URG:取值为1时紧急指针字段有效,0为无效
紧急指针(16比特,以字节为单位)
扩展首部(最大40字节)
选项(长度可变)
最大报文段长度MSS选项:TCP报文段数据载荷部分的最大长度
填充
用来确保报文段首部能被4整除