zoukankan      html  css  js  c++  java
  • 计算机网络之传输层

    传输层概述

      从信息处理得角度上去看,传输层主要是给上面得应用层提供通信服务得。我们平时再对网络进行编程得时候,我们很多时候都是直接对接得传输层,也就是我们使用传输层所提供得接口来进行网络编程,所以我们常说传输层是用户功能得最底层,是面向通信部份得最高层。

      传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议)。

    UDP协议

      UDP(User Datagram Protocol: 用户数据报协议),是一个非常简单的协议,它对接收到的数据报不合并也不拆分,如下图:

    UDP协议格式:

    16位源端口号16位目的端口号
    16位UDP长度16位UDP校验和
    UDP数据

      UDP协议的特点:UDP是无连接协议;UDP不能保证可靠的交付数据,即UDP协议不会感知网络是否拥塞,UDP协议不管网络是否拥塞,都会把数据交付出去,给这个网络就完了。无法保证数据在网络中是否丢失;UDP是面向报文传输的;UDP没有拥塞控制,而且UDP首部开销很小。

    TCP协议

      TCP(Transmission Control Protocol: 传输控制协议),是计算机网络中非常复杂的一个协议。

      TCP协议特点:TCP是面向连接的协议;TCP的一个连接有两端(点对点通信);TCP提供可靠的传输服务;TCP协议提供全双工的通信;TCP是面向字节流的协议。

    TCP协议格式:

    16位源端口16位目的端口
    序号
    确认号
    数据偏移保留字段TCP标记窗口
    校验和 紧急指针
    TCP选项填充

    序号:0~(2^{32})-1,一个字节一个序号, 数据首字节序号
    确认号:0~(2^{32})-1,一个字节一个序号, 期望收到数据的首字节序号。确认号为N:则表示N-1序号的数据都已经收到。
    数据偏移:占4位:0~15,单位为:32位字,数据偏离首部的距离。
    TCP标记:占6位,每位各有不同意义

    标记 含义
    URG Urgent: 紧急位,URG=1,表示紧急数据
    ACK Acknowledgement: 确认位,ACK=1,确认号才生效
    PSH Push: 推送位,PSH=1,尽快地把数据交付给应用层
    RST Reset: 重置位,RST=1,重新建立连接
    SYN Synchronization: 同步位,SYN=1 表示连接请求报文
    FIN Finish: 终止位,FIN=1 表示释放连接

    窗口:占16位:0~(2^{16})-1,窗口指明允许对方发送的数据量
    紧急指针:紧急数据(URG=1),指定紧急数据在报文的位置
    TCP选项:最多40字节,支持未来的拓展

    可靠传输的基本原理

    • 停止等待协议:发送方生成新的消息,发送给接收方,并且此时不会产生新的消息,需要收到接受方的确认消息后,才会产生新的消息。超时重传:如果发送方的消息在传输的过程种丢失了,接收方没有收到消息,就会进行超时重传;如果接收方发送的确认消息,在传输的过程中丢失,也会进行超时重传,因此 每发送一个消息,都需要设置一个定时器。停止等待协议是最简单的可靠传输协议,但停止等待协议对信道的利用效率不高。
    • 连续ARQ协议:ARQ(Automatic Repeat reQuest:自动重传请求),由于单个发送和确认效率低,我们可以通过批量发送和确认来提升效率。

      TCP的可靠传输基于连续ARQ协议,TCP的滑动窗口以字节为单位,窗口滑动过程如下图:

    如果接收到的序号没有按序收到确认号,在超时时间内就会进行重新传送,如下图:

    为了避免对整个窗口中的字节进行重传,因此TCP协议使用了选择重传来提高传输效率。选择重传:重传的是一段字节流,而不是某个字节,在TCP选项里存储的是需要重传的字节流的边界。选择重传需要指定需要重传的字节,每一个字节都有唯一的32位序号。

    TCP协议的流量控制

       流量控制指让发送方发送速率不要太快,是使用滑动窗口来实现的,即通过窗口大小控制对方发送速率。当接收到窗口为0的消息,则启动坚持定时器,坚持定时器每隔一段时间发送一个窗口探测报文。

    TCP协议的拥塞控制

      一条数据链路经过非常多的设备,数据链路中各个部分都有可能成为网路传输的瓶颈。流量控制考虑点对点的通信量的控制,拥塞控制考虑整个网络,是全局性的考虑。如何判断是否发生了网络拥塞?根据报文超时来判断发生了拥塞是不成立的,如果我们在传输的过程中,把光纤或者网络断了,这个时候也会导致报文超时,但这是因为网络故障造成的
      慢启动算法: 由小到大逐渐增加发送数据量,每收到一个报文确认,就加一。例如:发送的数据量以此为:1 2 4 8 16...,是指数增长的。当使用慢启动算法增长到慢启动阈值时,就会使用拥塞避免算法;拥塞避免算法:维护一个拥塞窗口的变量,只要网络不拥塞,就试探着拥塞窗口调大,如1 2 4 8 16 17 18 19。

    TCP连接的建立

    标记 含义
    URG Urgent: 紧急位,URG=1,表示紧急数据
    ACK Acknowledgement: 确认位,ACK=1,确认号才生效
    PSH Push: 推送位,PSH=1,尽快地把数据交付给应用层
    RST Reset: 重置位,RST=1,重新建立连接
    SYN Synchronization: 同步位,SYN=1 表示连接请求报文
    FIN Finish: 终止位,FIN=1 表示释放连接

    TCP三次握手的过程:

    1. 第一次握手:建立连接时,客户端(发送方)发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器(接收方)确认;
    2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
    3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手

      在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。

    为什么发送方要发出第三个确认报文呢?

    • 为了避免已经失效的连接请求报文传送到对方,引起错误

    TCP连接的释放

    TCP四次挥手的过程:TCP连接断开过程:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。",Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

      MSL(Max Segment Lifetime): 最长报文段寿命,MSL建议设置为2分钟。为什么需要等待2MSL?其实在释放连接的过程中,客户端最后一次发送的报文,服务端是没有确认的,为了确保发送方的ACK可以达到接收方,如果2MSL时间内没有收到,则接收方会重发。这也是等待计时器的作用,主要是为了确保发送方发送的第四次挥手报文可以正确的到达接收方,如果没有到达的话,接收方就会重新放松第三次挥手的报文,以正确得到释放这次连接。等待计时器的另一个作用就是确保当前连接的所有报文都已经过期。

    为什么关闭连接需要四次挥手呢?
      这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

    传输层总结:第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。 传输层的任务是根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的协议数据单元称为段或报文。 网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口。 有关网络层的重点:

    • 传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;
    • 包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);
    • 重要设备:网关。
  • 相关阅读:
    libevent的问题
    mysql homedir迁移
    mysql海量数据的优化
    Spark(Hive) SQL中UDF的使用(Python)【转】
    Spark SQL inferSchema实现原理探微(Python)【转】
    Spark SQL利器:cacheTable/uncacheTable【转】
    Spark使用CombineTextInputFormat缓解小文件过多导致Task数目过多的问题【转】
    ExecutorService-10个要诀和技巧【转】
    漫游Kafka之过期数据清理【转】
    kafka多线程消费及处理和手动提交处理方案设计[转]
  • 原文地址:https://www.cnblogs.com/reminis/p/13063815.html
Copyright © 2011-2022 走看看