• linux网络协议笔记


    三握四挥

    TCP

    有连接、可靠传输与按序到达、流量控制、拥塞控制

    有链接

    1. 三次握手
      建立链接
    client            server
    socket            socket
                      bind
                      listen
    connect           accept
    rw                rw
    close             close
    

    状态转换

    client            server
    CLOSED            CLOSED
                      LISTEN
    SYN-SENT          
    ESTABLISH         SYNT-RCV
                      ESTABLIS
    
    1. 四次挥手
    A                  B
    FIN-WAIT-1         
                      CLOSE-WAIT
    FIN-WAIT-2        
                      LAST-ACK
    TIME-WAIT            
                      CLOSED
    

    TIME-WAIT的目的:防止被动结束端关闭链路时,没收到主动端的ACK,继续重发FIN。如果此时主动端已经结束,并将端口分配给另一个链接,且这个重发的fin刚好落在新链接的期望序列号范围。
    五元组标志一个链接,而不是socket标志一个链接,(src ip, src port, dst ip, dst port, proto)

    可靠传输 & 按序达到

    有序列号和ACK确认机制保证

    • 发送端收到ack后,会认为ack前面的所有数据接收端都收到了
    • 接收端会丢弃重复的消息(序列号重复),但ACK还是会重发
    • 接收端在内存里保存一些乱序报文,通过选择确认机制告诉发送端哪些需要重发

    重传机制有很多:超时重传、快重传、选择重传
    参见

    流量控制

    基于滑动窗口

    • 糊涂窗口综合征 : 接收端应用处理的慢,导致接收端窗口比较满,空出很小空间就通知发送端空了一个小空间了

    利用率低,小于一定阈值是告诉发送端,接口窗口为0

    • Nagle算法: 发送端频繁发送小报文

    在发送端进行累积

    • 延迟ACK : ack消息太多了

    接收端ACK延迟到接收端发送数据给发送端时带回去,或者定时器触发

    拥塞控制

    基于拥塞窗口
    TCP流量控制、拥塞控制

    流量控制需注意死锁问题
    慢启动(从1开始倍数增加cwnd),拥塞避免(cwnd>ssthresh时,cwnd每次加一);任何时候丢包,ssthresh变为当前cwnd的一半,cwnd置一,重新开始慢启动
    快重传:当接收端收到一个失序报文,立即发送三个重复ack给发送端,发送端重发这个报文
    快恢复:慢启动-拥塞避免算法中,丢掉报文时,ssthres = current cwnd size /2, cwnd=1,快恢复是收到三个重复ack时,ssthresh=current cwnd size /2, cwnd= ssthresh

    异常理解

    close, shutdown, rst,优雅关闭链接,timeout等
    tcp中rst异常关闭问题
    Graceful shutdown server socket
    TCP链接的关闭
    shutdown和close的区别

    如果本端收到一个rst,继续读该socket,会受到ECONNRST错误,继续写,会收到EPIPE;
    如果本端收到fin,继续读socket会返回0;继续写呢??可以继续写。
    如果最后的rst丢失,因为发送rst端socket已经关闭,所以再往这条链路写,会遇到rst;读会永远阻塞住(我的理解),类似主机奔溃。

    tcp协议栈各种事件处理

    源码理解

    陶辉 高性能网络编程4--TCP连接的关闭
    tcp协议栈处理各种事件的分析

  • 相关阅读:
    BZOJ3403: [Usaco2009 Open]Cow Line 直线上的牛
    lintcode入门篇三
    lintcode入门篇二
    lintcode入门篇一
    matplotlib
    Pandas
    Numpy
    缓存
    Django性能优化的几种方法
    python总结十一
  • 原文地址:https://www.cnblogs.com/holidays/p/net.html
Copyright © 2020-2023  润新知