教材:计算机网络——自顶向下方法(第七版) 作者:James F. Kurose, Keith W. Ross
内容0-2在复述书6.7节
协议分层
应用层
运输层:运输层在应用程序端点之间传送应用层报文。运输层协议提供了逻辑通信。
网络层:将数据包从一台主机移到另一台主机。
链路层:从一个节点移向另一个节点。
物理层
0. 数据的获得
以访问网站为例。
现在Bob(人在美国)要访问www.google.com这个网站!
他所需要的是:他自己的IP地址、google的IP地址
在获取的过程中,他还要用到:DNS服务器地址(以获取目的IP)、本地网关的IP地址、本地网关的MAC地址
具体获取方法见第4部分内容。
1. 报文的加工
总之Bob现在获取了他的IP地址和google的IP地址!他现在要通过套接字发送一个GET请求了。
首先,和google建立一个TCP连接。然后逐层封装,发送这么一个东西:
(4. 帧(3. IP报文(2. TCP报文(1. HTTP报文))))
具体展开如下:
2. 传输的去向
手机——交换机——网关路由器——路由器——...——路由器——服务器
3.1 连接的建立
1. UDP
由[RFC 768]定义的UDP只是做了运输协议能够做的最少工作。换言之,它(对写程序的人)更可控,开销更少。
多路复用与多路分解
无连接的多路复用与多路分解很简单,一个UDP套接字是由二元组(目的IP地址,目的端口号)定义的;只要检测目的端口号就可以找到对应的套接字了。也就是说,拥有相同目的端口的所有数据会被塞进一个套接字,不区别来源。
UDP检验和
把所有字相加,如有溢出,末位+1,取反码。
2. TCP
前置推导:可靠数据传输原理
多路复用与多路分解
TCP套接字由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)定义。两个具有不同来源将被导向两个不同的套接字。
TCP报文段结构
1. 序号和确认号:假设数据流由一个50000字节的文件组成,MSS(Maximum Segment Size)为1000,那么第1个报文段序号可以是0,第二个序号是1000,以此类推;确认号是期望从对方收到的下一个字节的序号。
往返时间的估计
在可靠数据传输原理中提到了往返时间(RTT),现在来估计它。
EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT
α通常取0.125
估算RTT偏差:
DevRTT = (1 - β) * DevRTT + β * | SampleRTT - EstimatedRTT |
β的推荐值为0.25
重传间隔:
TimeoutInterval = EstimatedRTT + 4 * DevRTT
TCP连接
三次握手:
1. 客户发一条SYN标识为1,随机初始序号(假设为a)的报文段给服务器主机;
2. 服务器分配缓存和变量,发一条SYN标识为1,选择一个服务器初始序号(假设为b),确认号字段为a+1的报文段给客户;
3. 客户分配缓存和变量,发一条SYN标识为0(连接已经建立了),序号为a+1,确认号为b+1的报文段给服务器。
为什么要三次挥手:经过三次才能确认双方都处于可传输状态。类似:你好。是你吗?是的。
四次挥手:
服务器:FIN;客户:ACK;
客户:FIN;服务器:ACK。
TCP传输
TCP推荐只使用单一定时器。定时器超时,重传序号最小的没有应答的报文段并重启定时器;收到ACK,如果窗口内仍有未应答报文段,重启定时器。
如果发送方收到3个冗余ACK,则执行快速重传,重发重传序号最小的没有应答的报文段。
流量控制
如果发送方发数据太快,那接收方的缓存很可能溢出。发送方通过维护一个接收窗口,即获知接收方还有多少可用的缓存空间,来实现流量控制。
拥塞控制
网络拥堵,路由器缓存溢出,容易丢包,需要进行拥塞控制。
TCP拥塞控制算法
拥塞窗口:cwnd
1. 慢启动:cwnd=MSS,每有一个报文段被首次确认就翻倍;如果丢包,设置ssthresh为cwnd/2,并将cwnd重新设置为1;当cwnd达到或超过ssthresh,则进入拥塞避免模式;如果检测到3个冗余ACK,则进入快速恢复模式。
2. 拥塞避免:每过一个RTT将cwnd增加一个MSS*(MSS/cwnd);如果丢包,和慢启动操作相同,并进入慢启动;检测到3个冗余ACK时,ssrhresh=cwnd/2,cwnd=cwnd/2+3MSS,并进入快速恢复。
3. 快速恢复:每收到一个冗余ACK,cwnd+=MSS;超时进入慢启动,有新的ACK进入拥塞避免。
TCP的评估
令拥塞窗口长度是W,则一条连接的评价吞吐量为0.75*W/RTT
令丢包率为L,则一条连接的平均吞吐量为1.22*MSS/(RTT*√L)
3.2 机器的功能
3.1 DNS服务器(2.4)
递归查询和迭代查询;
递归查询:根服务器访问子服务器
迭代查询:根服务器返回结果给本地服务器,本地服务器自己再去查。
DNS缓存;
3.2 交换机(6.4.3)
过滤与转发
过滤是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。
转发是决定一个帧应该被导向哪个接口并把它移动过去的功能。
交换机表:
当一个目的地址从接口x来了后,有3种情况:
1. 表中没有目的MAC:向除了x的接口广播
2. 对应接口等于x:过滤
3. 对应接口不等于x:转发
自学习
当一个帧从x接口到达时,交换机就会很聪明地存储该帧的MAC地址和它来的接口:能从这个接口来,意味着通过这个接口可以到达它。
3.3 路由器
路由器工作原理(4.2)
输入端口——交换结构——输出端口
转发表(最长前缀匹配规则)
有了转发表,看看怎么查表。假设有3个输入端口和3个输出端口。
1. 经内存交换:一次只能执行一个读/写,不能同时转发两个分组;
2. 经总线交换:一次只能有一个分组跨越总线,分组可以被所有输出端口收到,但只有匹配的端口才能保存;
3. 经互联网络交换:两个不同输入端口到两个不同输出端口可以同时进行,但输出端口相同必须等待。
路由选择算法(5.2)
现在来生成转发表。
路由选择算法有两种,集中式和分散式。集中式就是我们正常学的dijkstra,分散式用Bellman-Ford方程迭代。
分散式由于只记录两点间值,不记录路径,因此会发生选择环路导致的无穷计数问题。添加毒性逆转可以缓解这一现象,但当环路超过3条边时失效。
AS(Autonomous System)内部路由选择:OSPF(5.3)
一台路由器存储整个系统的完整图,于是其他路由器可以跑dijkstra算法。
ISP(Internet Service Provider)之间路由选择:BGP(5.4)
在BGP中,每对路由器通过使用179端口的半永久TCP连接交换路由选择信息。跨越AS的BGP连接称为eBGP,反之称为iBGP。
BGP的两个重要参数是AS-PATH和NEXT-HOP,AS-PATH记录已经通过的AS列表,防止环路;如果一台路由器在其中看到了自己的AS,那么它将拒绝通告。NEXT-HOP是下一跳路由器接口的IP。
热土豆路由选择:从所有NEXT-HOP里选择开销最低的那个。
3.4 分组交换机与SDN
SDN(Software Defined Network)
4. 问题的解决
4.1 获取DNS服务器、本地网关IP、本机IP(4.3.3)
运行DHCP协议
手机生成DHCP请求报文(帧:目的地址FF:FF:FF:FF:FF:FF,源MAC即为本机MAC(IP:广播IP,目的地址255.255.255.255,源地址0.0.0.0(UDP:目的端口67,源端口68)))—— 交换机——[广播]——路由器(DHCP服务器运行在路由器)[分解IP数据报,发现应当由节点高层协议处理,分解UDP报文段,发现DHCP请求][以CIDR分配地址][生成返回报文]——交换机——路由器——手机
4.2 查询DNS服务器(2.4)
手机生成DNS查询报文(帧:目的MAC???(IP(UDP)))
现在查询一下网关路由器MAC地址:运行ARP协议
4.3 获取本地网关MAC地址(6.4.1)
手机生成ARP查询报文(帧:广播目的地址FF:FF:FF:FF:FF:FF)—— 交换机——[广播]——网关路由器[发现报文目标IP地址匹配自己的接口地址][有人在询问我耶][准备ARP回答]——交换机——手机
每台主机或路由器在内存中都有一个ARP表,包含IP和MAC的映射关系和过期时间:
IP地址 | MAC地址 | TTL
4.4 多路复用和多路分解
将主机间交付扩展到进程间交付被称为运输层的多路复用和多路分解。也就是说,一台主机有好多进程,主机如何把送来的数据交付给正确的进程,进程如何将数据通过主机传输出去。
4.5 可靠数据传输原理
1. 经完全可靠信道的可靠数据传输:rdt1.0
假设情景:底层信道完全可靠
发送方:发送数据
接收方:接收数据
看起来有点弱智,因为可靠的信道不会丢失数据,也不需要什么复杂操作。
2. 经过有比特差错信道的可靠数据传输:rdt2.0
假设情景:分组虽然可能受损,但还能按被发送的顺序接收。接收方可以通过差错检测判断分组是否受损,如受损返回NAK,未受损返回ACK,且ACK或NAK不受损。
发送方:发送数据;等待ACK/NAK:NAK则重发
接收方:受损返回NAK,未受损返回ACK
3. rdt2.0的修正版本:rdt2.1
rdt2.0的问题:ACK或NAK受损,导致重传出现冗余分组,接收方不能分辨是新来的分组还是重传的分组。
解决方案:给分组加个序号吧!既然只需要区别新来的和重传的,那么1bit就足够了。
发送方:发送0;等待ACK0/NAK0:NAK则重发;收到ACK0,发送1;等待ACK1/NAK1:NAK则重发;
接收方:收到受损分组(返回NAK) 或 收到分组1(返回ACK):等待0;收到正确分组:等待1;等待1时和等待0对称,略;
4. 无NAK的可靠传输协议:rdt2.2
和rdt2.1的区别:可以想到,返回ACK0对想接受1的接收方来说就是NAK。所以可以不要NAK了。
5. 经有比特差错的丢包信道的可靠数据传输:rdt3.0
假设情景:不仅分组会受损,还会丢失。
问题:可以假设接收方在一个往返时延内没有接收到分组即认定丢失,让发送方重传。但有时候分组经历了很大的时延,最终还是到了接收方,这时接收方就会收到冗余分组。幸运的是,我们已经处理过冗余分组了。
发送方:总之就是时间到了就重传;同时由于时间到了总会重传,所以收到不对的ACK或者丢包了也不用管,等着重传就行。
接收方:没啥变化
可喜可贺,至此我们得到了一个可靠数据传输协议!
6. 流水线可靠数据传输协议
人是贪心的,得到了可靠数据传输协议就会嫌它传得不够快。可以看到,上面发送分组是一个一个发的,上一个被确认收到才会发下一个。那么,是否可以选择流水线发送呢(就像CPU五级流水那样),即,在没有收到上一条确认的时候,就把下一条发出去。
问题与解决方案:
接收方会接收到很多个分组,有好几个新来的,还有好几个重传的,0和1不够用了,需要增加序号;
在被确认或倒计时结束前发送方无法知道是否需要重传,因此需要缓存已发送但未确认的分组;接收方可能也要缓存一下正确接收的分组。
方案一:回退N步(GBN)
来了,滑动窗口,虽然和区间最值一点关系都没有。
发送方:将要传输的包排成一列,打开计时器,一口气发送N个分组。倒计时结束,则重发窗口内所有发过的分组;如果收到ACK x,令base=x+1并重启定时器;
接收方:GBN对分组n的确认为累积确认,即只有在1~n-1的分组都收到后才会确认n。
方案二:选择重传(SR)
可以看到GBN会重传很多没必要的分组,故选择重传只重传它认为丢失或受损的分组。这里要求接收方缓存失序的分组,直到所有序号更小的分组都被收到为止。
考虑维护发送方和接收方的窗口。
发送方:收到ACK,如果在窗口内,标记为收到;如果序号等于base,则滑动到序号最小的没有被接收的分组处;每个分组有自己的定时器,到点重传。
接收方:对于序号在窗口内的分组,如果收到没有收到过的分组,缓存;如果收到分组的序号等于base,窗口向前移动到序号最小的未被接收的分组。对于序号在[base-N, base-1]的分组,返回ACK。
4.6 拥塞控制原理(3.6)
考不到这么细先不学了要学不完了wc考试周破防.avi
4.7 差错检测和纠正技术
1. 奇偶校验
记录1的个数是奇数还是偶数。可以检测出现奇数个比特的差错。
2. 二维奇偶校验
对每行每列都进行奇偶校验。可以检测并纠正单个比特差错。可以检查但不能纠正2个比特差错。
3. 检验和
4. 循环冗余检测
在数据后面加r位,使得其刚好称为一个规定好二进制数G的倍数。检测方法为做除法,除法竖式运算,运算方法为做异或,能除尽即没有差错。
4.8 多路访问链路和协议
研究一下多个发送方和接收方共享广播信道时碰撞的问题。
1. 信道划分协议
2. 随机接入协议
时隙ALOHA
将时间分为若干个时隙,每个时隙为传输一帧的时间。只在时隙开始时传输。碰撞后重发。
ALOHA
不分时隙,碰撞后等待一段时间后重发。
CSMA
监听一段时间,没有节点在传输了再发送。如果有节点在传输,随机等待一段时间。
CSMA/CD
在CSMA的基础上,如果检测到碰撞,停止传输,并等待一段时间。
在帧经历了n次碰撞后,从{0,1,2,...,2n-1}中选择一个值等待。
其效率为:1/(1+5dprop/dtrans)
3. 轮流协议
轮询每个节点要不要发送
或
传递令牌,有帧发送时持有令牌,否则传递。