zoukankan      html  css  js  c++  java
  • 计算机网络03-传输层、可靠数据传输、UDP与TCP

    计算机网络03

    第三章 传输层

    一、传输层概述

    1 · 传输层与应用层的关系

    网络层提供主机之间的逻辑通信机制,而传输层提供应用进程之间的逻辑通信机制。它建立在网络层之上,依赖于网络层服务,同时运输协议能够提供的服务常常受制于网络层协议的服务模型。

    2 · 进程到进程的数据交付

    TCP与UDP作为两种运输层协议,其责任是将两个端系统间IP的交付服务扩展为运行在端系统两个进程之间的交互服务。

    • TCP
      是可靠、按序的交付服务。它提供拥塞控制、流量控制、连接建立。
    • UDP
      不可靠的交付服务,基于“尽力而为(Best-effort)”的网络层,没有做可靠性方面的扩展。

    3 · 复用和分用

    将主机之间交付扩展到进程间交付被称为运输层的多路复用和多路分解。

    • 什么是套接字
      源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。用于表示客户端请求的服务器和服务。
      套接字是支持TCP/IP的网络通信的基本操作单元,可以看做不同主机自己建的进程进行双向通信的断点,即通信两房的一种约定,用套接字中的相关函数来完成通信过程。
    • 接收端进行多路分解
      传输层检查报文段中的字段,标识出接收套接字后将报文段定向到套接字,最后交付数据。
    • 发送端进行多路复用
      在源主机从不同套接字中收集数据块,并未每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层。

    4 · UDP

    UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的、基于Internet IP协议的协议。

    • 特点
      • 无连接:
        知道对端的IP和端口号就直接进行传输, 不需要建立连接。而TCP需要TCP在发送数据前进行三次握手建立连接。
        同时因此也不需要维护连接状态,包括收发状态等, 一台服务机可同时向多个客户机传输相同的消息。
      • 不可靠:
        没有确认机制, 没有重传机制,没有拥塞机制; 如果因为网络故障该段无法发到对方, UDP协议层不会给应用层返回任何错误信息而导致丢包。
        同时不关心发送端是否收到了数据,也对数据进行校验与备份,但应用可更好地控制发送时间和速率。
      • 面向报文:
        不能够灵活的控制读写数据的次数和数量,应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并,而是保留这些报文的边界。因此,应用程序需要选择合适的报文大小。
      • 有单播,多播,广播的功能:
        UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
      • !头部开销:
        UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要少得多。
        UDP 头部包含了以下几个数据:
        1)两个十六位的端口号,分别为源端口(可选字段)和目标端口。
        2)整个数据报文的长度(十六位)。
        3)整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误(十六位)。
        因此 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的。
    • 适用场景
      对当前网络通讯质量要求不高的时候,实时性要求高的地方都可以看到 UDP 的身影,要求网络通讯速度尽量的快,这时就使用UDP。
    • 如何在UDP上实现可靠数据传输
      • 在应用层增加可靠性机制
      • 应用特定的错误恢复机制
    • UDP校验和
      提供了检测UDP段在传输中是否发生错误的功能。
      • 发送方将段的内容视为16-bit整数,计算所有整数的和进位加在和的后面,将得到的值按位求反,得到校验和。同时发送方将校验和放入校验和字段。
      • 接收方计算所收到段的校验和,将其与校验和字段进行对比。

    二、可靠数据传输

    1 · 流水线可靠数据传输原理

    可靠数据传输协议的基本结构是接口,它依靠渐
    进地设计可靠数据传输协议的发送方和接收方,并只考虑单向数据传输。
    本次我们并不详细展开rdt原理,但是需要明白什么是重传。

    在自动重传请求协议中,使用接收方反馈协议(ARQ)使得发送方了解接收方情况。ACK表示“肯定确认”,NCK表示“否定确认”,他们通常用一个分组决定,用0/1代表其值。

    当发送方不知道是一个数据分组丢失还是ack丢失或者该分组ack过度延时时便进行重传。

    当由于ack丢失或者过度延时导致的重传中,第一次的数据报依旧会正确的传递到接收方,只是发送方由于接收不到ack而误以为第一次的数据报未正确传递而进行重传。因此rdt2.0版本中为了防止接收方因重传导致的冗余数据,引入了冗余数据分组来处理冗余数据。
    而在rdt3.0版本中,为了实现基于时间的重传机制,则规定了一个倒计数定时器

    流水线可靠数据传输则是为了提高数据传输的资源利用率。它不要求每个数据报正确传递后再传递下一个数据报,而允许发送方发送多个数据分组而无需其余分组的等待确认。因而它要求:

    • 对每个分组增加唯一的序号(seq),此时ack的值通常为(seq+0/1)
    • 协议的发送方和接收方两端分别要缓存已经发送但未确认的分组与已经接受的分组。
    • 对丢失、损坏的分组进行回退N步选择重传

    2 · 回退N步与选择重传

    • 回退N步协议(GRB协议)
      假设某个序号为n的分组由于传输中丢失导致接收失败的时候,那么当n之后的序列的分组抵达接收方的时候,接收方将由于未接收到n而丢弃掉所有n+1之后的数据包,并不断返回ack(n-1),让发送方在计时器超时后重新从n包发送数据。
    • 选择重传(SR协议)
      SR协议中为接收方设置了缓存机制,用于缓存乱序到达的分组。此协议中发送方与接收方都拥有窗口,即代表发送方已经发送但未确认的分组长度与接收方已经接收但乱序的分组长度
    • 各自的缺点
      grb丢弃已经接收的分组会显得有些浪费。而sr协议中若接收方返回的ack包在传输中丢失,发送方将无法对已经发送的包进行确认,导致无法进行下一个包的发送。

    三、TCP协议和TCP的拥塞控制

    TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的RFC793定义。

    1 · TCP报文段格式

    • 源端口 16位;目标端口 16位;序列号 32位;回应序号 32位;TCP头长度 4位;reserved 6位;控制代码 6位;窗口大小 16位;偏移量 16位;校验和 16位;选项 32位(可选);
    • 这样我们得出了TCP报头的最小长度,为20字节。

    2 · TCP可靠数据传输

    由于应用层提供的数据服务是不可靠的,ip服务运输的数据报不保证其交付与按序交付,因此TCP在ip的不可靠尽力为之服务上创建了可靠数据传输服务。
    上一节中我们已经介绍了DBN协议与SR协议,而TCP的差错恢复机制为GBN协议和SR协议的混合体,它提出的一种修改意见是选择确认,允许TCP接收方有选择地确认失序报文段,而不是累积确认最后一个正确接收的有序报文段,并与选择重传进行结合使用。

    3 · TCP建立连接过程

    三次握手特点:

    • 没有应用层的数据 ,SYN这个标志位只有在TCP建立连接时才会被置1 ,握手完成后SYN标志位被置0。

    第一次握手:

    • 客户端向服务端发送连接请求报文段(SYN J,seq = x)。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT(请求连接)状态。

    第二次握手:

    • 服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号(SYN K,ACK = 1,seq = y,ack=x+1),发送完成后便进入 SYN-RECEIVED 状态。

    第三次握手:

    • 当客户端收到连接同意的应答后,还要向服务端发送一个确认报文(ACK = 1,seq = x+1,ack=y+1)。发送完毕,客户端和服务端都进入ESTABLISHED状态,此时连接建立成功。

    Question:为什么 TCP 建立连接需要三次握手,而不是两次:
    1.防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误
    2.客户端链接超时,会重新发送一次连接请求。当两个SYN都抵达发送了ACK时,虽然第一个ACK会被放弃,但是服务器端会分配资源并一直维持这个资源,造成浪费。

    4 · TCP断开连接过程

    挥手特点:

    • TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。

    第一次挥手:

    • 当主机A(客户端) 完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求

    第二次挥手:

    • B(服务端) 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包(ack M+1),并进入 CLOSE_WAIT 状态。
    • 此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。

    第三次挥手:

    • B果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求(FIN N),然后 B 便进入 LAST-ACK 状态。

    第四次挥手:

    • A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。
    • 该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。

    5 · TCP拥塞控制

    拥塞的表现情况是:太多发送主机发送了太多数据或者发送速度太快,以至于网络无法处理。而拥塞将导致分组丢失或者分组延迟过大。
    在TCP中拥塞控制的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其连接发送流量的速率。并且通过如下三个方法来确认:

    • 一个丢失的报文段意味着拥塞
    • 当先前的报文段确认到达时,能够增加发送方的速率
    • 宽带探测

    6 · TCP特点

    • 面向连接的运输层协议: 发送数据之前必须在两端建立连接,即进行三次握手。
    • 可靠传输:
      • 提供拥塞控制,当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞。
      • 误码靠的是TCP的段编号以及确认号判断丢包。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
    • 提供全双工通信: TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)
    • 仅支持单播传输: 每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。
    • 面向字节流: TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。

    7 · TCP与UDP的区别

    TCP UDP
    是否连接 面向连接,建立连接3次握手,断开连接4次挥手 无连接
    是否可靠 可靠传输,使用流量控制和拥塞控制 不可靠传输,不使用流量控制和拥塞控制
    连接对象个数 只能是一对一通信 支持一对一,一对多,多对一和多对多交互通信
    传输方式 面向字节流 面向报文
    首部开销 首部最小20字节,最大60字节 首部开销小,仅8字节
    适用场景 适用于要求可靠传输的应用,例如文件传输 适用于实时应用(IP电话、视频会议、直播等)
  • 相关阅读:
    AGC 018E.Sightseeing Plan(组合 DP)
    BZOJ.4767.两双手(组合 容斥 DP)
    AGC 001E.BBQ Hard(组合 DP)
    洛谷.3960.列队(线段树/树状数组)
    Codeforces Round #514 (Div. 2)
    10.4 正睿国庆集训测试 青岛
    Codeforces.264E.Roadside Trees(线段树 DP LIS)
    BZOJ.4653.[NOI2016]区间(线段树)
    Ansible安装部署以及常用模块详解
    Linux系统诊断必备技能之二:tcpdump抓包工具详解
  • 原文地址:https://www.cnblogs.com/banshanliang/p/14245060.html
Copyright © 2011-2022 走看看