• 网络协议笔记-运输层


    【运输层为互相通信的应用进程提供逻辑通信】

      运输层有两个重要的功能,复用,分用;两个主机上多个应用进程之间互相通信。

      网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信


    【端口和套接字的意义】

      在协议栈层间的抽象的协议端口是软件端口,俗称端口

      软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址

      TCP/IP的运输层用一个16位端口号来标识一个端口。端口只具有本地意义,互联网中不同的计算机中,相同的端口号没有关联的。

      16位的端口号允许有65535个不同的端口

      熟知端口号:0~1023,IANA指派给了TCP/IP最重要的一些应用程序;登记端口号:1024~49151,使用时必须在IANA按照规定的手续登记;剩下的叫短暂端口号,给客户进程短暂使用,进程运行的时候使用,关闭的时候就给其他进程使用。


    【无连接的UDP特点】

    • 无连接;
    • 尽最大努力交付;UDP对应用层交下来的报文,既不合并也不拆分,永远都原样交付
    • 面向报文;
    • 没有拥塞控制,所以网络出现的拥塞不会使源主机的发送速率降低
    • 支持一对一、一对多、多对一、和多对多的交互通信
    • 首部开销小,只有8个字节
    • UDP的检验和是把首部和数据部分一起检验了,而IP数据报时值检验首部的

    【面向连接的TCP的特点】

    • 面向连接的运输协议
    • 每一条TCP连接只能有两个端点,只能是点对点的
    • TCP提供可靠的交付服务,传输的数据,具有无差错、不丢失、不重复、并且按序到达。
    • TCP提供全双工通信
    • 面向字节流。TCP中的流指流入到进程或从进程流出的字节序列【面向字节流的含义:虽然应用程序和TCP的交互是一次一个数据 块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流】
    • TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节
    • 每条TCP连接的两个端点,叫做套接字(socket)或插口。根据RFC793定义:端口号拼接到IP地址即构成了套接字。

    【在不可靠的网络上实现可靠传输的工作原理】

      理想的传输条件:1.传输信道不产生差错;2.不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。


    【地址等待协议】

      停止等待就是每发送一完一个分组就停止发送,等待对方的确认,在收到确认之后在发送下一个分组。

      停止等待协议是一种可靠的通信协议

      超时重传:发送方在发送完一个分组后,开启一个超时计时器,在计时器到期之前没有收到分组收到确认的信息,就认为分组丢失,就重新再发一遍分组,若在计时器到期之前收到了确认就撤销计时器。【1.发送后,保留发送的副本,重发时,加快发送速度;2.分组和确认分组要编号,以确认收到的是哪一个分组的确认;3.重传时间应该比传输平均往返时间长】

      停止等待协议的缺点就是信道利用率低


    【ARQ协议】

      俗称滑动窗口协议

      假定一次发送五个分组,接收方采用累积确认的方式,接收方不比对每一个分组都发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示这个分组为止的分组都已经准确收到了。如果发送发发送了五个分组,但是中间第三个丢失了,接收方就发送第二个分组的确认,发送方就回退,从新发送后三个分组再加两个新的分组,组成五个分组再一起发送给接收方。


    【TCP报文段的首部格式】

      TCP首部的最小长度是20字节。

      

    • 源端口和目的端口:各占2个字节
    • 序号:占4个字节。序号范围[0,2e32-1]。TCP是面向字节流的,在一个TCP连接中传送的字节流中每一个字节都按顺序编号。例如,一段报文段字段值为301,而携带的数据共有100字节,这表明本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400.显然下一个报文段的数据序号应当从401开始,即下一个报文段的序号字段值应该为401
    • 确认号:占4字节。是期望收到对方一下个报文段的第一个数据字节的序号。
    • 数据偏移:占4位。它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
    • 保留
    • 紧急。
    • 确认ACK:当ack=1时确认号字段才有效。当ack=0是确认号字段无效。
    • 推送:尽快推送向前,不必等到缓存区满了才发送
    • 复位:重新建立连接
    • 同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,这是一个连接请求报文段。若对方同意建立连接,则应在响应的报文段中使用SYN=1,ACK=1。SYN置为1表示这是一个连接请求或连接接收请求。
    • 终止FIN:用来释放一个连接。
    • 窗口:占2个字节。窗口指发送本报文段的一方的接收窗口。窗口值作为接收方让发送方设置其发送窗口的依据。
    • 检验和:占2个字节。检验和字段检验的范围包括首部和数据这两部分。
    • 紧急指针
    • 选项

    【TCP的滑动窗口】

    • 以字节单位的滑动窗口
    • TCP建立连接时,接收方会告诉发送方自己的接收窗口大小(控制流量)
    • 假设发送方发送序号31到50的字节数据,接收方发送确认的序号是41,则表示 就是接收方已经收到序号为31到40的字节,希望从41号字节开始接收,然后发送方的窗口向前滑动使窗口值等于20,再发送序号41到60的字节
    • 发送方有发送缓存,接收方有接收缓存
    • 发送发会把发送出去的数据,继续保留在缓存中,若收到接收方发送的确认序号,则在缓存中删除收到确认的字节的缓存,如果没有收到直接从缓存中重新发送
    • 接收方在接收发送方发送的一段连续的数据时,可能因为网络的原因收到的数据不是连续的,这时候接收方不会把非连续的数据丢弃,而是放在自己的接收缓存中,等接收到了,再交给上层应用。
    • TCP是全双工通信,通信中的每一方都在发送和接收报文。

    【TCP的流量控制】

    • 流量控制就是让发送的发送速率不要太快,要让接收方来得及接收
    • 利用滑动窗口机制来实现

    【TCP的拥塞控制】

    • 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做拥塞。
    • 拥塞控制就是防止过多的数据注入到网络中,这样可以事网络中的路由器或链路不致过载。
    • 发送方维持一个叫做拥塞窗口的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。(发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就可以再增大一点,只要网络出现了拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些。判断网络拥塞的依据就是出现了超时

      

      TCP的拥塞控制方法:

      • 慢开始:由小到达逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。发送发每次收到接收方的确认ack,就把拥塞窗口值+1
      • 拥塞避免算法:让拥塞窗口cwnd缓慢的增大,每经过一个往返时间RTT(表示传输轮次,拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对己方发送的最后一个字节的确认时间。)就把发送方的拥塞窗口cwnd加1。在拥塞避免阶段,拥塞窗口cwnd按线性规律缓慢增长。
      • 采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。(快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认);【例如:发送了M1,收到确认M1,发送M2,收到确认M2,发送M3、丢失,发送M4,重复确认M2,发送M5,重复确认M2,发送M6,重复确认M2。快重传算法规定,发送方只要一连收到3个重复确认,就知道接收方确实没有收到报文M3,因为立即进行重传。】
      • 快恢复:在收到三个重复确认时,发送方知道现在只是丢失了个别的报文段,不启动慢开始,而是执行快恢复算法,这时,发送方调整门限值,并开始执行拥塞避免算法。
      • 在拥塞避免阶段,拥塞窗口是按照线性规律增大的,这常称为加法增大。而一旦出现超时或3个重复的确认,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。

    【TCP的连接管理】

      在TCP连接建立过程中要解决的三个问题:

      • 要使每一方能够确知对方的存在
      • 要允许双方协商一些参数
      • 能够对运输实体资源进行分配。

        

        三次握手的描述:最初两端的TCP进程都处于closed状态。图中在主机下面的方框分别是TCP进程所处的状态。B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程处于LISTEN状态,等待客户的连接请求。如有,即做出响应。A的TCP客户进程也是首先创建传输控制模块TCB。

        (第一次握手):然后,在打算建立TCP连接时,向B发出连接请求报文段,这时首部的同步位SYN=1,同时选择一个初始号seq=x。TCP规定一个SYN报文段不能携带数据,但是仍然要消耗一个序号。这时,TCP客户进程进入SYN-SENT状态。

        (第二次握手):B在收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应该把SYN位和ACK位都置1,确认号ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD状态。

        (第三次握手):TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1.TCP表中规定,ACK报文段可以携带数据。当B收到A的确认之后,A进入已建立连接状态。

      

      TCP的释放过程:

        

      • 第一次挥手:A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1.这是A进入FIN-WAIT-1状态。
      • 第二次挥手:B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后进入CLOSE-WAIT状态。现在是半关闭状态,A到B是关闭的
      • 第三次挥手:B这时已经没有什么要发送给A了,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。现在假定B的序号是w,因为A向B方向是关闭了TCP连接,但是B向A方向的TCP连接是没有关闭的,所以B有可能又发送了些数据。B还必须重复上次已发送过的确认号ack=u+1.
      • 第四次挥手:A在收到B的连接释放报文后,必须对此发出确认,在确认报文段中把ACK置1,确认号是ack=w+1,而自己的序号是seq=u+1。前面发送过的FIN报文段也要消耗一个序号
  • 相关阅读:
    Android学习第三天
    Android学习第二天(从零开始手动创建项目)
    【k8s】Pod-containers
    【k8s】Pod-Guaranteed
    【k8s】Pod-Burstable
    【k8s】Pod-BestEffort
    【k8s】Pod-qosClass
    【k8s】Pod-readinessGates
    【k8s】Pod-containerStatuses
    【k8s】Pod-conditions
  • 原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/8553215.html
Copyright © 2020-2023  润新知