UDP与TCP

  • Post author:
  • Post category:其他


**





UDP

**



1.基于Internet ip协议

1)具有多路复用/分用

2)简单的错误校验机制

2.特点:会丢,非按序到达

3.无连接的:

1)发送方与接收方不需要握手

2)每个UDP段的处理独立于其他段



UDP存在的原因:

1)无需建立连接(减少延迟)

2)实现简单,无需维护连接状态

3)头部开销小

4)没用拥塞控制,应用可以更好的控制发送时间和速率



UDP应用场景:

主要应用在一些容忍丢失、对速率敏感的流媒体



那如何在UDP上实现可靠数据传输?

在应用层增加可靠性机制、错误恢复机制。



UDP段格式

在这里插入图片描述



UDP的checksum

1.首先,发送方讲段的内容视为16bit的整数;计算所有整数的和,进位加在和的后面,将得到的值按位取反,得到校验和;发送方讲校验和放入校验和字段

2.接收方计算所得到段的校验和;与发送方发送的校验和比对,不相等:检测出错误;相等,没有检测出错误(不一定就是正确的);




TCP



如何把UDP的不可靠传输改为可靠数据传输呢?考虑以下几个问题:



1.底层信道传输过程中可能出现位翻转的错误,如何改进?

利用

校验和

检测位错误



2.检查出错误如何恢复

确认机制(ACK):接收方显示地告发送方分组是否被正确接收

NAK(Negative Acknowledgment):接收方显示地告诉发送方分组有错误,发送方收到NAK后,重传分组。



3.如果NAK/ACK在返回过程中丢失了或者坏掉了呢?

发送方只要没收到ACK就重传,但不能盲目重传,否则会产生重复确认的分组



4.如何解决重复分组的问题

序列号(sequence number):发送方给每个分组增加序列号,接收方丢弃重复的分组。



5.我们真的需要NAK吗?

可以不要NAK,接收方通过ACK告知最后一个被正确接收的分组,在ACK消息中,显式地加入被确认分组的序号;如果接收方想要的分组,迟迟没有收到,则会不停朝发送方通过ack传递想要的分组序号;当发送方收到

三次

的冗余确认消息,就会立刻发送该分组内容(快速重传机制)。



6.如果发送方第一次的分组丢失了或者接收方的ack丢了,会出现什么情况?

会导致发送方一直处于等待状态,怎么办?设定定时器,超时重传机制



(此时的协议基本能够正确运行了,但是效率惨不忍睹,如何改善效率问题?流水线机制、滑动窗口协议)

流水线机制:允许发送方在收到ACK之前连续发送多个分组,所以我们需要:

1)更大的序列号范围。2)发送方与接收方需要更大的存储空间以缓存分组。

滑动窗口协议:GBN、SR

当发送窗口和接收窗口的大小都等于1时,就是停止等待协议。

当发送窗口大于1,接收窗口等于1时,就是回退N步协议(GBN-go back N)。

当发送窗口和接收窗口的大小均大于1时,就是选择重发协议(SR)。

其中,GBN是累计确认机制,对于乱序到达的分组直接丢弃,会导致网络中充满重传的信息

SR在接收方也有一个缓存,所以,乱序到达的分组会被缓存,改善了GBN中的重传;但发送方窗口的size和接收方缓存的size和要小于等于2的k次方,k是分组序列号的最大值。



TCP的拥塞控制

1.发送方限制发送速率

CongWin = LastByteSend – LastByteAcked

rate ≈ CongWin/RTT

其中,CongWin会根据网络堵塞动态调整;

2.如何判断网络堵塞?

发生loss事件,即timeout或3个重复ack

3.调节机制

1)AIMD,加性增—乘性减

每个RTT将COngWin增大一个MSS(最大报文段长度),发生loss后将CongWin降为一半

2)慢启动

1°TCP连接建立时,将CongWin设为1,每个RTT将其翻倍,知道达到loss事件前值得1/2;

2°通过借助threshold变量,当发生loss时,根据触发loss的原因不同分:

若由于受到3个冗余ACK,则ConWin切到一半

若由于timeout,则CongWin变为1

直到达到threshold后,线性增长(每次加1)



版权声明:本文为weixin_43333890原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。