UDP与TCP

1. 运输层概述

运输层主要负责 众端口到网络IP服务 之间的多路复用(multiplexing)与多路分解(demltiplexing):sockets to IP to sockets
套字节(socket)用端口号来指示,它是一个16bit的数(0-65535),其中 0-1023 为周知端口号

2. User Datagram Protocol, UDP

  仅仅对分组标识一下端口号,附加数据的长度和检验和就发给网络层。UDP协议中只负责好多路复用与分解,有UDP数据报就立刻让IP层发送数据报,对于其他什么都不提供保障,不管不顾:1. 不保证报文一定被交付到目的端口,2. 不保证收到的报文顺序和发送顺序一致,3. 不顾及网络状态以及接受端的接收能力
  网络层分组在UDP中被称为数据报。

UDP多播和广播

//TODO

3. Transmission Control Protocol, TCP

  除了提供基本的多路分解和复用服务,TCP面向连接全双工通信,提供可靠、报文有序的传输服务、同时TCP还将提供流量控制、拥塞控制。
  在TCP中被称为报文段

通过接收反馈、发送定时提供可靠的传输


  IP层仅仅提供尽力而为的服务,我们需要在端到端提供可靠性保障。在IP层传输过程中可能出现两种错误:比特差错和丢包。通过以下三种机制提供可靠的传输协议:

  • 接收方反馈:面向报文段内容错误的场景,向发送方反馈是否正确接受到分组,包括肯定确认(ACK)和否定确认(NAK)
  • 发送方定时:面对分组丢包、报文段不可识别、ACK丢包和ACK损坏等超时场景,发送方将重发; 由于TCP是面向连接的,定时器可以动态地设置(指数加权移动平均):
    // RTT均值: EstimatedRTT = (1-a)·EstimatedRTT + a·SampleRTT
    // RTT偏差: DevRTT = (1-b)·DevRTT + b·|SampleRTT-EstimatedRTT|
    // 超时间隔: TimeoutInterval = EstimatedRTT + 4·DevRTT
    // 每当超时事件出现时:TimeoutInterval = 2·TimeoutInterval
    
  • 发送方重传

通过流水化的方式提高宽带利用率


  在停等版本的协议基础上,可以采用流水线化的传输方式,将一个窗口中的数据成组发送出去,不再一个一个的传输,以提高宽带利用率。当窗口前部收到ACK将移动窗口,发送新的待发送分组。这里注意rdt与TCP对窗口的组织是不一样的,因为rdt与TCP窗口中的内容有所区别:

  • rdt:rdt分组之间并无关系,因此在窗口内采用循环成环的序号空间。rdtSR协议中,为了在接收窗口中绝对地区分新到分组和因丢失ACK后重发地冗余分组,接受窗口<=发送窗口的一半;
  • TCP:TCP分组是数据是连续的报文段,因此以首字节在数据流中位置作为分组编号

  同时这里也面临另一个问题,对于这一窗口中的分组,有两种处理方式:是累积地处理(及对于)还是选择性的处理窗口中的分组。

协议 反馈 重传 定时
rdtGBN 累积确认 全部重传 仅需对窗口底部分组定时
tdtSR 选择确认 选择没有确认的分组重传 对每个包单独定时
TCP 累积确认 选择窗口最底部的那个分组重传 仅对最后确认的包定时

流量控制


发送方维护一个指示接受方接收窗口(receive window)的空闲空间量rwnd来控制流量,以保证已分配的缓存不会溢出.

未被确认数据量 LastByteSent-LastByteAcked <= rwnd

拥塞控制


通过发送方拥塞窗口(congestion window),表示为cwnd.一般运行过程中,主要有两个重要的事件:3个冗余ACK和超时。

  • 收到3个冗余ACK时,说明网络拥堵开始出现,立刻进入快恢复状态:发送方窗口cwnd立刻"减半+3",然后线性增加,当收到一个新的ACK时,说明该数据报被收到,cwnd回到减半状态(及ssthresh)然后线性增加。
  • 当超时事件出现后,说明网络拥堵十分严重,立刻回到慢启动状态:这相当于重置了连接,cwnd从1再来!

未被确认数据量 LastByteSent-LastByteAcked <= cwnd
image

dupACKcount == 3

重传分组并进入快速恢复状态
ssthresh = cwnd/2
cwnd = ssthresh + 3MSS cwnd = ssthresh + 3MSS

timeout

重传分组并进入慢启动状态
ssthresh = cwnd/2
cwnd = 1
dupACKcount = 0 dupACKcount = 0

注意!

  1. TCP是全双工的,TCP双方都要做流量和拥塞控制;
  2. TCP的发送窗口大小受rwnd和cwnd两个量控制,rwnd是上限,cwnd动态变化。

TCP的全双工通信

//TODO

三次握手、四次挥手


三次握手

  1. 客户主机随机选择一个序号作为检验码并请求连接,发出SYN请求报文
  2. 服务器根据SYN请求报文内容Hash计算SYN cookie,作为检验码,回填SYN请求报文的检验码为请求码,返回SYNACK报文
  3. 客户机收到SYNACK报文,,为TCP连接分配资源(当以有数据时可以附加数据),设置请求码为cookie+1发送报文,发出数据报文
  4. 服务器主机检验请求码是否合法(请求码==cookie+1),合法则分配连接相关资源,TCP连接建立

why:这个问题的本质是,在TCP建立前,信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的

四次挥手
  一般确认方需要处理关闭连接相关事务,不能在收到关闭请求就立刻关闭连接

  1. 请求方请求关闭
  2. 确认方收到"请求关闭"消息,并处理此连接相关的事务;返回ACK,向请求方表明收到请求,请求方收到ACK等待确认方收尾完成。
  3. 确认方处理完收尾事务,确认可以关闭连接,发送"确认关闭"消息;
  4. 请求方收到消息,返回ACK向确认方表明“收到消息你可以开始释放网卡资源”,并定时等待,无误后请求方释放网卡资源;确认方收到ACK后关闭连接,开始释放网卡资源。

4. UDP与TCP区别

UDP

  1. 支持一对一、一对多、多对一、多对多的传输方式,也就是说 UDP 提供了单播,多播,广播的功能。
  2. 不提供数据包分组、组装和不能对数据包进行排序

TCP

  1. 仅支持单播传输

5. 公平性

  TCP的拥塞控制算法是一种分布式的异步优化算法,它趋于在竞争的多条TCP连接之间提供对一段瓶颈链路带宽的平等分享。一般情况下(即未出现超时)TCP都在拥塞避免状态和快速恢复状态之间反复跳转,呈现出"加性增乘性减"的特性,这导致TCP连接占用越多,惩罚越大,但惩罚后却都以线性递增。特别是当出现超时的时候,直接回返到慢启动状态,相当于重启连接。这保障了对瓶颈链路的公平共享。
  UDP不与其他连接合作,也不适时地调整其传输速率,UDP源可能会压制TCP流量。
  实际使用中通过开启多条并行TCP连接来占用更多的带宽。

posted @ 2021-10-20 23:27  minLoong  阅读(155)  评论(0)    收藏  举报