传输层服务:在两个不同的主机的运行应用程序之间提供逻辑通信
将接收到的数据段传递给正确的套接字【多路分解】
从多个套接字收集数据,用首部封装数据,然后将报文段传递到网络层【多路复用】
TCP套接字是由源IP地址,源端口号,目标IP地址,目标端口号唯一标识的
UDP套接字是由目标IP地址和目标端口号标识的
UDP二元组
首先,UDP使用二元组(目标IP和目标端口号)即可确定一个套接字,这其中的理由是非常直观的,因为我们至少在IP地址的基础上还需要一个端口号才能实现运输层功能,而更多的内容对于UDP套接字来说也无必要。这也符合UDP的设计理念,即在网络层上附加尽可能少的功能。为什么TCP不能用二元组
那么,为什么TCP需要使用四元组(目标IP,目标端口号,源IP,源端口号)呢?其中的区别就是TCP是面向连接的。
所谓面向连接,是指数据在发送之前要在两台主机之间先建立好连接,在整个过程中要维护连接,最后要释放连接。如果TCP协议也使用二元组来标识套接字,那么就无法实现面向连接的特点。
假设A和B两台主机同时请求一台服务器上的80端口,如果只使用目标IP和目标端口号,那么在服务器端只会创建一个套接字。显然TCP协议就无法维护A和B各自的序号、确认号、拥塞窗口等连接参数,这就违背了面向连接的设计。
另外,面向连接使得TCP可以进行全双工通信,服务端只要将想发送的数据放入套接字即可向客户端发送信息。如果仅使用二元组来标识连接套接字,那么服务端就无法主动向客户端发送信息。
HTTP,FTP,SMTP,POP3,IMAP、Telnet
DNS,SNMP、RIP
无连接运输,发送数据报文前发送方和接收方的运输层实体没有握手
优点:
- 应用层能更好的控制要发送的数据和发送时间
- 无需建立连接
- 无连接状态
- 分组首部开销小
- 没有拥塞控制,能用尽快的速度发送
- 在IP数据报服务上增加了端口功能和差错检测功能
- 无连接、最大努力交付、没有拥塞控制
- 首部开销小
- 面向报文的。发送方UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文既不合并也不拆分,而是保留报文的边界,一次发送一个报文
- 接收方UDP对IP交上来的UDP用户数据报,去除首部后就原封不动的交付上层应用程序
- 源端口
- 目标端口
- 如果接收方UDP发现收到报文的目的端口不正确,就丢弃该报文,并由ICMP发送端口不可达差错报文
- 长度
- 校验和
- 计算校验和的时候临时加上伪首部。伪首部包含了IPv4头部的一些信息,如源IP、目标IP,只是用来计算校验和而已。接收主机收到UDP报文后从IP首部获悉IP的地址构造伪首部进行校验和运算。
- 伪首部的作用:
- 第一,通过伪首部的IP地址检验,UDP可以确认该数据报是不是发送给本机IP地址的;
- 第二,通过伪首部的协议字段检验,UDP可以确认IP有没有把不应该传给UDP而应该传给别的高层的数据报传给了UDP。
- 从“伪头部”开始,按每16位当作一个数,逐次求和,最终得出一个32位的数;
- 如果这个32位的数的高16位不为0,则进行“回卷”操作。也就是,将其高16位与低16位相加,又得到一个32位的数;
- 重复第2步直到高16位为0。
- 最终,将低16位取反,得到校验和,填入checksum字段中
从rdt1.0一直到rdt3.0
以上都是停等协议:发送方发送一个报文,然后等待接收方的响应
信道利用率很低
解决停等协议低效的问题,允许发送方可以在等待接收方的ACK之前连续发送多个分组
流水线技术对可靠数据传输协议的影响:
- 更大的序列号范围。连续发送的并且还没有得到ACK的多个分组必须要有唯一的序列号,否则引起混乱
- 发送方和接收方需要缓冲区。对于发送方来说,需要缓存已经发出去但是还没有得到ACK的分组;为了实现按序递交,接收方一般也需要存储空间
- GBN 回退N步(Go-Back-N)
允许发送方发送N个分组无需确认,流水线中最多有N个正在等待确认消息的分组,允许使用的序列号范围可以看作是一个大小为N的窗口。随着协议进行,这个窗口在序列号空间内向前滑动,也称为滑动窗口协议
累计确认:接收方不一定要对收到的数据分组逐个发送确认,而可以在收到几个数据分组后,对按序到达的最后一个数据分组发送确认。ACKn表示序号为n之前的所有数据分组都已经正确接收
发送方收到重复的确认就知道之前发送的数据分组出现了差错,于是可以不等超时计时器就立刻重传
优点:即使确认分组丢失,发送方也不必重传
如果发送方窗口大小大于编号上限,会导致接收方无法分辨新旧数据分组
- SR 选择性重传
可靠数据传输机制及用途总结
机制 | 用途和说明 |
---|---|
检验和 | 用于检测在一个传输分组中的比特错误。 |
定时器 | 用于检测超时/重传一个分组,可能因为该分组(或其ACK)在信道中丢失了。由于当一个分组被时延但未丢失(过早超时),或当一个分组已被接收方收到但从接收方到发送方的ACK丢失时,可能产生超时事件,所以接收方可能会收到一个分组的多个冗余拷贝。 |
序号 | 用于为从发送方流向接收方的数据分组按顺序编号。所接收分组的序号间的空隙可使该接收方检测出丢失的分组。具有相同序号的分组可使接收方检测出一个分组的冗余拷贝。 |
确认 | 接收方用于告诉发送方一个分组或一组分组已被正确地接收到了。确认报文通常携带着被确认的分组或多个分组的序号。确认可以是逐个的或累积的,这取决于协议。 |
否定确认 | 接收方用于告诉发送方某个分组未被正确地接收。否定确认报文通常携带着未被正确接收的分组的序号。 |
窗口、流水线 | 发送方也许被限制仅发送那些序号落在一个指定范围内的分组。通过允许一次发送多个分组但未被确认,发送方的利用率可在停等操作模式的基础上得到增加。我们很快将会看到,窗口长度可根据接收方接收和缓存报文的能力或网络中的拥塞程度,或两者情况来进行设置。 |
是一种面向连接的协议,即数据传输之前要经过三次握手建立一条全双工连接,然后才能进行真正的数据传输
还提供可靠按序的字节流传输、流量控制、拥塞控制、面向字节流、全双工数据:同一个连接上的双向数据
面向字节流,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
- 在数据交换前握手
- 连接状态只在连接的两端中维护,在沿途节点中并不维护状态
- TCP连接包括:两台主机的缓存、连接状态变量、socket
序号字段-占4字节,TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号字段-占4字节,期望收到对方下一个报文段数据的第一个字节的序号
数据偏移(即首部长度)-占4位,指出TCP报文段的数据起始距离TCP报文段的起始处有多远。单位为32位字
紧急URG 为1表示高优先级、紧急数据
确认ACK 只有当ACK=1时确认号字段才有效
同步SYN =1 表示一个连接请求或连接接收报文
终止FIN 用来释放一个连接。FIN-1表示此报文段的发送端的数据已经发送完毕,要求释放运输链接
- UDP无连接、TCP面向连接
- UDP支持单播、多播和广播,TCP仅支持单播
- UDP是面向应用报文的,TCP是面向字节流的
- UDP向上层提供无连接不可靠传输服务,TCP向上层提供面向连接可靠传输服务
- UDP用户数据报首部只有8字节,TCP报文段首部最小20字节,最大60字节
如何估计RTT:
样本RTT:测量从报文段发送到收到确认的时间
样本RTT均值:
EstimatedRTT = (1 - α) x EstimatedRTT + α x sampleRTT(指数加权移动平均,α = 0.125)
设置超时
EstimatedRTT + 安全余量
样本偏离均值的估计:DevRTT = (1 - β) x DevRTT + β x |sampleRTT - EstimatedRTT| (β = 0.25)
设置超时时间间隔:
TimeoutInterval = EstimatedRTT + 4 x DevRTT
第一个样本RTT获得后,样本RTT均值 = 样本RTT,DevRTT=样本RTT/2
发送方数据发送过快,接收方来不及接收会造成数据的丢失
**流量控制:**就是让发送方的发送速率不要太快,要让接收方来得及接收
利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制
超时重传增加网络时延
三次冗余ACK时,在定时器超时之前重发丢失报文段
1、能为计算机网络通信提供加密防护服务的协议是( B )。
A、ARP B、SSL C、SMTP D、PPP
2、TCP是一个点对点的协议,协议双方连接的端点是应用进程端口号( √)
3、TCP报头中的确认号是指( A)
A、传输数据的第一个字节在缓冲区中的位置编号
B、期待接收的下一个字节的位置编号
C、已连续接收的最后一个字节在缓冲区中的位置编号
D、当前接收数据的序号
4、假定主机A通过TCP连接向主机B发送一个序号为20的20字节报文段后,那么主机A收到的确认号不可能是(B)
A、10 B、39 C、40 D、无法确定
5、主机甲和主机乙间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含300字节和500字节的有效载荷,第一个段的序列号为200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是 ( D)
A.500 B.700 C.800 D.1000
6、主机甲与主机乙之间已建立一个TCP连接,主机甲向主机乙发送了3个连续的TCP段,分别包含300字节、400字节和500字节的有效载荷,第3个段的序号为900。若主机乙仅正确接收到第1和第3个段,则主机乙发送给主机甲的确认序号是( B)
A.300 B.500 C.1200 D.1400
7、TCP什么时候对报文段采用快速重传? C
A、报文段的定时器过期 B、估计往返时延过长
C、收到之前发出的一个报文段的三个重复ACK D、以上都不是
8、网络上所抓到的TCP数据报文段中,有一个字段RcvWindow,其含义和作用为(A )
A、接收可用空间大小,用于流量控制 B、发送可用空间大小,用于流量控制
C、发送可用空间大小,用于拥塞控制 D、接收可用空间大小,用于拥塞控制
9、主机甲和主机乙之间已建立一个TCP连接,TCP最大段长度为1000字节,若主机甲的当前拥塞窗口为4000字节,在主机甲向主机乙连接发送2个最大段后,成功收到主机乙发送的第一段的确认段,确认段中通告的接收窗口大小为2000字节,则此时主机甲还可以向主机乙发送的最大字节数是( A )
A:1000 B:2000 C:3000 D:4000
10、主机甲向主机乙发送一个(SYN=1,seq=3210)的TCP段,期望与主机乙建立TCP连接,若主机乙接受该连接请求,则主机乙向主机甲发送的正确的TCP段可能是( C )
A.(SYN=0,ACK=0,seq=3211,ack=3211)
B.(SYN=1,ACK=1,seq=3210,ack=3210)
C.(SYN=1,ACK=1,seq=3211,ack=3211)
D.(SYN=0,ACK=0,seq=3210,ack=3210)
40:假设TCP Reno是一个经历如上所示行为的协议,回答下列问题。在各种情况中,简要地论证你的回答。
(1)指出TCP慢启动运行时的时间间隔。
[1,6] [23,26]
(2)指出TCP拥塞避免运行时的时间间隔。
[6,16] [17,23]
(3)在第16个传输轮回之后,报文段的丢失是根据3个冗余ACK还是根据超时检测岀来的?
冗余ACK,因为此时拥塞窗口大小为42,发生快速重传使得拥塞窗口变为/2+3得到24
(4)在第22个传输轮回之后,报文段的丢失是根据3个冗余ACK还是根据超时检测出来的?
超时,因为拥塞窗口置为1
(5)在第1个传输轮回里,ssthresh的初始值设置为多少?
32
(6)在第18个传输轮回里,ssthresh的值设置为多少?
21
(7)在第24个传输轮回里,ssthresh的值设置为多少?
14
(8)在哪个传输轮回内发送第70个报文段?
7
(9)假定在第26个传输轮回后,通过收到3个冗余ACK检测出有分组丢失,拥塞的窗口长度和 ssthresh的值应当是多少?
7,4
(10)假定使用TCP Tahoe (而不是TCP Reno),并假定在第16个传输轮回收到3个冗余ACK。在第19 个传输轮回,ssthresh和拥塞窗口长度是什么?
TCP Tahoe的冗余后,拥塞窗口大小变为1
17时刻的窗口大小为1,ssthresh为21
19个轮回,ssthresh=21,窗口大小为4
(11)再次假设使用TCP Tahoe,在第22个传输轮回有一个超时事件。从第17个传输轮回到第22个传 输轮回(包括这两个传输轮回),一共发送了多少分组?
ssthresh = 21
1 + 2 + 4 + 8 + 16 + 21 = 52