zoukankan      html  css  js  c++  java
  • TCP/IP协议总结

    TCP/IP协议总结

    TCP服务

    TCP服务模型包括面向连接和可靠数据传输。当某个应用程序要求调用TCP作为其运输协议的时候,该应用程序就能获得来自TCP的这两种服务
    面向链接服务:在应用层报文开始流动之前,TCP让客户端和服务器互相交换运输层的控制信息,使他们为大量的分组的到来做好准备信息,在握手阶段后,一个TCP连接就在两个进程的套接字之间建立了。这条链接是全双工的,即连接双方的进程可以在此链接上同时进行报文的收发。
    可靠的数据传输服务:通信进程能够依靠TCP,无差错,按适当顺序交付所有发送的数据。

    UDP是一种不提供不必要的轻量运输协议,UDP是无连接的,因此两个进程通信前是没有握手过程的。

    可靠传输机制

    1)检验和:
    用于检测在一个传输分组中的比特错误
    2)定时器:
    用于超时重传一个分组,可能因为该分组(或其ACK)在信道中丢失了,由于当一个分组延时但未丢失(过早超时),或当一个分组已被接收方收到但从接收方到发送方的ACK丢失时,可能产生超时事件,所以接收方可能会收到一个分组的多个冗余副本
    3)序号:
    用于为从发送方流向接受方的数据按顺序编号,所以接受分组的序号间的空隙可使接收方检测出丢失的分组,具有相同的序号的分组可使接受方检测出一个分组的冗余副本。
    确认序列号:
    当链接建立以后,每一方都可同时发送数据和接受数据,每一个方向的序号表示这个报文段的第一个字节的编号。每一方还使用确认好对它已经收到的字节表示确认。但是这个确认号定义了这一方期望的下一个字节的编号。

    滑动窗口

    缓存是用来暂时存放数据从应用程序传递并准备发送的数据。TCP发送数据的多少由这个滑动窗口来实现。
    窗口有三种动作:展开,合拢或缩回
    展开窗口表示窗口从右沿向右移动,这就允许从缓存中发送更多新的字节。
    合拢窗口表示窗口左沿向右移动,这就表示某些字节已经被确认。
    缩回:一般不会发生,因为这些会使某些本来可以发送的字节变成不能发送,
    窗口关闭:
    这种情况的发生是由于接受端因某种原因在一段时间内不愿意从发送端接收任何数据。发送端并非把窗口大小真正的收回,而是暂停发送数据,直到一个新的通告收到为止。

    糊涂窗口综合征“:发送端每次发送的数据都很小,影响效率
    解决方法:Nangle方法
    发送方把TCP从他的应用层的第一块数据发送出去,哪怕只有1个字节,在发送第一个报文段以后,发送端TCP就在输出缓存中积累数据并等待着,直到或者接收端TCP发送确认。或者已经积累发送大程度的保温段

    接受端的症状:接受端消耗数据很慢,一次只能接受很少的数据。
    解决方法:
    推迟发送确认,在缓存空间的一半已经变空之前,一直宣布窗口值为0,直到缓存有足够的空间而与。

    差错控制

    差错控制通过检验和,确认和超时来实现
    检验和:每一个报文段都包括检验和字段,用来检查收到损伤的报文段,若报文收到损伤,则丢弃
    确认:当发送数据报文到达时,确认报文必须捎带返回,减少通信量;
    当具有期望的报文到达时,同时前一个报文还没有确认,那么接受端就要立即发送ACK报文段

    失序的报文段:数据可能不按序到达,接收TCP把他们暂时存储下来,但TCP保证没有失序的报文段被交付到进程。
    接收端把这个报文的数据缓存中存储下来,并且留有间隙,表明数据是不连续的。接收端立即向发送端发送确认,并指出期望的下一个字节。

    拥塞控制

    TCP的拥塞控制是基于三个阶段的:慢开始,拥塞避免和拥塞检测
    慢开始:
    TCP发送方发送一个数据,得到回应以后,就把这个窗口按指数规律增长。慢启动不能无节制下去,一定有一个门限来停止这个阶段。当窗口到达门限大小的时候,慢开始就停止了,下一个阶段就开始了。
    拥塞避免:
    加法增大。按照加法规律增大。当拥塞窗口的大小到达了门限的时候,慢开始阶段就停止了而加法阶段就开始了,每当窗口的保温都被确认,拥塞窗口的大小就加1.
    拥塞检测:
    乘法减少,若拥塞发生了,拥塞窗口的大小级必须减少,发送端能够猜测到拥塞已经发生的唯一方法就是他必须重传一个报文段,或收到了3个ACK。在这种情况下,门限值就下降到一半(乘法减少)
    1)如果是因为发生超时,则把门限值设置为当前窗口值的一半;再从慢开始阶段开始。
    2)如果收到了3个ACK,把门限值设置为当前窗口值的一半。开始拥塞避免阶段。

    三次握手

    1)第一次客户端将标志位SYN置为1随机产生一个seq=j,将数据包发送给服务端,客户端进入SYN_SEND状态;
    2)服务端收到数据包,由标志位SYN=1知道客户端要建立连接,服务段将ACK标志位置为1和SYN=1,ack=j+1.随机产生一个seq=k发送给客户端确认连接请求,服务端进入SYN_RECV状态
    3)客户端收到确认,检查ack是否为j+1,ACK是否为1,如果正确将ACK=1,seq=k+ 1数据包发给服务器.客户端和服务端进入estalished状态

    四次挥手

    指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程可以由任何一方执行close来触发。
    由于TCP连接时全双工,因此关闭时,每个方向必须单独进行关闭。这一原则是,当一方完成数据发送任务2以后,发送一个FIN来终止中一方向的连接。收到一个FIN只是意味着这一方向没有数据流动了,即不会再收到数据了,但是在这个 TCP连接上仍能够发送数据,直到这一方向也发送了FIN,首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭

    1,第一次挥手;客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态/
    2,第二次挥手;服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态。
    3,第三次挥手;服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。
    4,第四次挥手;客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务端,确认序号为收到序号+1,服务端进入CLOSED状态。完成四次挥手。

    TIME_WAIT状态:这种状态也成2MSL,MSL也就是一个报文段生存的最长时间,也就是报文在网络中被丢弃前最长时间,这是因为在TIME_WAIT状态之后,需要执行主动关系,发送ack,同时还要加上一倍的MSL,为了等待对方的反馈结果(是否重发FIN),这是因为再发送ACK之后,可能因为诸多的原因导致ACK发送失败

    IP协议

    IP协议不可靠,因为它并不保证数据被送达,自然,保证数据送达的工作由ICMP(网络控制报文协议)
    当一个IP数据包不可达时,ICMP协议会将错误信息封包,然后传送给主机,给主机一个处理错误的机会。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。

  • 相关阅读:
    js中map和普通对象性能差距有多大?
    谈一谈在css中的wrapper
    react-loadable简单实现
    setstate源码分析
    react setstate()的秘密
    java io学习笔记二
    java8下 枚举 通用方法
    SLF4J、Log4J使用记录
    ByteBuffer flip描述
    unique within an element
  • 原文地址:https://www.cnblogs.com/hanfei-1005/p/5685809.html
Copyright © 2011-2022 走看看