前言:两台主机的通信,实际上两台主机中的应用进程进行通信,而在一台计算机中,用不同的端口号标识不同的应用进程。本节将介绍传输层的相关内容,包括端口号的分配方法、端口号的复用与分用、以及传输层的典型协议TCP与UDP。
计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。
但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程。
如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务,运输层协议又称为端到端协议。
根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP。
16
比特表示,取值范围0~65535
;
0~1023
,IANA把这些端口号指派给了TCP/IP体系中最重要的一些应用协议,例如:FTP
使用21/20
,HTTP
使用80
,DNS
使用53
。1024~49151
,为没有熟知端口号的应用程序使用。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。例如:Microsoft RDP微软远程桌面使用的端口是3389。49152~65535
,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。一般来说,我们希望数据传输能快一些,但如果发送方把数据发送得过快,接收方就可能来不及接收,这会造成数据的丢失。
流量控制(flow control)定义:让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口实现流量控制
1
字节零窗口探测报文(即使窗口为0
也可接收)。【2010年题39】主机甲和主机乙之间建立了一个TCP连接,TCP最大段长度为1000字节。若主机甲的当前拥塞窗口为4000字节,在主机甲向主机乙连续发送两个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的接收窗口大小为2000字节,则此时主机甲还可以向主机乙发送的最大字节数是( )
A.1000
B.2000
C.3000
D.4000
【解析】TCP发送方的发送窗口= min[ 自身拥塞窗口,TCP接收方的接收窗口 ]
题目未给出TCP发送方的发送窗口的初始值,则取拥塞窗口值作为发送窗口值
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞(congestion)。
在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
拥塞控制主要是四个算法:慢启动(慢开始slow-start)、拥塞避免(congestion avoidance)、快速重传(快重传fast retransmit)、快速恢复(快恢复fast recovery)
下面介绍这四种拥塞控制算法的基本原理,假定如下条件:
发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化。
发送方将拥塞窗口作为发送窗口swnd,即swnd = cwnd
。
维护一个叫慢启动门限 ssthresh
(slow start threshold)状态变量
cwnd < ssthresh
时,使用慢启动算法。cwnd > ssthresh
时,就会使用拥塞避免算法。cwnd = ssthresh
时,既可使用慢启动算法,也可使用拥塞避免算法。TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量。
慢启动的算法记住一个规则就行:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1
。
这里假定拥塞窗口 cwnd 和发送窗口 swnd 相等,下面举个例子:
可以看出慢启动算法,发包的个数是指数性的增长。
假定 ssthresh = 8
,此时改用拥塞避免算法。
规则:每当收到一个 ACK 时,cwnd 线性+1
。
当重传计时器超时,判断网络很可能出现了拥塞,触发超时重传
当发生了超时重传,则就会使用拥塞发生算法
此时sshresh
和 cwnd
的值会发生变化:
ssthresh
设为发生拥塞时cwnd
值的一半cwnd
重置为 1
,并重新开始慢开始算法接着,就重新开始慢启动,慢启动是会突然减少数据流的,这种方式太激进了,反应也很强烈,会造成网络卡顿。
参考链接: TCP 重传、滑动窗口、流量控制、拥塞控制
后来的“快速恢复”算法是在上述的“快速重传”算法后添加的,当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。
当收到3
个连续重复的ACK,则进入快速恢复算法,如下:
cwnd = cwnd/2
;ssthresh = cwnd
;cwnd = ssthresh
(有的版本是cwnd = ssthresh + 3
,+ 3
的意思是确认有 3 个数据包被收到了)cwnd + 1
;cwnd = ssthresh
,接着就进入了拥塞避免算法注:
【2009年题39】一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为16KB时发生了超时,如果接下来的4个RTT(往返时间)内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口大小是()
A.7KB
B.8KB
C.9KB
D.16KB
正常情况下,超时重传时间应该设为略大于往返时间。但是由于各区域的速率可能不一致,因此将超时重传时间设置为一个固定值是行不通的。
利用每次测量得到的RTT
样本,计算加权平均往返时间 R T T S RTT_S RTTS(平滑的往返时间)。
显然,超时重传时间RTO
应略大于加权平均往返时间 R T T S RTT_S RTTS。
RFC6298建议使用下式计算超时重传时间RTO:
R T O = R T T S + 4 × R T T D R T O=R T T_{S}+4 \times R T T_{D} RTO=RTTS+4×RTTD
加权平均往返时间 R T T s RTT_s RTTs:
R T T S 1 = R T T l R T T_{S1}=R T T_{l} RTTS1=RTTl
新的 R T T S = ( 1 − α ) × 旧的 R T T S + α × R T T_{S}=(1-\alpha) \times \text { 旧的 } R T T_{S}+\alpha \times RTTS=(1−α)× 旧的 RTTS+α×新的RTT样本
0 ≤ α < 1 0 \leq \alpha<1 0≤α<1
已成为建议标准的RFC6298推荐的 α \alpha α值为1/8,即0.125。
RTT偏差的加权平均 R T T D RTT_D RTTD:
R T T D 1 = R T T 1 ÷ 2 R T T_{D1}=R T T_{1} \div 2 RTTD1=RTT1÷2
新的 R T T D = ( 1 − β ) × 旧的 R T T D + β × ∣ R T T S − 新的 R T T 样本 ∣ R T T_{D}=(1-\beta) \times \text { 旧的 } R T T_{D} +\beta \times \mid R T T_{S}-\text { 新的 } R T T \text { 样本 } \mid RTTD=(1−β)× 旧的 RTTD+β×∣RTTS− 新的 RTT 样本 ∣
0 ≤ β < 1 0 \leq \beta<1 0≤β<1
已成为建议标准的RFC6298推荐的 β \beta β值为1/4,即0.25。
针对出现超时重传时无法测准往返时间RTT的问题,Karn提出了一个算法:在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。也就是出现重传时,不重新计算RTTs,进而超时重传时间RTO也不会重新计算。
这又引起了新的问题。设想出现这样的情况:报文段的时延突然增大了很多,并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。但根据Karn算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。这会导致报文段反复被重传。
因此,要对Karn算法进行修正。方法是:报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是将新RTO的值取为旧RTO值的2倍。
TCP基于以字节为单位的滑动窗口来实现可靠传输。
0.5
秒。若收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认[RFC 1122]。TCP的连接建立要解决以下三个问题:
一开始。TCP服务器进程与客户进程都首先创建传输控制块,用来存储TCP连接中的一些重要信息。例如TCP连接表、指向发送和接收缓存的指针、指向重传队列的指针、当前的发送和接收序号等。
SYN=1
:表明这是一个TCP连接请求报文段。seq=x
:TCP客户进程所选择的初始序号。SYN=1
,ACK=1
:表明这是一个TCP连接请求确认报文段。seq=y
:作为TCP服务器进程选择的初始序号。ack=x+1
:这是对TCP客户进程选择的初始序号的确认。ACK=1
:表明这是一个普通的TCP确认报文段。seq=x+1
,这是因为TCP客户进程发送的第一个TCP报文段的序号为x。(发送的下一份TCP报文序号仍然是x+1)ack=y
,这是对TCP服务器进程选择的初始序号的确认。注意:
SYN=1
的报文段不能携带数据,但要消耗掉一个序号。Q:为什么TCP客户进程最后还要发送普通的TCP确认报文段呢?是否多余?
A:不多余,这是为了防止已失效的连接请求报文段突然又传送到了TCP服务器,因而导致错误。
FIN
、确认位ACK
设置为1:表明这是一个TCP连接释放报文段,同时也是对之前接收数据的确认。seq=u
:等于TCP客户进程之前已传送过的数据的最后一个字节的序号加1。ack=v
:等于TCP客户进程之前已收到的数据的最后一个字节的序号加1。ACK=1
:表明这是一个普通的TCP确认报文段。seq=v
,等于TCP客户进程之前已收到的数据的最后一个字节的序号加1。(发送的下一份TCP报文序号仍然是v)ack=u+1
,这是对TCP连接释放报文段的确认。FIN=1
,ACK=1
:表明这是—个TCP连接释放报文段,同时也对之前收到的报文段进行确认。seq=w
:在半关闭状态下,TCP进程可能发送一些数据,导致序列号增加;如果没有发送数据则w=v
ack=u+1
:这是对之前收到的TCP连接释放报文段的重复确认。ACK=1
:表明这是一个普通的TCP确认报文段。seq=u+1
,等于TCP客户进程之前已收到的数据的最后一个字节的序号加1。ack=w+1
,这是对TCP连接释放报文段的确认。注意:TCP规定终止位FIN=1
的报文段即使不携带数据,也要消耗掉一个序号。
MSL(Maximum Segment Lifetime)意思是最长报文段寿命,RFC793建议为2
分钟。
Q:TIME-WAIT时间等待有必要等待吗?
A:时间等待是为了避免以下这种情况:
保活计时器:
TCP服务器进程每收到一次TCP客户进程的数据,就重新设置并启动保活计时器(2小时定时)。
若保活计时器定时周期内未收到TCP客户进程发来的数据,则当保活计时器到时后,TCP服务器进程就向TCP客户进程发送一个探测报文段,以后则每隔75秒发送一次。若一连发送10个探测报文段后仍无TCP客户进程的响应,TCP服务器进程就认为TCP客户进程所在主机出了故障,接着就关闭这个连接。
16
比特,写入源端口号,用来标识发送该TCP报文段的应用进程16
比特,写入目的端口号,用来标识接收该TCP报文段的应用进程32
比特,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,232−1],序号增加到最后一个后,下一个序号就又回到0
。作用是指出本TCP报文段数据载荷的第一个字节的序号1
时确认号字段才有效,为0
时确认号字段无效
1
。32
比特,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,232−1],序号增加到最后一个后,下一个序号就又回到0
。可理解为若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据4
比特,并以4
字节为单位
20
字节,因此数据偏移字段的最小值 ( 0101 ) 2 (0101)_2 (0101)2 ;首部最大长度为60
字节,因此数据偏移字段最大值为 ( 1111 ) 2 (1111)_2 (1111)26
比特,保留为今后使用,但是目前应置为016
比特,以字节为单位。指出发送本报文段一方的接收窗口。
16
比特,检测范围包括TCP报文段的首部和数据载荷两部分
12
字节的伪首部RST=1
时,表明TCP连接出现了异常,必须释放连接,然后再重新建立连接;RST置1
还用来拒绝一个非法的报文段或拒绝打开一个TCP连接1
的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付1
时紧急指针字段有效;取值为0
时紧急指针字段无效。16
比特,以字节为单位,用来指明紧急数据的长度
RTT
PAWS
4
整除【2017 题39】若甲向乙发起一个TCP连接,最大段长MSS=1KB,RTT=5ms,乙开辟的接收缓存为64KB,则甲从连接建立成功至发送窗口达到32KB,需经过的时间至少是
A、25ms
B、30ms
C、160ms
D、165ms
【2020年 题38】若主机甲与主机乙已建立一条TCP连接,最大段长MSS为1KB,往返时间RTT为2ms,则在不出现拥塞的前提下,拥塞窗口从8KB增长到20KB所需的最长时间是
A、4ms
B、8ms
C、24ms
D、48ms
【单选题】在一个TCP连接中,MSS为1KB,当拥塞窗口为28KB时发生了超时事件。如果在接下来的3个RTT内报文段传输都是成功的,那么当这些报文段均得到确认后,拥塞窗口的大小是
A、4
B、8
C、9
D、16
【单选题】A和B之间建立了TCP连接,A向B发送了一个报文段,其中序号字段seq=200,确认号字段ack=201,数据部分有2个字节,那么在B对该报文段的确认段中( )
A、seq=202, ack=200
B、seq=201, ack=201
C、seq=201, ack=202
D、seq=202, ack=201
答案:
1.A(解析: 视频讲解) 2.C(解析:视频讲解)
3.B(解析:当发生超时事件时,TCP拥塞算法变成慢开始,并且发送窗口swnd更新为1,慢开始门限ssthresh更新为28KB/2=14KB。
第1个RTT结束后,发送窗口swnd增长到2;
第2个RTT结束后,发送窗口swnd增长到4;
第3个RTT结束后,发送窗口swnd增长到8。)
4.C(解析:seqB = ackA ackB = ackA + 1)
OK,以上就是本期知识“运输层”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟~
如果有错误❌,欢迎批评指正呀~让我们一起相互进步
如果觉得收获满满,可以点点赞支持一下哟~
❗ 转载请注明出处
作者:HinsCoder
博客链接: 作者博客主页