协议森林学习笔记(四)

四、传输层协议

1. UDP协议:可以将UDP协议看作IP协议暴露在传输层的一个接口,他实现了端口从而让数据包可以在送到IP地址的基础上,进一步可以送到某个端口。UDP是传输层协议,这意味着UDP的数据包需要经过IP协议的封装,然后通过IP协议传输到目的电脑。随后UDP包在目的电脑拆封,并将信息送到相应端口的缓存中。

    1.1     端口是伴随着传输层诞生的概念。它可以将网络层的IP通信分送到各个通信通道。UDP协议和TCP协议尽管在工作方式上有很大的不同,但它们都建立了从一个端口到另一个端口的通信。

    1.2     UDP的数据包同样分为头部和数据两部分。source port和destination port分别为UDP包的出发端口和目的地端口。Length为整个UDP包的长度。UDP的checksum所校验的序列包括了整个UDP数据包,以及封装的IP头部的一些信息(主要为出发地IP和目的地IP)。这样,checksum就可以校验IP:端口的正确性了。

2. TCP协议的”流”通信:TCP协议虚拟了文本流的通信(计算机数据的本质是有序的0/1序列,如果以byte为单位,就叫文本流,计算机的功能就是储存和处理文本流),TCP协议确保了数据到达的顺序与文本流顺序相符。

    2.1     TCP协议封装到IP包的不是整个文本流,而是片段。一个TCP片段同样分为头部和数据。

    2.1.1.     头部包含出发端口和目的端口;该片段的序号;一位(bit)的ACK,只有ACK位设定的时候,回复号才有效;各占据一位(bit)的SYN和FIN。

    2.1.2.     而整个文本流按照次序被分为小段,每一段被放入TCP片段的数据部分。一个TCP片段封装成的IP包不超过整个IP接力路径的最小MTU( 最大传输单元,指一种通信协议的某一层上面能通过的最大数据报大小,以字节为单位。)避免碎片化。

    2.2     给文本流分段是在发送主机完成的,而碎片化是在网络中的路由器完成的。路由器要处理许多通信,所以相当繁忙。文本流提前在发送主机分好段,避免在路由器上执行碎片化,可大大减小网络负担。

    2.3     ACK:每收到一个正确的符合次序的片段,就向发送方发送一个特殊的TCP片段(ACK回复)用来知会发送方。如果一个片段序号为L,对应的ACK回复有回复号L+1。

    2.4     滑窗:上面所述,发送方保持发送 -> 等待ACK -> 发送 -> 等待ACK……的单线工作方式,牺牲网络通信的效率实现通信的可靠性,在等待ACK得时间段内,网络都处于闲置状态。为此,想出方法,利用缓存保留一些“不那么乱”的片段,期望能在段时间内补充上之前的片段(暂不处理,但发送相应的ACK);对于“乱”的比较厉害的片段,则将它们拒绝(不处理,也不发送对应的ACK)。

    2.4.1.     滑窗被同时应用于接收方和发送方以解决上述问题,当片段位于滑窗中时,表示TCP正在处理该片段,滑窗中可以同时处理多个片段,滑窗越大,同时处理的片段数目越多,计算机也分配更多的缓存供滑窗使用 (滑窗是以byte为单位表示大小) 。

    2.4.2.     假设一个可容纳三个片段的滑窗,片段从左向右排列。

        对于发送方来说,滑窗左侧是已发送并已ACK过的片段序列,滑窗右侧是尚未发送的片段序列。

        滑窗中的片段(如5,6,7)被发送出去并等待相应的ACK,如果收到片段5的ACK,滑窗向右移动,这样新的片段从右侧进入滑窗内,被发送出去,并进入等待状态。在接收到片段5的ACK之前即使已经收到了6,7的ACK,滑窗不会移动。这保证滑窗左侧的序列是已发送的,接收到ACK的,符合顺序的。

    2.4.3.     对于接收方来说,滑窗左侧是已正确收到并已ACK回复过的片段序列(如1,2,3,4),也就是正确接收到的文本流,滑窗内是期望接收的片段(如5,6,7,)。如果片段6,7先到达,滑窗不会滑动,如片段5先到达,滑窗会向右移动以等待接收新的片段,如果出现滑窗之外的片段,如片段9,滑窗将拒绝接收。

    2.4.4.     利用滑窗,一定程度上实现了对乱序数据的缓存,但是过于乱序的数据依然被拒绝,TCP协议实时调整滑窗大小的算法可以实现最优效率。

