zoukankan      html  css  js  c++  java
  • TCP 连接的要点

    概念

    TIME_WAIT: socket 仍然有数据在内核中待发送直到发送成功或超时,此socket不能被内核删除,同时等待是否要重传Ack对端还已发过来的FIN

    Linger Time:socket关闭后,如果send buffer里仍有数据,内核删除socket的超时时间,一般2min

    SO_REUSEADDR:如果有socket在TIME_WAIT状态,别的socket可以绑定和它相同的“地址:端口”

    SO_REUSEPORT:允许绑定相同的“地址:端口”,但要求前面的socket也设置了这个的属性

    FIN-WAIT-1:发出FIN后,等待收到对方ack自己的FIN (等对方的FIN)

    FIN-WAIT-2:收到对方的ACK后,等待收到对方的FIN,然后发出ACK (等对方的FIN,更近一步,自己的FIN已被ACK)

    CLOSE-WAIT: 收到对方的FIN,发出了ACK (等用户Close)

    TIME_WAIT: 重传ACK或数据(收到对方的FIN,自己也发了ACK,但不知道要不要重传)

    ACK:TCP的ACK是下一个希望收到的sequence

    Nagle算法: 延迟小包发送,直到收到Ack,优先是提高网络利用率,缺点是delay,不过也增加不多,因为ack收的越快,发送也越快,默认是开启的

    1. Listening socket可读就表示有新的连接,通过accept获得新连接的fd

    2. shutdown socket是关闭写入端,发送的FIN相当于给对端发送文件的EOF,对方收到EOF,读它的socket的时候会读到0. 这是TCP的半关闭特点,这样的目的是我自己不写了,但是仍然可以接受对方发来的数据。如果是close sockets,则这个socket既不能读也不能写了。如果对方恶意不关闭,有可能导致另一端的socket一直不关闭,那么就要手动关闭。

    3. 三个小包问题导致网络资源消耗:

    1)糊涂窗口 2)delayed Ack让Ack piggyback data,减少Ack的带宽消耗 3)Nagle算法让data delay发送,防止data发得太快,但会造成延时

    4. TCP应用层分包是指通过一定的处理,让接收方能从字节流中识别并截取还原出一个个消息。短连接的TCP服务是指对方通过关闭连接来表示一个消息发送完毕。对于长连接,有几种方法分包:1. 固定长度 2. 特殊字符或字符串作为边界 3. 每个消息的头部加一个长度字段 4. 利用消息本身的格式,比如消息内有自己的头和尾<></>

    5. TCP网络编程的主要例子:1. echo 2. 聊天服务

  • 相关阅读:
    java中的重绘
    引起共鸣的句子【转自知乎】
    东大校园网一键登录
    java用字符写字符
    Xshell 配置上传下载命令 rz sz 以及配置复制和粘贴
    【测试工程师面试】 记录XX银行面试
    常见的加密解密算法
    SHA-256 加密原理
    Spring boot 整合JSP开发步骤
    Spring boot @Scheduled(cron = "* * * * * *") cron表达式详解
  • 原文地址:https://www.cnblogs.com/qiangxia/p/4305851.html
Copyright © 2011-2022 走看看