• 网络协议


    一、TCP 三次握手
      1、client给server发送syn后,处于SYN_SENT状态,等待server确认,server处于LISTEN状态;
      2、server收到syn后,会回复ack确认,同时会发送自己的syn给客户端,请求连接,此时server处于SYN_RECV状态;
      3、client收到服务器的syn,也会回复ack,处于ESTABLISHED,server收到ack,状态转变为ESTABLISHED,连接建立成功。
    如果是两次握手:
      1、client发送syn后,由于网络延时server没收到,client没有收到server的ack,然后重新发送syn,server回复ack,建立连接发送数据后,关闭连接,此时server接收了延时的syn报文,server误以为是新连接,就会确认。
      2、第二次握手,server发送的ack,由于网络原因被丢失,client没有接收端ack,会重新发送syn,但是此时server已经处于就绪状态,认为连接已经建立号了。
    如果是4次:
      1、客户端发送syn;
      2、服务器发送ack
      3、服务器发送syn
      4、客户端发送ack
      很明显2、3步可以合并再一起,分别占用自己的包头
    二、TCP四次挥手
      1、client发送FIN表示自己不再有数据发送,状态为FIN_WAIT_1,
      2、server回复ACK,状态变为CLOSE_WAIT,此时可能还有数据没传送完毕,client收到ack后状态变为FIN_WAIT_2,
      3、server等传输完,再发送FIN,表示自己没有数据发送,状态变为LAST_ACK
      4、client回复ACK后,状态变为TIME_WAIT,2毫秒后置位CLOSE,client接收到ACK后,状态CLOSE
    TIME_WAIT存在的意义
      1、表示如果server端没有收到ACK,会重新发送FIN,此时还可以接收

    三、TCP粘包
      1、发送端等缓冲区数据满才发送,TCP为提高传输效率,发送方往往要收集到足够的数据后才发送一包数据,若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包的数据。
      2、接收方不及时接收缓冲区的包,接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时,前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区数据,这样就一次取到了多包数据。
      TCP 面向连接的流传输,数据是无边界的 ,使用struct模块避免
      UDP 不会出现粘包,因为它有消息边界,使得每一个消息都是独立的,
      我们连续发送三个数据包,大小分别是2k,4k,8k,这三个数据包,都已经到达了接收端的网络堆栈中,如果使用UDP协议,不管我们使用多大的接收缓冲区去接收数据,我们必须有三次接收动作,才能够把所有的数据包接收完.而使用TCP协议,我们只要把接收的缓冲区大小设置在14k以上,我们就能够一次把所有的数据包接收下来,只需要有一次接收动作。
      避免:
      1、发送端发送数据的时候将数据的长度告知接收端,然后接收端根据长度接收,但是会造成大量的网络连接,放大网络延时。
      2、struct模块可以把要发送的数据长度转换成固定长度的字节,接收端先接收固定长度的字节,就能知道要接收的内容大小。
    四、TCP和UDP区别
      UDP 优点:快,安全,效率高
        缺点:不可靠,会丢包,UDP 泛洪攻击,不断向服务器发送UDP报文
      TCP 优点:传输可靠,安全,稳定,确认机制,传输完数据断开连接。
        缺点:建立连接、确认机制消耗时间、网络资源、服务器资源,连接过程比较多,中间环节容易被攻击
      DOS 拒绝服务
      DDOS 分布式拒绝服务
      CC 伪装攻击,借助代理服务器生成大量合法请求
      滑动窗口
        意味接收方还有多大的缓冲区可以用于接收数据,发送方可以通过华东窗口的大小来确定应该发送多少字节的数据,当滑动窗口为0时,发送方一般不能发送数据。
      拥塞控制
        拥塞现象网络中一部分数据数量过多,导致该部分网络来不及处理,以至于整个网络堵塞受影响

  • 相关阅读:
    HDU 3911 线段树区间合并
    Memcache启动&存储原理&集群
    剑指Offer面试题27(Java版):二叉搜索树与双向链表
    ORA-12514: TNS: 监听程序当前无法识别连接描写叙述符中请求的服务
    Java.Lang.NoSuchMethod 错误
    poj2524
    特征价格(Hedonic price)
    特征价格(Hedonic price)
    苏州之行
    苏州之行
  • 原文地址:https://www.cnblogs.com/imlifelong/p/12161156.html
Copyright © 2020-2023  润新知