3. TCP连接:网络层在逻辑上提供了端口的概念,一个IP地址可以有多个端口,一个具体的端口需要IP地址和端口号共同确定(记为IP:port的形式)。一个连接为两个IP:port之间建立通信。同一个端口上可以有多个连接。内核中的TCP模块生成连接后,将连接分配给进程使用。

  TCP连接是双向的,在TCP协议与”流”通信中提到的TCP传输是单向的(传输的前提是TCP里连接已经建立),双向连接实际上是建立两个方向的TCP传输,此时连接的每一方都需要两个滑窗处理发送的文本流和接收的文本流,由于连接的双向性,需要为两个方向的文本流编号

 3.1     连接的建立与终结:建立连接的最重要目的是让连接的双方交换初始序号(ISN)。根据TCP 协议的规定,出于连接安全考虑,文本流的第一个片段的序号不能是确定的数字,连接双方各自随机生成自己的ISN,再利用一定的方式让对方了解。

    3.1.1.    ISN交换是由SYN片段实现的,他的序号为发送方的ISN。该片段由连接的一方首先发给给另一方,将发送SYN的一方称为客户(client),接收SYN的一方称为服务器(server)。接收到SYN的server需要回复ACK,并发送出包含有server的ISN的SYN片段。建立连接的过程,就是经典的TCP三次握手。

    3.1.2.     连接通过四次握手的方式终结,使用的是特殊片段FIN。TCP连接允许单向关闭。即TCP连接关闭了一个方向的传输,成为一个单向连接。

    3.1.3.     TCP中的细节:累计ACK减少了TCP传输过程中所需的ACK流量。通过流量管理,TCP连接两端的工作能力可以匹配,从而减少不不要的传输浪费。累计ACK和流量控制都是TCP协议的重要特征。

 3.2     TCP的重新发送:接收方通过校验TCP片段头部的checksum区域来检验片段是否出错,checksum会校验包括IP头部、TCP头部和TCP数据在内的整个序列,确保IP地址、端口号和其他信息正确。如果TCP片段出错,接收方可以丢弃,即TCP片段丢失。

    3.2.1.     超时重新发送:当发送方送出一个TCP片段后开始计时,等待该片段的ACK回复。如果接收方正确接收到符合次序的片段,会利用ACK片段回复发送方,发送方得到ACK回复后继续移动窗口,发送接下来的TCP片段。如果直到计时完成,发送方没有收到ACK回复,推断之前发送的片段丢失,重新发送。其中计时等待的时间叫做重新发送超时时间(RTO)。

      3.2.1.1.    往返时间:上述过程有往返两方向,发送片段从发送方到接收方的传输;ACK片段从接收方到发送方的传输。此过程实际消耗的时间是往返时间(RTT)。

      3.2.1.2.    协议通过统计RTT来决定合理的RTO。发送方测量每一次TCP传输的RTT,每次测量得到的往返时间叫做采样RTT(srtt)。建立连接后每次的srtt作为采样样本计算平均值mean和标准差std。RTO = mean + 4 std (上述算法有多个变种,根据平台不同有所变化)。平均值反映了平均意义上的RTT,平均往返时间越大RTO越大。

    3.2.2.     快速重新发送:由于IP包的传输是无序的,所以接收方有可能先收到后发出的乱序片段,乱序片段的序号不等于最近发出的ACK回复号,已接收的文本流和乱序片段之间将出现空洞,即等待接收的空位。TCP协议规定,当接收方收到乱序片段时需要重复发送ACK=x(x为期待接收的片段)。此后接收方如果继续收到乱序片段,将再次重复发送ACK=x。当发送方收到3个ACK=x时,推断片段x丢失。及时此时片段x的计时器还没超时,发送方也会打断计时直接发送片段x,这就是快速重新发送机制。

 3.3     TCP的堵塞控制(congestion control):当TCP的发送方探测到网络交通堵塞(一旦发送方认为TCP片段丢失则认为网络中出现堵塞),会控制自己发送片段的速率以缓解网络的交通状况避免崩溃堵塞(协议通过控制滑窗大小来控制发送速率)。congestion window总是处于慢起动和堵塞避免两种状态的一个,且从slow start的状态开始。

    3.3.1.     Slow start的特点是初始速率低,但速率不断倍增。每次进入到该状态时,cwnd(congestion window size我们以片段的个数为单位来表示cwnd的大小)都需要重置为初始值1。发送方每接收到一个正确的ACK,就会将congestion window增加1,从而实现速率的倍增(由于累计ACK,速率增长可能会小于倍增)。

    3.3.2.     当congestion window的大小达到某个阈值ssthresh时,进入到congestion avoidance状态。发送速率会继续增长。发送方在每个窗户所有片段成功传输后,将窗口尺寸增加1(实际上就是每个RTT增加1)。所以在堵塞避免下,cwnd线性增长,增长速率慢。如果在此状态下有片段丢失,重新回到slow start状态,并将ssthresh更新为cwnd的一半。

    3.3.3.     总的来说,发送速率总是在增长。如果片段丢失,则重置速率为1,并快速增长。增长到一定程度,则进入到慢性增长。快速增长和慢性增长的切换点(sshthred)会随着网络状况(何时出现片段丢失)更新。通过上面的机制,让发送速率处于动态平衡,不断的尝试更大值。初始时增长块,而接近饱和时增长慢。但一旦尝试过度,则迅速重置,以免造成网络负担。

猜你喜欢

转载自www.cnblogs.com/abowlofzhou/p/11698357.html