试说明运输层在协议栈中的地位和作用,运输层的通信和网络层的通信有什么重要区别?为什么运输层是必不可少的?
运输层处于面向通信部分的最高层,同时也是用户功能中的最低层,向它上面的应用层提供服务。
运输层为应用进程之间提供端到端的逻辑通信,但网络层是为主机之间提供逻辑通信(面向主机,承担路由功能, 即主机寻址及有效的分组交换)。
各种应用进程之间通信需要"可靠"或"尽力而为"的两类服务质量,必须由运输层以复用和分用的形式加载到网络层。
UDP
用户数据报协议(User Datagram Protocol,UDP)为其上层提供的是无连接的不可靠 的数据传输服务。
无连接:使用UDP通信的双方,在传送数据之前不需要建立连接。
UDP不需要实现可靠传输,因此不需要使用实现可靠传输的各种机制。
UDP的实现简单,UDP用户数据报的首部比较小。首部开销小,仅8字节。
UDP是面向应用报文的
支持"一对一"、"一对多"、"多对一"和"多对多"交互通信。
TCP
传输控制协议(Transmission Control Protocol,TCP)为其上层提供的是面向连接的可靠的数据传输服务。
面向连接:使用TCP通信的双方,在传送数据之前必须首先建立TCP连接(逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接。
TCP为了实现可靠传输,就必须使用很多措施,例如TCP连接管理、确认机制、超时重传、流量控制以及拥塞控制等。
TCP的实现复杂,TCP报文段的首部比较大,占用处理机资源比较多。TCP报文段首部最小20字节,最大60字节
TCP是面向字节流的。
每一条TCP连接只能有两个端点EP,只能是一对一通信。
提供全双工通信。TCP运行通信双方的应用进程在任何时候都能发送数据。
进程之间的通信、复用(应用层进程通过运输层送到IP层)/分用(运输层从IP层收到数据后交付应用进程)、端口号(IP 地址:端口号=套接字,确定通信进程)、熟悉一些熟知的端口号(如FTP: 21, TELNET:23, SMTP:25, DNS:53, HTTP: 80等)
128 64 32 16 8 4 2 1
• UDP 首部格式简单(系统开销低、数据传输的延迟更短);
UDP计算校验和时要在数据报前增加12字节伪首部,把首部和数据部分一起检验。无错时结果为全1.
UDP检验和的计算
1.把所有数据分成16bit的片段
⒉依次求和,如果最高位有进位,就挪到最低位进行一次+1操作
3.最后得到的结果取反码
【源端口 目的端口 长度 检验和】
• 停止等待协议SW:确认、重传 /ARQ 、编号;信道利用率低 U=TD /(T D +RTT+T A ) ;
• 流水线传输、连续 ARQ 、回退N帧协议(GBN)、SR(选择重传)滑动窗口、累积确认
TCP连接: 套接字(IP地址:端口号)可以唯一的确定一个在互联网上通信的进程
TCP首部含义及应用:
1) 源端口和目的端口 各占2个字节,分别写入源端口和目的端口。
2) 序号 占4字节。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送 的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一 个字节的序号。例如,一报文段的序号是301,而接待的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是 301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字 段值应 为401。这个字段的序号也叫"报文段序号"。
3) 确认号 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。 若确认号为= N,则表明:到序号N-1为止的所有数据都已正确收到。
4) 数据偏移 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实 际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的,但应注意,"数 据偏移"的单位是32位字(即以4字节的字为计算单位)。由于4位二进制数能表示的最大十进制数字是15,因此数据偏移的最大 值是60字节,这也是TCP首部的最大字节(即选项长度不能超过40字节)。
5) 保留 占6位,保留为今后使用,但目前应置为0 。
下面有6个控制位,用来说明本报文段的性质。
6) 紧急URG(URGent) 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据, 应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。
当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面, 而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。
7) 确认ACK(ACKnowledgment) 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP 规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
8) 推送 PSH(PuSH) 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后 立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1, 并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即"推送"向前)交付接收应用进 程。而不用再等到整个缓存都填满了后再向上交付。
9) 复位RST(ReSeT) 当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因), 必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
10) 同步SYN(SYNchronization) 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个 连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这 是一个连接请求或连接接受报文。
11) 终止FIN(FINis,意思是"完""终") 来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发 送完毕,并要求释放运输连接。
12) 窗口 占2字节。窗口值是【0,2^16-1】之间的整数。窗口指的是发送本报文段的一方的接 受窗口。接 收方的数据缓存空间是有限的。窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。
例如,发送了一个报文段,其确认号是701,窗口字段是1000.这就是告诉对方:"从701算起,我(即发送方报文段的一方)的接收缓存空 间还可接受1000个字节数据(字节序号是701~1700),你在给我发数据时,必须考虑到这一点。"
13) 检验和 占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计 算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但 应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收 方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。
14) 紧急指针 占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节 数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急 数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。
15) 选项 长度可变,最长可达4字节。当没有使用"选项"时,TCP的首部长度是20字节。
• TCP 连接管理
TCP是面向连接的协议,它基于运输连接来传送TCP报文段。
TCP运输连接的建立和释放,是每一次面向连接的通信中必不可少的过程。
TCP运输连接有以下三个阶段:
通过"三报文握手"来建立TCP连接。
基于已建立的TCP连接进行可靠的数据传输。
在数据传输结束后,还要通过"四报文挥手"来释放TCP连接。
- 初始时:两端都处于 CLOSED 状态,然后服务器打开 TCP 服务进⼊ LISTEN 状态,监听特定端⼝,等待客户端的TCP 请求。
- 第⼀次握⼿:客户端主动打开连接,发送 TCP 报⽂,进⾏第⼀次握⼿,然后进⼊ SYN_SEND 状态,等待 服务器发回确认报⽂。
⾸部同步位 SYN=1 ,同时初始化⼀个序号 seq=x , TCP 规定 SYN 报⽂段不能携带数据,但会消耗⼀个序号。 - 第⼆次握⼿:服务端收到 SYN 报⽂,如果同意建⽴连接,则向客户端发送⼀个确认报⽂,然后服务器进 ⼊SYN_RCVD 状态。
这时⾸部的同步位 SYN=1 ,确认位 ACK=1 ,确认号字段 ack=x+1 ,同时初始化⼀个序号 seq=y 。同样规定不携带数据,消耗⼀个序号。 - 第三次握⼿:客户端收到服务器发送过来的确认报⽂,还要向服务器给出确认,然后进⼊ ESTABLISHED 状态。此时⾸部SYN 不再置 1 ,⽽ ACK=1 ,确认号字段 ack=y+1 ,序号 seq=x+1 。
第三次握⼿,⼀般会携带真正需要传输的数据,当服务器收到该数据报⽂的时候,就会同样进⼊
ESTABLISHED 状态。此时, TCP 连接已经建⽴。
为什么需要三报⽂握⼿?
为了防⽌已失效的连接请求报⽂段突然⼜传送到了服务器,因⽽产⽣错误。资源浪费
【2011年 题39】主机甲向主机乙发送一个(SYN=1,seq=11220)的TCP段,期望与主机乙建立TCP连接,若主机乙接受该连接请求,则主机乙向主机甲发送的正确的TCP段可能是( )。C. (SYN=1,ACK=1,seq=11221,ack=11221)
【2019年 题39】若主机甲主动发起一个与主机乙的TCP连接,甲、乙选择的初始序列号分别为2018和2046, 则第三次握手TCP段的确认序列号是( 2047 )。
TCP 连接释放
四报文握手也称为"四次挥手"
- 结束前:通信双⽅都处于 ESTABLISHED 状态,然后其中⼀⽅主动断开连接。假设客户端先主动断开连接。
- 第⼀次挥⼿:客户端向服务器发送结束报⽂段,然后进⼊ FIN_WAIT_1 状态。
此报⽂段终⽌位 FIN=1 ,确认位 ACK=1 ,序号 seq=u 等于之前已传送过的最后⼀个字节序号 +1 ,确认号 ack=v 等于客户进程已收到最后⼀个数据的序号 +1 。 FIN=1 报⽂不能携带数据。 - 第⼆次挥⼿:服务端收到客户端发送结束报⽂段,进⼊ CLOSE_WAIT 状态。然后发送结束报⽂段,此报 ⽂段FIN=1 ,确认位 ACK=1 ,序号 seq=v ,确认号 ack=u+1 。此时 TCP 处于半关闭状态,客户端⽆数据发送,服务器还可以发送数据。客户端接受结束报⽂后进⼊FIN_WAIT_2 状态。
- 第三次挥⼿:数据传输完服务器再向客户端发送结束报⽂段,然后进⼊ LAST_ACK 状态。此报⽂段终⽌位FIN=1 ,确认位 ACK=1 ,序号 seq=w 此 w 为服务器数据传输后的序号⽐ u ⼤,确认号 ack=u+1 。
- 第四次挥⼿:客户端收到服务器的结束报⽂段,然后发送确认报⽂段,并进⼊ TIME_WAIT 状态,经过2MSL之后,⾃动进⼊ CLOSED 状态。此报⽂段确认位 ACK=1 ,序号 seq=u+1 ,确认 ack=w+1 。服务 端收到该报⽂之后,进⼊CLOSED 状态。
为什么需要等待 2MSL 才释放连接?
MSL 叫做最⻓报⽂段寿命, RFC793 建议为 2 分钟(⼀般可能不是这个值)。
第⼀,为了保证客户端发送的最后⼀个 ACK 报⽂段能够到达服务器。
第⼆,防⽌ " 已失效的连接请求报⽂段 " 出现在本连接中。
【2020年 题39】若主机甲与主机乙建立TCP连接时发送的SYN段中的序号为1000,在断开连接时,甲发送给乙的FIN段中的序号为5001,则在无任何重传的情况下,甲向乙已经发送的应用层数据的字节数为( C. 4000 )。
甲给乙发送的第一个应用层数据字节的TCP序号为1001,因为应用层数据作为数据载荷被封装在TCP报文段中。甲在发送FIN段之前,给乙发送的最后一个应用层数据字节的TCP序号为5000。综上所述,甲向乙已经发送了字节序号为1001~5000共4000个字节的应用层数据。
TCP流量控制:让发送方的发送速率不要太快,让接收方来得及接受。TCP窗口单位是字节。发送方的发送窗口不能超过接收方给出的接收窗口。
持续计时器、零窗口探测报文段,传输效率问题【rwnd 接收窗口】
• (防止传入数据耗尽接收端的资源、使用窗口大小)
【2010年 题39】主机甲和主机乙之间建立了一个TCP连接,TCP最大段长度为1000字节。若主机甲的当前拥塞 窗口为4000字节,在主机甲向主机乙连续发送两个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的接收窗口大小为2000字节,则此时主机甲还可以向主机乙发送 的最大字节数是( 1000 )。
TCP发送方的发送窗口值 = min[TCP发送方的拥塞窗口值,TCP接收方的接收窗口值]
题目未给出TCP发送方的发送窗口值以及TCP接收方的接收窗口值,则取拥塞窗口值作为发送窗口值。TCP最大报文段长度MSS,并不是指整个TCP报文段的长度,而是指TCP报文段的数据载荷的长度。
-- TCP拥塞控制:慢开始、拥塞避免、快重传、快恢复(如习题5- 38/39)
【注意 swnd = min(cwnd,rwnd) 】
当cwnd < ssthresh时,使用慢开始算法。每经过一个RTT就+2的n次方(1、2、4、8)
当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法。每经过一个RTT就+1
【RTT=12 超时】重传计时器超时,判断网络可能出现了拥塞,进行一下调整: 将ssthresh值调整为发生拥塞时cwnd值的一半 ,即24/2=12; 将cwnd=1,并重新开始执行慢开始算法。
【RTT=21 收到三个确认】与快重传算法配合使用的是快恢复算法,发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段,于是不启动慢开始算法,而是执行快恢复算法。
发送方将慢开始门限ssthresh的值和拥塞窗口cwnd的值都调整为当前cwnd值的一半,并开始执行拥塞避免算法。
【2009年 题39】一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为16KB时发生了超时,如果接下来的4个RTT(往返时间)时间内的TCP段的传输都是成功的那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口大小是( 9 )
第1个传输轮次(RTT)结束
cwnd =1+1=2
第2个传输轮次(RTT)结束
cwnd = 2+2=4
第3个传输轮次(RTT)结束cwnd = 4+4=8
由于此时cwnd = 8 = ssthresh,之后改为拥塞避免
第4个传输轮次(RTT)结束
cwnd = 8+1
【2014年 题38】主机甲和主机乙已建立了TCP连接,甲始终以MSS=1KB大小的段发送数据,并一直有数据发送;乙每收到一个数据段都会发出一个接收窗口为10KB的确认段。若甲在t时刻发生超时时 拥塞窗口为8KB,则从t时刻起,不再发生超时的情况下,经过10个RTT后,甲的发送窗口是 ( 10 )。swnd = min(cwnd,rwnd)
【2015年 题39】主机甲和主机乙新建一个TCP连接,甲的拥塞控制初始阈值为32KB,甲向乙始终以MSS=1KB 大小的段发送数据,并一直有数据发送; 乙为该连接分配16KB接收缓存,并对每个数据段进 行确认,忽略段传输延迟。若乙收到的数据全部存入缓存,不被取走,则甲从连接建立成功 时刻起,未发生超时的情况下,经过4个RTT后,甲的发送窗口是( A. 1KB )。
【2017年 题39】若甲向乙发起一个TCP连接,最大段长MSS=1KB,RTT=5ms,乙开辟的接收缓存为64KB,则甲从连接建立成功至发送窗口达到32KB,需经过的时间至少是( 5ms × 5 = 25ms )。
【2020年 题38】若主机甲与主机乙已建立一条TCP连接,最大段长MSS为1KB,往返时间RTT为2ms,则在不出 现拥塞的前提下,拥塞窗口从8KB增长到20KB所需的最长时间是( )。
74.流量控制和拥塞控制的最主要的区别是什么?发送窗口的大小取决于流量控制还是拥塞控制?
简单地说,流量控制是在一条TCP连接中的接收端才用的措施,用来限制对方(发送端)发送报文的速率,以免在接收端来不及接收。流量控制只控制一个发送端。
拥塞控制是用来控制TCP连接中发送端发送报文段的速率,以免使互联网中的某处产生过载。拥塞控制可能会同时控制许多个发送端,限制它们的发送速率。不过每一个发送端只知道自己应当怎样调整发送速率,而不知道在互联网中还有哪些主机被限制了发送速率。
发送窗口的上限值是Min [rwnd, cwnd],即发送窗口的数值不能超过接收窗口和拥塞窗口中较小的一个接收窗口的大小体现了接收端对发送端施加的流量控制,而拥塞窗口的大小则是整个互联网的负载情况对发送端施加的拥塞控制。