传输层协议称为端到端或进程到进程的协议。因特网的传输层可以为两个进程在不可靠的网络层上建立一条可靠的逻辑链路,为它们提供字节流传输服务,并且还具有流控制功能和拥塞控制功能。
因特网的传输层有两个协议:UDP和TCP。UDP协议提供不可靠的尽力服务,TCP协议提供可靠的字节流服务。
我们把传输层的数据单元(报文)称为数据段(segment)。
问:因特网传输层的主要协议为()和()。
答:UDP和TCP。
问:如果有效载荷为TCP,IP数据报的协议字段的值是什么?
答:6
UDP协议和TCP协议如何知道把收到的数据段交给哪个上层进程呢?
利用数据段(segment)中的目的端口号(2个字节)
端口号1000是哪种类型的端口?
A.well-known ports
B.registered ports
C.private ports
答案:A
用户数据报协议(User Datagram Protocol)只提供无连接的不可靠的尽力服务。发送给接收进程的数据有可能丢失,也有可能错序。
接收进程每次收到一个数据报,如果进程设置的接受缓冲区不够大,收到的数据报将被截断。
答案:BD。如果接收缓冲区不够大,收到的数据报将被截断。
问:下面哪个部分被加入到UDP数据段的校验和中?
A.UDP header(checksum filled with 0)
B.UDP data
C.Source IP address
D.Dest IP address
E.TTL(1B)and protocol(1B)
F.Header CheckSum(2B)in IP Header
G.0(1B)and protocol(1B) in IP Header
H.Length(2B)in IP datatgram
I.UDP Length(2B)
J.Iden in IP datatgram(2B)
K.flags(3b) and offset(13b) in IP datatgram
答:ABCDGI。包含UDP头,UDP数据,伪IP头中的源IP地址,目的IP地址,o和协议号,UDP的长度
TCP(Transmission Control Protocol)为进程之间提供面向连接的可靠的数据传送服务。
TCP为全双工协议。TCP提供流控制机制,即控制发送方得发送速度,使发送的数据不会淹没接收方。作为因特网的主要数据发源地,TCP还提供拥塞控制机制。
TCP连接只能在两个进程之间建立连接,经过互联网可能会丢失和错序。
TCP协议的数据传送服务采用哪种工作方式?
A.simplex
B.half duplex
C.full duplex
答案:C
一个TCP连接提供可靠的字节流服务。字节流服务表示没有消息边界。例如:多次发送的数据可以放在一个数据段中传送但是不标识边界。
每个数据段的数据部分的最大长度(字节)不能超过MSS(Maximum Segment Size)。
每个TCP连接可以由四元组唯一标识:源IP地址,源端口号,目的IP地址,目的端口号。
例:下图为一个普通TCP连接的数据传送图(不使用Nagle Algorithm,Delayed ACK,Fast Retransmission,Slow start等), 请填空.
分析:datasize为最大可传数据段大小,win为接收窗口可接收大小。
a | 9000 | 700 |
b | 9700 | 300 |
c | 9700 | 300 |
d | 10000 | 0 |
e | 10000 | 1000 |
f | 10000 | 700 |
g | 10700 | 300 |
h | 10700 | 300 |
i | 11000 | 0 |
问:长度分别为360字节、600字节、600字节和512字节的四个数据段通过一个TCP连接连续传送. 如果第一个数据段的序号为8000,其它数据段的序号是多少?
答:每个数据段的序号采用其数据部分第一个字节的编号。为8360、8960、9560.
问:TCP的紧急数据(urgent data)是带外数据,不属于字节流,true or false?
A.true
B.false
答案:A
*所有标志为1有效。
例:数据段中哪个标志可以令TCP协议把缓存数据立即发给接收进程?
A.ack
B.rst
C.psh
D.fin
答案:C。
问:如果TCP连接出现错误,TCP协议将发送标志 () 为1的数据段,并立即结束连接.
答案:rst
TCP协议的工作过程:
问:以下哪个TCP会话是非对称的(asymmetric)?
A.Establish connection
B.Transfer Data
C.Close Connection
答案:A。只有建立连接过程是非对称的,为客户向服务器呼叫。
问:建立TCP连接的三次握手使用的标志分别是什么?
答:SYN,SYN+ACK,ACK
例:请说明使用一次握手建立TCP连接会出现什么问题.
答:如果一次握手的话,也就是说客户端只要发送了连接请求就认为TCP连接。也许服务器根本就不存在或者没打开。如果继续发送数据的话,浪费带宽,再说客户端也需要服务器传来的初始序号和很多选项,这个都做不到。
例:请说明使用二次握手建立TCP连接会出现什么问题?(考虑恶意攻击的情况)
答:只有两次握手的话,服务器可能会因为遭遇恶意攻击而瘫痪,客户端可以发送大量伪造源地址的连接请求,服务器确认后以为连接已经建立,最后会耗尽资源,进而拒绝所有合法的连接请求,无法提供正常服务。(Dos攻击)
例:请说明使用三次握手建立TCP连接不能避免恶意攻击的情况。
答:即使使用三次握手,服务器也可能会因为遭遇恶意攻击而瘫痪,不过难度增加了很多。可能遭遇分布式的泛洪恶意攻击,黑客可以控制许多主机对一台服务器进行泛洪攻击,发送大量连接请求去请求服务器服务,耗尽服务器资源,使其无法为合法用户提供服务,从而使服务器瘫痪。(DDoS攻击)
问:发送FIN数据段的一方说明它不再发送任何数据了,true or false?
A.true
B.false
答:A。
例:主动发起关闭TCP连接的一方在关闭连接之前等待2MSL的原因是什么?
A.恢复连接.答案:D
如果发送方收到一个数据段的3次重复的ACK,它就认为其后的数据段(由确认号指出)已经丢失。
快速重传(fast retransmit):在超时定时到期之前重传该数据段。
例:对于快速重传(fast retransmission), 收到多少个对某个数据段序号的确认(表示期待接收该数据段)将触发数据的重传?
答:4个。重复收到3个,总共收到4个
采用延迟确认(delayed ACK)时,接收方并不在收到数据段立即进行确认,而是延迟一段时间再确认。如果这个期间收到多个数据段,则只需要发送一个确认。如果在这个期间接收方有数据帧要发往发送方,还可以使用捎带确认(piggybacking)。
大部分的系统的(Windows,Unix)的延迟确认时间为200ms。
选择性确认允许接收方把收到的数据块通过数据段的选项告知发送方,使发送方不会重传这些数据块。
初始公式:
Jacobson算法:
例:采用Jacobson算法计算TCP会话的超时时间,如果EstimatedRTT=10ms, DevRTT=1ms,SampledRTT=20ms, 问:新的DevRTT、EstimatedRTT和TimeoutInteval分别为多少毫秒?
解:利用公式,DevRTT:3.25,EstimatedRTT:10+1/8*10=11.25,Timeoutinterval:11.25+4*13/4=24.25.
Karn算法:
例:如果一个TCP数据段的传送在超时时间(30ms)内未收到确认, 重传数据段的超时时间应该设为多少毫秒?
解析:60
简单来说:“太多的主机发送太快太多的数据给网络处理”。这不同于流控制。
表现:
拥塞控制(Congestion Control)的两大类方法:
端到端的拥塞控制:
网络辅助的拥塞控制:
发送速率 rate=SWS(Sending Window Size)/RTT
SWS = Min(CongWin,AdvWin) (AdvWin为接收窗口大小)
加性增(additive increase):每个RTTCongWin增加1MSS,直到丢包
乘性减(multiplicative decrease):在丢包后CongWin减半
问:如果AIMD(Additive Increase Multiplicative Decrease)用于TCP连接的拥塞控制,当发生拥塞时, CongWin=10MSS, 它的新的CongWin是多少? 在4个RTT之后, 它的CongWin又是多少?
答:5MSS,9MSS。
*SegSize为被确认的数据段的大小
*假设算法开始通知窗口大小AdvWin=65535
在慢启动阶段,以指数式递增,当达到阈值时,以线性方式递增,每次增加1,如果连续收到3个重复确认,快速重传,之后TCP返回慢启动状态。
Tahoe不存在快速恢复算法。这也是它的不足之处。在收到3个重复ACK或者在超时的情况下,Tahoe置cwnd为1,然后进入慢启动阶段。这一方面会引起网络的激烈震荡,另一方面大大降低了网络的利用率。
也就是说,一旦发现掉包,那么cwnd就被打回原形。
没有快速恢复算法,在恢复丢失数据包期间,不能发送新的数据包,这段时间的吞吐量为0。而实际上如果利用这段时间来发送适量的新数据包,可以大大的提高丢包时的传输效率。这就是快速恢复名称的由来。
例:假设Tahoe算法被用于TCP连接的拥塞控制, 当超时发生时, CongWin等于16MSS, 如果期间没有发生超时,在5个RTT之后CongWin是多少?
答:拥塞发生时,阈值变为8MSS,所以为:2mss,4mss,8mss,9mss,10mss.结果为10mss。
Reno与Tahoe相比,增加了快速恢复阶段,也就是说,完成快速重传后,进入了拥塞避免阶段而不是慢启动阶段。
在快速恢复阶段,每收到重复的ACK,则cwnd加1;收到非重复ACK时,置cwnd = ssthresh,转入拥塞避免阶段;如果发生超时重传,则置ssthresh为当前cwnd的一半,cwnd = 1,重新进入慢启动阶段。
Reno快速恢复阶段退出条件:收到非重复ACK。
例:假设Reno算法(快速恢复算法)被用于TCP连接的拥塞控制, 当收到三个重复的ACK时,CongWin等于16MSS, 如果期间没有发生超时,在5个RTT之后CongWin是多少?
答:13MSS,收到非重复ACK,置cwnd=ssthresh,转入拥塞避免阶段,9mss,10mss,11mss,12mss,13mss。
一个连接的时延带宽积可表示为:capacity(b)=bandwidth(b/s)×round-triptime(s),用于表示通道的容量,也可称它为两端的管道大小。
具有大的带宽时延乘积的网络被称为长肥网络(Long Fat Network,即LFN),而一个运行在LFN上的TCP连接被称为长肥管道。
在一个窗口内发生如果只有一个报文丢失,丢包发生时,由于SWS的限制,管道将会被清空。 使用快速重传和快速恢复算法可以使管道避免耗尽。
D.timestamp
答:D,时间戳。
当发送窗口为0时,如果取空接收缓冲区之后发送的确认丢失,就会发生死锁。因为发送窗口未收到确认,所以继续为0,无法发送,但是接收方已经无法发回确认了,所以就产生了死锁。
解决方法:
在发送窗口为0之后, 发送方如果有数据要发送,则启动坚持定时器(Persist Timer),定期从要发送的数据中取一个字节发送出去(Window Probe),直到收到不为0的通知窗口为止。
例:假设一个TCP连接的接收缓冲区大小为4600字节,如果该连接的一个AdvWin为( ) 的确认到达后,紧接着AdvWin为 ( ) 的另一个确认丢失了,该连接会发生死锁现象。
答:0,4600.
如何解决本题的死锁问题:
答:当发送方有数据要发送时定期发送一个字节给接收方。
Nagle算法——启发式算法:
(1) 立即发送一个数据段,即使发送缓冲区只有一个字节。
(2) 只有收到上一个数据段的确认或者发送缓冲区中数据超过MSS,才可以发送下一个数据段。
(3) 对于即时性要求高的地方,如, Window方式的鼠标操作,要关闭Nagle算法。
例:在建立TCP连接, 发送方收到接收方的参数“MSS=500, Sequ#=10000, Win=1000”之后, 发送方每10毫秒发送两个字节. 如果使用Nagle算法并且RTT等于 42ms, 问该发送方发送前三个数据段的有效载荷分别有多少字节?
解析:主要两个原则:1.立即发送一个数据段2.收到上一个数据段的确认才发送下一个数据段
第一个数据段立即发送前两个字节,然后到42ms之间累计了8个字节,在42ms收到确认时一并发送,在42ms到84ms之间累计8个字节,并在84ms确认到达时一并发送。所以为:2 8 8.
情形2:接收进程频繁取走小批量数据:
Clark算法:当接收缓冲区的空闲块大小变得很小时,要等到空闲块大小为缓冲区大小的一半或达到MSS时才发送确认。
例:一个TCP连接的接收缓冲区大小为2000, 接收方提出的MSS为500。如果使用了Clark算法,在发送了AdvWin=0的确认之后,接收方空闲块的大小为多少字节时才发送下一个确认?
解析:空闲块达到缓冲区一半或MSS时才发送确认,所以至少达到500。
每个连接只针对第一个未确认数据段启动重传定时器(retransmission timer)。所有数据段都已确认,则关闭它。超时重传或发送窗口移动时要重启该定时器。
持续定时器(persist timer)用于保持窗口大小信息流动即使连接的另一端关闭了接收窗口。
保活定时器(keepalive timer)在长时间没有交换数据段之后,用于检测连接的另一端是否出了问题。
处于TIME_WAIT 状态的连接一方需要等待2MSL秒,时间到才能关闭连接。