• IP&TCP知识


    1. IP:

    • IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”
    • IP地址分类:A类地址、B类地址、C类地址、D类地址、E类地址
      • A类地址分配给规模特别大的网络使用,B类地址分配给一般的中型网络,C类地址分配给小型网络,如局域网,C类地址分配给小型网络,如局域网。
    • IP地址 = 网络地址 + 主机地址
      • 一个C类IP地址:192.168.1.1,网络地址:192.168.1.0、主机地址:0.0.0.1

    2. 子网掩码:

    • 子网掩码是一个32位的2进制数 ,它必须结合IP地址一起使用。
    • 子网掩码只有一个作用,就是将某个IP地址划分成“网络地址”和“主机地址”两部分
      • 原因:很多时候,你并不知道这个IP地址究竟是A类、B类还是C类,子网掩码的作用就出现了,子网掩码通过和IP地址的“与”运算,求出主机地址是多少
    • 计算公式:网络地址 = IP & 子网掩码

    • 默认子网掩码

    广播地址

    • 广播地址是专门用于同时向网络中所有工作站进行发送的一个地址
    • 广播地址是该子网主机地址全1的地址,即子网中最大的地址
    • 计算方式:广播地址 = (~子网掩码) | 网络地址

    参考文章:

    【计算机网络】IP地址和子网掩码的关系_子网掩码和ip地址的关系-CSDN博客

    3. TCP:

            它是一个面向连接的可靠的传输协议。既然是一个可靠的传输协议就需要对数据进行确认。

    TCP报文头部:

    TCP三次握手详解-深入浅出:

    TCP三次握手详解-深入浅出(有图实例演示)-CSDN博客

    tcpdump命令观察三次握手:

    tcpdump -i lo -nn port 82

            第三次握手tcpdump显示的是相对的顺序号。为了便于观察我们需要把tcpdump的顺序号变为绝对的顺序号,需要加-S参数。

    tcpdump -i lo -nn port 82 -S

    一段报文:

    1. tcpdump -i lo -nn port 82 -S报文分析:
    2. Client第一次握手: SYN 【mss 最大报文段长度 sackOK 发送端支持并同意使用SACK nop是一个空操作选项 wscale 发送端使用的窗口扩大因子为2
    3. 11:11:05.489187 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [S], seq 543067661, win 43690, options [mss 65495,sackOK,TS val 2727838923 ecr 0,nop,wscale 7], length 0
    4. Server第一次握手(第二次握手): ACK + SYN
    5. 11:11:05.489193 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [S.], seq 3824468340, ack 543067662, win 43690, options [mss 65495,sackOK,TS val 2727838923 ecr 2727838923,nop,wscale 7], length 0
    6. Client第二次握手(第三次握手):ACK
    7. 11:11:05.489201 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824468341, win 342, options [nop,nop,TS val 2727838923 ecr 2727838923], length 0
    8. Client推送数据
    9. 11:11:05.489218 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [P.], seq 543067662:543068498, ack 3824468341, win 342, options [nop,nop,TS val 2727838923 ecr 2727838923], length 836
    10. 11:11:05.489221 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [.], ack 543068498, win 355, options [nop,nop,TS val 2727838923 ecr 2727838923], length 0
    11. 11:11:05.502259 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824468341:3824469504, ack 543068498, win 355, options [nop,nop,TS val 2727838936 ecr 2727838923], length 1163
    12. 11:11:05.502263 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824469504, win 1365, options [nop,nop,TS val 2727838936 ecr 2727838936], length 0
    13. 11:11:05.502289 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824469504:3824470528, ack 543068498, win 355, options [nop,nop,TS val 2727838936 ecr 2727838936], length 1024
    14. 11:11:05.502292 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824470528, win 1383, options [nop,nop,TS val 2727838936 ecr 2727838936], length 0
    15. 11:11:05.503068 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824470528:3824471552, ack 543068498, win 355, options [nop,nop,TS val 2727838936 ecr 2727838936], length 1024
    16. 11:11:05.503071 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824471552, win 1399, options [nop,nop,TS val 2727838936 ecr 2727838936], length 0
    17. 11:11:05.503079 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824471552:3824472576, ack 543068498, win 355, options [nop,nop,TS val 2727838936 ecr 2727838936], length 1024
    18. 11:11:05.503081 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824472576, win 1415, options [nop,nop,TS val 2727838936 ecr 2727838936], length 0
    19. 11:11:05.503100 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824472576:3824473600, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838936], length 1024
    20. 11:11:05.503101 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824473600, win 1431, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    21. 11:11:05.503108 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824473600:3824474624, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    22. 11:11:05.503110 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824474624, win 1447, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    23. 11:11:05.503117 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824474624:3824475648, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    24. 11:11:05.503118 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824475648, win 1463, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    25. 11:11:05.503153 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824475648:3824476672, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    26. 11:11:05.503155 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824476672, win 1479, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    27. 11:11:05.503161 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824476672:3824477696, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    28. 11:11:05.503163 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824477696, win 1495, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    29. 11:11:05.503169 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824477696:3824478720, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    30. 11:11:05.503171 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824478720, win 1511, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    31. 11:11:05.503177 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824478720:3824479744, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    32. 11:11:05.503179 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824479744, win 1527, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    33. 11:11:05.503185 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824479744:3824480768, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    34. 11:11:05.503186 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824480768, win 1543, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    35. 11:11:05.503193 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824480768:3824481792, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    36. 11:11:05.503195 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824481792, win 1559, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    37. 11:11:05.503201 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824481792:3824482816, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    38. 11:11:05.503203 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824482816, win 1575, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    39. 11:11:05.503209 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824482816:3824483840, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    40. 11:11:05.503211 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [.], ack 3824483840, win 1591, options [nop,nop,TS val 2727838937 ecr 2727838937], length 0
    41. 11:11:05.503217 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [P.], seq 3824483840:3824484864, ack 543068498, win 355, options [nop,nop,TS val 2727838937 ecr 2727838937], length 1024
    42. 11:11:05.504534 IP 10.0.8.11.60774 > 10.0.8.11.82: Flags [F.], seq 543068498, ack 3824495906, win 1783, options [nop,nop,TS val 2727838938 ecr 2727838937], length 0
    43. 11:11:05.504540 IP 10.0.8.11.82 > 10.0.8.11.60774: Flags [.], ack 543068499, win 355, options [nop,nop,TS val 2727838938 ecr 2727838938], length 0

    4. TCP窗口机制:

    4.1  窗口机制的由来与概念:

    如果每次传输数据只能发送一个MSS,就等待接收方的ACK,会极大的影响传输的速率。所以在发送数据时,最好将所有的数据全部发送出去,然后再一起确认。但是现实中确实会存在一些限制:

      • 接收方的缓存(接收窗口)可能已经满了,无法接收数据。
      • 网络的带宽也不一定足够大,一次发太多会导致丢包事故。

    一次性能发送的数据量就是TCP的发送窗口。(TCP窗口的概念)

    TCP在进行数据传输时,都是先将数据放在数据缓冲区中,TCP维护了两个缓冲区,发送方缓冲区和接收方缓冲区。

      • 发送方缓冲区:用于存储"已经准备就绪数据"和"发送了但是没有被确认"的数据。
      • 接收方缓冲区:用于存储"已经被接收但是还没有被用户进程消费"的数据。

    4.2 窗口分类:

    • 固定的窗口,窗口大小是指我们一次传输几个数据。
    • 滑动的窗口

    4.3 滑动窗口机制:

    滑动窗口机制是TCP的一种流量控制方法,该机制允许发送方,在停止并等待确认前,连续发送多个分组,而不必每发送一个分组就停下来等待确认,从而增加数据传输的速率,提高应用的吞吐量。

    滑动窗口下,TCP包的四种状态:
    • 已发送并且已经确认的包。
    • 已发送但是没有确认的包。
    • 未发送但是可以发送的包。
    • 不允许被发送的包。
    滑动窗口下,几个窗口的概念:
    • 接收方窗口:由接收方通告窗口的大小,这个窗口称为提出窗口,也成接收方窗口。接收方提出的窗口,受被接收的缓冲区影响,如果数据没有被用户进程使用,那么接收方通告的窗口就会相应得到减小。
    • 发送窗口取决于接收方窗口的大小。
    • 可用窗口的大小 = 接收方窗口的大小 - 发送但是没有被确认的数据包大小。

    滑动窗口机制示意流量图:

    滑动窗口的动态性:

    零窗口(TCP Zero Window):

    在接收方窗口大小变为0的时候,发送方就不能再发送数据了。但是当接收方窗口恢复的时候发送方要怎么知道那?在这个时候TCP会启动一个零窗口(TCP Zero Window)定时探测器,向接收方询问窗口大小,当接收方窗口恢复的时候,就可以再次发送数据。

     参考文章:https://blog.csdn.net/weixin_39666931/article/details/111108341

  • 相关阅读:
    WPF/C#:显示分组数据的两种方式
    Obsidian+SyncTrayzor打造个人文档云同步平台
    Spring系列文章:Bean的作⽤域
    BGP路由优选+EVPN
    如何拉取钉钉的外出、出差审批单
    React整理总结(三)
    CentOS上安装Docker
    5.软件测试-----自动化测试
    一、docker简介及卸载、安装
    CDH6在安装agent时,提示安装失败无法接收 Agent发出的检测信号
  • 原文地址:https://blog.csdn.net/huantai3334/article/details/139652642