zoukankan      html  css  js  c++  java
  • 第六章 传输层

    思维导图:

    一、 概述

    与数据链路层关系

    • 提供可靠的、高效的、性价比高的数据传输
    • 输出实体
      •   
    • 传输层利用网络层的服务,为它的上层应用层提供服务
      •   

    网络层与传输层不同点:

    • 网络层运行在由承运商操作的路由器上,因此用户无法真正控制到网络层
    • 把另一层放在网络层之上,可以让用户能够控制到服务质量(some control)
    • 传输层原语独立于网络层原语,而网络层原语会因为网络的不同而不同
      •   
    • 网络层负责把数据从源机送达到目的机(Host to Host)
    • 传输层负责把数据送达到具体的应用进程(End to End:端到端)

     与数据链路层关系

     数据段(TPDU,传输层协议数据单元)

    • TPDU(Transport Protocol Data Unit)是从传输实体发到对端传输实体的信息,有的教材叫TPDU为数据段(segment) 
    • TPDU作为数据(载荷)被封装在分组(packet)中,由网络层传输交换
    • 分组作为数据(载荷)被封装在帧(frames)中,由数据链路层传输交换

    两个常用的协议:

    • UDP(User Datagram Protocol)用户数据报协议
    • TCP(Transmission Control Protocol)传输控制协议

    二、 用户数据报协议UDP

    UDP提供无连接的连接,可以使用源端口和目的端口

    • UDP数据段包括4个字段共8字节的头部和数据两个部分
    • 其中第3个字段,长度字段(域)表示;包括头部和数据总共有多少字节
    • 第4个是校验和(checksum)是可选的,如果不计算校验和,则该字段/域置为0
    • UDP数据段中最独特、最重要的字段是1、2个字段,分别表示源端口和目的端口,都是用16比特表示的

    端口被分为三段:

    自由端口(Free port)

    • 本地分配
    • 动态的随机端口

     UDP校验和计算:

    校验和中用到的IP伪头部:(TCP协议值为6)

    收到数据进行校验和计算,计算的数据里面包括收到的校验和,计算的结果应该为全1,否则传输过程中发生错误。

     

    通信模型

    端点就是套接字(Socket)

    包括:

    • IP地址
    • 端口号

    通信五元组:

    一些著名的端口号:

    传输层的PDU不仅仅送达主机,而且送达端口,即应用进程

    三、 TCP数据段(Transmission Control Protocol)

    • TCP连接上的每个字节都有它自己独有的32位序列号
    • 单收、发双方的TCP实体不是以字节,而是以数据段的形式交换数据
      •   TCP数据段必须适合IP分组的65515字节(65535-20B)的载荷限制
      •         每个TCP数据段必须适合于下层网络的MTU

    Sequence number

    • 序列号,表示一个字节的编号
    • 初始序列号ISNs(initial sequence numbers):随机产生的   

    Acknowledgement number

    • 确认号,期望接收的字节编号(32位)
    • TCP的可靠传输保证,采用了肯定确认机制

     

    保留字段,和控制比特

    • URG:紧急数据,即使win = 0,也可以发送。值为1时,马上处理
    • ACK:    =1,确认号有效
    • PSH:表示这是带有PUSH标志的数据,接受方收到这样的数据,应该立刻送到上层,而不需要缓存它
    • RST: 被用来重置一个已经混乱的连接,如果在连接建立阶段,就直接拒绝建立连接
    • SYN: 用在连接建立的过程
    • FIN:被用来释放连接,它表示发送方已经没有数据要传输了,但是可以继续接收数据

    Window size:

    • 为了避免接收方被大量涌入的数据所淹没,TCP实体进行流控(Flow control)
    •  告诉对方可以发送的数据字节数,即从确认字节号开始,连续发送的字节总数
    • 窗口尺寸的大小,取决于接收方

    Checksum(校验和):

    • 计算方法跟UDP数据段中校验和计算一样,唯一不一样的就是伪头部中的用户协议值取为6

    Urgent pointer:

    • 紧急指针,和URG控制位配合使用,指明了紧急数据

    Options

    • 如果有选项域,它提供了一种增加基本头没有包含的内容的方法

     

    TCP三次握手

    1.  建立过程

    • 一方(server)被动地等待一个进来地连接请求
    • 另一方(client)通过发送连接请求,设置一些参数
    • 服务器回发确认应答
    • 应答到达请求方,请求方最后确认,连接建立
    • 可能地安全问题:SYN泛洪Dos攻击(伪造源IP)

    2.  连接释放

    • 任何一方在没有数据要传送地时候,都可以发送一个FIN置位了的TCP数据段
    • 当FIN被确认的时候,该方向的连接被关闭了
    • 当双向的连接都关闭了的时候,连接释放

     四次握手正常释放连接:

    •  

    TCP传输策略

    传输的是全双工的字节流

    采用Window size 进行流控

    策略

    • 当窗口数为0时,发送者不能正常发送数据段,除非:
    • Urgent数据。比如,用户想杀掉远端机器上的进程的时候,可以发送数据。
    • 发送者可以发送一个字节的数据段,以便让接收者再次发送期待接收的字节号(确认)窗口数(避免死锁)

    优化

    1.  优化接收端

    • 接收端可以推迟500ms发送确认分组和窗口更新,以便可以免费搭载在处理后的回显分组内(free ride)
    • 傻瓜窗口综合症

    2.  优化发送端:Nagle's algorithm

    • 当数据以一次一字节的速度到达传输实体的时候,只发送第一个字节,然后将后续的字节缓存起来,知道发出的字节得到确认
    • 将缓存起来的字节在一个数据段中发出,在继续缓存,知道发出的数据得到确认
    • 有些情况禁用,如:互联网远程运行

     

    TCP拥塞控制

    拥塞检测(Congestion detection)

    • 所有的互联网TCP算法都假定超时是由拥塞引起的,并且通过监视超时的情况来判断是否出现问题

    拥塞控制(Congestion control)

    • 当一个连接建立的时候,双方选择一个合适的窗口大侠,接收方根据自己的缓存区大小来指定窗口的大小
    • 如果发送者遵循这个窗口大小的限制,则接收端不会出现缓冲区溢出的问题,但可能由于网络内部的拥塞而发生问题

    两个窗口问题

    • 要解决拥塞,应该是认识到这两个潜在的问题:网络容量、接收者容量
    • 为此,每个发送者维护两个窗口
      •  接收者窗口:反映了目前接收者的处理能力(容易获取)
      •  拥塞窗口:大小反应了网络目前的容量(难于获取)
    • 只要发送者发送的数据字节数是两个窗口中小的那个窗口数

    慢启动算法(Slow Start)

    • 当连接建立的时候,发送者用当前使用的最大数据段长度初始化拥塞窗口,然后发送一个最大的数据段
    • 如果在定时器超时之前收到确认,则将拥塞窗口翻倍,然后发送两个数据段,直到超时(或达到接收方窗口的大小)

    阈值开始,每次传输,线性增长

    • 不断超时,不断重启

    • 重新慢启动的时候,拥塞窗口值不用重置为一个数据段大小,而是可以设置为阈值大小,从这里直接开始线性增长,者就是所谓的快速恢复
    • 任何时候,如果TCP传输实体收到一个ICMP抑制分组(ICMP source quench),则该事件被当作超时对待

    TCP定时器

    •  TCP采用了肯定确认重传技术,保证每一个字节的可靠传输
    • 每发一个数据段,都会启动一个定时器——重传定时器(retransmission timer,Positive ackn.with retransmit)
    • 持续定时器(persistence timer) 用来避免如下死锁
    •   保活定时器(keep-alive timer)——用来检查连接是否存活
    •   在关闭时候,处于time-wait中使用的定时器,运行两倍的最大分组生存时间,以确保连接     关闭之后,该连接上的所有数据都完全消失

     

    TCP与UDP比较:

      •  TCP

        •  可靠传输方式
        •     可让应用程序简单化,程序员可以不必进行错误检查、修正等工作
      •  UDP
        •  为了降低对计算机资源的需求(如:DNS)
        •     应用程序本身已提供数据完整性的检查机制,毋须依赖传输层的协议来保证
        •     应用程序传输的并非关键性的数据(如:路由器周期性的路由信息交换)
        •     一对多方式,必须使用UDP(TCP限于一对一的传送)
  • 相关阅读:
    记周日一次故障意外
    每周一坑-【3月第1周】
    关于计划任务的一个小需求-优化篇
    400篇博客的一个里程碑
    关于计划任务的一个小需求-实现篇
    关于计划任务的一个小需求
    微服务优雅停机研究
    NSUInteger设为负数
    Mac上运行第一个Flutter项目
    Vue filtersfilter、computed、methods、watch对比
  • 原文地址:https://www.cnblogs.com/zxj-262410/p/10620591.html
Copyright © 2011-2022 走看看