TCP/IP详解 卷一笔记

TCP/IP详解

    • 概论
    • Internet 地址结构
    • 链路层
    • ARP
    • IP
    • DHCP
    • NAT
    • ICMP
    • 广播和组播
    • UDP
    • DNS
  • TCP报文
    • tcp连接
    • tcp超时重传
    • tcp流量控制
    • tcp拥塞控制
    • tcp保活机制

概论

  • 分层体系结构优点:
    • 每层只负责通信的一个方面,分层设计允许开发人员可以分别实现系统的不同部分。
    • 具有协议复用的能力。这种协议复用形式允许多种协议共存于同一基础设施中。
    • 在单纯的分层中,并不是所有网络设备都需要实现所有层
  • 网络层之上使用端到端协议。
  • 路由器有两个或更多的网络接口(由于它们连接两个或多个网络)。有多个接口的系统称为多宿主。
  • ARP:IPv4专用协议,完成IP层使用地址和链路层使用地址之间的转换。
  • ICMP:IP的一个辅助协议,IP层利用它与其他主机或路由器的IP之间交换差错信息和其他重要信息。
  • DCCP数据报拥塞服务:面向连接、不可靠的数据报交换,但具有拥塞控制功能。
  • SCTP流控制传输协议:类似于TCP的可靠交付,但并不严格保证数据的顺序,还允许多个数据流逻辑上在一个连接上传输。

Internet 地址结构

  • CIDR
    • 路由聚合:通过将相邻的多个IP前缀合并为一个短前缀,可以覆盖更多地址空间
  • IPv4地址可以嵌入IPv6地址中,形成一个嵌入IPv4的IPv6地址。
  • 组播:一个组所覆盖的网络部分称为组的范围
    • 节点本地:同一计算机
    • 链路本地:同一子网
    • 站点本地:适用于一些站点
    • 全球:整个Internet
    • 管理:一个网络区域内手动配置到路由器的地址。
  • IPv6单播地址与IPv4地址有所不同。最重要的是,IPv6地址有一个范围的概念,无论是单播还是组播,都需要明确指出地址的有效范围。典型的范围包括节点本地、链路本地和全球范围。链路本地地址通常基于一个标准前缀和一个IID创建,这个IID可由底层协议(例如硬件MAC地址)基于地址提供或取随机值。这种方法有助于自动配置IPv6地址。

链路层

  • 带冲突检测的载波侦听多路访问CSMA/CD:多个站共享同一网络。
  • 交换机为以太网中的每个站提供同时发送和接收数据的能力(全双工以太网)。
  • 以太网帧大小:
    • 最小为64字节,要求数据区(有效载荷)长度(无标签)最小为48字节。当有效载荷较小时,填充字段被添加到有效载荷尾部,以确保达到最小长度。
    • 传统以太网帧最大长度为1518字节(包括4字节CRC和14字节头部)
    • 以太网巨型帧:超过9000字节,它是一种非标准的以太网扩展,主要在1000Mb/s以太网交换机中使用。
  • 无线局域网
    • 管理帧:创建、维持、终止站和接入点之间的连接。
    • 控制帧:请求发送/明确发送(RTS/CTS)。控制帧和帧确认被用于一种流量控制。
      • 当RTS/CTS启用时,一个站在发送数据帧之前发送一个RTS帧,当接收方愿意接受额外的流量时,它会响应一个CTS帧。在RTS/CTS交换之后,这个站开启一个时间窗口(在CTS帧中标识),用于向确认接收的站发送数据帧。
      • 802.11采用一种重传/确认(ACK)方法来扩展802.3重传机制。确认是对预期在一定时间内接收的一个单播帧或一组帧的响应。组播或广播帧没有相关确认,以避免出现"ACK爆炸"问题。
    • 数据帧:分片【单播帧,4位分片好,最多15个分片】和聚合
  • PPP点到点协议:串行链路上传输IP数据报的方法。PPP的LCP【链路控制协议】用于点到点链路上建立和维护低层的双方通信路径。因此,PPP操作只需关注一条链路的两端,它不需要像以太网和wifi的MAC层协议那样处理共享资源访问。
  • MTU链路传输单元。在整个网络路径的链路上,最小的MTU称为路径MTU。

ARP

  • IPv6使用ICMPv6邻居请求消息发现底层MAC地址
  • ARP向共享的链路层网段所有主机发送一个ARP请求的链路层广播,接收ARP请求的主机学习IPv4到MAC地址的映射,并记录在内存中供以后使用。使用请求中指出IPv4地址的主机,响应一个ARP应答。
  • ARP用于运行IPv4的多接入链路层网络,每个主机都有自己首选的硬件地址。点到点链路不使用ARP。
  • ARP高效运行是由于每个主机和路由器上的ARP缓存。 arp -a
  • 代理ARP:使一个系统(通常是专门配置的路由器)可回答不同主机的ARP请求。它使ARP请求的发送者认为做出响应的系统就是目的主机。
  • 免费ARP:一台主机发送ARP请求以寻找自己的地址。
    • 允许一台主机确定另一台主机是否配置相同的IPv4地址。发送免费ARP的主机并不期望它的请求获得应答。但是如果收到应答,则说明存在重复地址
    • 如果发送免费ARP的主机改变网络地址,该帧导致任何接收广播并且其缓存中有该条目的主机,更新为该帧一致。
  • 地址冲突检测ACD:
    • ARP探测分组:发送方协议字段设为0.用于查看ip是否被广播域的任何其他系统所使用。
    • ARP通告分组:发送协议地址和接收协议地址填充为候选IPv4地址外。它用于通告发送方使用候选IPv4的意图。

IP

  • IP提供一种尽力而为、无连接的数据报交付服务。"无连接"意味着IP不维护网络单元(即路由器)中数据报相关的任何链接状态信息,每个数据报独立于其他数据报来处理。也意味着可不按顺序交付。

  • IPv4 TCP/IP详解 卷一笔记_第1张图片

    • IHL:头部长度,4位,最多15个32位字。60字节。
    • DS区分服务字段:
    • 显示拥塞通知ECN:一台持续拥塞的具有ECN感知能力的路由器在转发分组时会设置这两位。当一个被标记的分组被目的节点接收时,有些协议(如TCP)会发现分组被标记并将这种情况通知发送方,发送方随后哦会降低发送速度。
    • 总长度:IPv4数据报的总长度,包含IHL。以太网最小有效载荷为46字节(46+18=64),但一个ip数据报也可能更小(20字节),如果没有提供总长度字段,IPv4实现将无法知道一个46字节的以太网帧是一个IP数据报,还是经过填充的IP数据报,这样可能导致混淆。
    • IPv4链路路径MTU最小为576字节.
    • 标识字段帮助标识IPv4主机发送的数据报。发送主机通常在每次发送一个数据报时都将一个内部计数器加1,并将该计数器值复制到IPv4标识字段。这个字段对实现分片很重要。
    • 头部校验和字段仅计算IPv4头部,这也意味着IP协议不检查有效载荷的正确性,其他协议(如TCP)必须自己校验数据完整性。每过一台TTL字段减一,校验和需要重新计算。
    • 协议字段表示数据报有效载荷部分的数据类型
  • IPv6 TCP/IP详解 卷一笔记_第2张图片

    • 头部长度固定长度40字节
    • 负载限制为64KB,而不是整个数据报。在IPv6中,链路层最小链路MTU为1280字节。
    • 下一个头部给出IPv4的协议字段
    • IPv6仅发送者可以执行分片操作,下一个头部分片数据。IPv4任何主机和路由器均可。
  • IP转发

    • 对于一台主机,如果目的地是直接相连的主机或共享网络,IP数据报直接发送到目的地,不需要路由器。否则,主机将数据报发送到一台路由器(默认路由器),由该路由器将数据报交付到目的地。
    • 主机和路由器处理数据报的区别在于:主机不转发那些不是由它生成的数据报,但是路由器会这样做。
    • 转发表:
      • 目的地:用于与掩码操作结果相匹配
      • 掩码:用做数据报目的IP地址按位与操作的掩码,其中的目的IP地址是要在转发表中查找的地址。掩码结果与转发表中的多个目的地进行比较。
      • 下一跳【网关】:它是下一个IP实体(路由器或主机)的IP地址,数据报将被转发到该地址。
      • 接口:它包含一个由IP层使用的标识符,以确定将数据报发送到下一跳的网络接口(无线接口 以太网接口 串行PPP接口)。
    • IP转发过程中,源ip和目的地ip从不改变,除非在使用源路由的情况下或者其他功能(如NAT)。不同的底层头部用于每种链路上的寻址,底层目的地址总是包含下一跳的底层地址。因此,当数据报沿着目的地每个跳步移动时,底层头部经常变动。
  • 强主机模式下,只允许每个接口接收或发送包含该接口相关的数据报,而弱主机模式则不限制。

  • 大端(Big-Endian),小端(Little-Endian)以及网络字节序的概念在编程中经常会遇到,网络字节序(Network Byte Order)一般是指大端(Big-Endian,对大部分网络传输协议而言)传输,大端小端的概念是面向多字节数据类型的存储方式定义的,小端就是低位在前(低位字节存在内存低地址,字节高低顺序和内存高低地址顺序相同),大端就是高位在前,(其中“前”是指靠近内存低地址,存储在硬盘上就是先写那个字节)。概念上字节序也叫主机序。

DHCP

  • 主要组成部分:地址管理和配置数据交互。

  • DHCPv4过程:

    • 客户机首先广播一个DHCPDESCOVER消息
    • 服务器接收到会响应DHCPOFFER消息,并在"Your Client"IP地址字段中包含提供的IP地址。
    • 当接受到一个或多个DHCP服务器的DHCPOFFER消息后,客户机确认自己想接受那个DHCPOFFER,并广播一个包括服务器标识符选项的DHCPREQUEST消息。请求的IP地址选项设置为由选中的DHCPOFFER消息提供的地址。
    • 多台DHCP服务器可能接收到DHCPREQUEST消息,但是只有DHCPREQUEST消息中标识的服务器统一该地址进行绑定;其他服务器清除请求状态。在完成绑定后,该服务器响应一个DHCPACK消息。
    • 当客户机接到DHCPACK消息和其他相关配置信息时,它可探查网络以确保获得的地址未使用(如,向该地址发送一个ARP请求以执行ACD)。如果客户机该地址已被使用,客户机不使用该地址,并向服务器发送一个DHCPDECLINE消息,通知该地址不可用。等10s,客户机重试。
    • 在客户机已有一个IP地址并希望仅更新其租约的情况下,它可跳过最初的DHCPDISCOVER/DHCPOFFER消息。直接发送DHCPREQUEST消息
    • 释放租约:dhclient -r;更新租约 dhclient
  • DHCPv6:有状态模式,其工作原理非常像DHCPv4,为请求的客户机提供IPv6地址。在无状态模式下,IPv6客户机认为自己能配置IPv6地址,但需要通过DHCPv6获取额外信息(如DNS服务器)。另一种选择可使用ICMPv6路由器通告信息。

    • IPv6主机的每个接口通常拥有多个地址,并且每个地址都拥有一组计时器,以指出相应地址可使用多长时间和用于什么目的。在IPv6中,地址分配包含一个首选生命周期和一个有效生命周期。这些生命周期用于判断超时,降低至在自己的状态机中从一种状态转换到另一种状态。

    • ipv6生命周期TCP/IP详解 卷一笔记_第3张图片

      • 当一个地址处于首选状态时,可用作源或目的IPv6地址
      • 地址处于废弃状态时,它仍可用于现有传输连接,但不能启动新的连接。
      • 当一个地址第一次被选择使用时,它进入一个临时或乐观状态。在处于临时状态时,它可能仅用于IPv6邻居发现协议。此时它不可用作任何目的地的源或目的地址。同时,该状态的地址要检测重复,看看同一网络中其他节点是否已使用该地址。这个过程称为重复地址检测(DAD).
      • 常规DAD替代方案称为乐观DAD,通过它选择的地址可用于一组有限的用途,直至DAD完成。因为一个乐观状态的地址实际上仅是针对DAD的一组特殊规则,它不是一个完整的状态。乐观地址对大多数目的而言是废弃的。特别是,一个地址可能同时是乐观的和废弃的,这取决于首选和有效生命周期。
    • DHCPv6使用IPv6组播方式,DHCPv4使用广播。

    • 身份关联(IA)是用在DHCP客户机和服务器之间的一个标识符,用于指向一个地址集。每个IA包括一个IA标识符(IAID)和相关配置信息。每个请求DHCPv6分配地址的客户机接口至少需要一个IA。每个IA可以仅与一个接口相关联。客户机选择的IAID唯一地标识每个IA,并将这个值与服务器共享。当服务器响应一个请求时,它为客户机的IA分配一个或多个地址,策略基于服务器管理员确定的一组分配策略。

    • DHCP唯一标识符DUID:用于标识一台DHCPv6客户机或服务器,并被设计为可持续一段时间。

    • TCP/IP详解 卷一笔记_第4张图片

    • 路由器通告包括两个重要的位字段:M位是可管理地址配置标志,表示IPv6地址可使用DHCPv6获取。O位是其他配置标志,表示IPv6地址之外的其他信息可使用DHCPv6获得。如果两者都关闭,则不使用DHCPv6,并在分配地址时使用无状态地址自动分配。M位关闭和O位启用表示客户机使用无状态DHCPv6,并使用无状态地址自动配置获得地址。

    • 无状态地址自动配置SLAAC

      • 获取一个链路本地地址。没有路由器的环境下,只分配链路本地地址。
      • 使用无状态自动配置获取全球地址。当路由器存在时,由一个路由器通告的前缀和本地产生的信息组合成一个全球地址。SLAAC也可结合DHCPv6使用,以允许一台主机获得除自己地址外的其他信息。
      • 检查链路本地地址是否已在链路中使用。IPv6 DAD使用ICMPv6邻居请求和邻居通告信息,以确定一个特定(临时或乐观)IPv6地址是否已在连接链路中使用。

NAT

  • 传统的NAT
    • 基本的NAT:重写IP地址,端口号不变。本质上就是将私有地址改写为一个公有地址。
    • 网络地址端口转换NAPT:使用传输层标识符来确定一个特定的数据包到底和NAT内部的哪台私有主机关联。这使得大量的内部主机能够同时访问互联网。而使用的共有地址却很少
  • TCP NAT:
    • NAT session:NAT创建一个内部状态记住当前正在处理的一个新连接。这种状态至少包括一个由客户端的源端口号和IP地址组成的条目(NAT 映射(NAT mapping))。当Internet服务器回复时,会采用客户端初始使用的端口号来回复,即NAT的外部地址。这种行为被称为端口保留port preservation。
    • NAT session清除:NAT检测到一个传出的SYN数据包后激活连接计数器connection timer,如果回复的ACK数据包在计时器到期之前还未到达,则该会话状态将被清除。否则,计时器将清除,并创建一个超时较长的会话计时器session timer;这种情况下,NAT可能会向内部端点发送一个额外的数据包探测,如果收到ACK,则重置会话计时器,并不会删除会话。如果没有收到响应(关闭计时器 close timer超时之后)或者收到一个RST数据包,则连接终止,状态清除。
  • UDP NAT:行为和TCP NAT类似。但是由于没有连接,UDP NAT采用一个映射计时器(mapping timer)来清除NAT的状态。
  • NAT 行为
    • 独立于端点的:只要为内部主机建立了映射,无论来源如何,都将允许任何传入的流量。
    • 依赖于地址的:只有内部主机X1:x1和外部主机Y1连接上时,才允许Y1:y1传输流量到X1:x1
    • 依赖于地址和端口的:只有内部主机X1:x1和外部主机Y1:y1连接上时,才允许Y1:y1传输流量到X1:x1
  • 端口转发:通常采用转发到的服务器的地址和端口号来静态配置NAT
  • NAT打孔:如果NAT独立于端点,通过一个远端服务器器,交换NAT信息就可以直接通信。如果是基于地址或地址和端口的,则无效。

ICMP

  • ICMP负责传递可能需要注意的差错和控制报文。ICMPv6还用于邻居发现(Neighbor Discovery)ND,与IPv4中的ARP起同样的作用;还包括配置主机和管理组播地址的路由器发现(Router Discovery)功能。

  • 对于ICMPv4,信息类报文包括回显请求(类型8)和回显应答(类型0),以及路由器通告(9)和路由器请求(10);最常见的差错报文类型包括目的不可达(3)、重定向(5)、超时(11)和参数问题(12)

  • ICMPv6类型从0到127的都是差错报文,类型从128到255的都是信息类报文。

  • 处理ICMP报文:一般说来,传入的信息类请求将被操作系统自动处理,而差错报文传递给用户进程或传输层协议,如TCP。进程可以选择对它们采取行动或忽略它们。这个一般情况的例外情况包括重定向报文和目的不可达–需要分片报文,前者导致主机路由表中的自动更新,而后者用于路径MTU(PMTUD)机制。

  • 移动前缀请求/通告(ICMPv6类型146/147):移动前缀请求报文是当一个节点的本地地址变为无效时,用于从HA处请求一个路有前缀更新。移动前缀通告报文是设计用来通知一个移动中的节点其本地前缀已经改变了。

  • 组播侦听发现MLD 查询/报告/完成(ICMPv6 130/131/132):让组播路由器了解与它们相连的每个链路上主机使用的组播地址。

  • 组播路由器发现MRD:定义了特殊报文可以和ICMPv6和IGMP一起使用,用来发现能够转发组播数据包和她们的一些配置参数的路由器。

  • IPv6邻居发现协议(简称NDP或ND)将路由器发现和由ARP提供的带有地址映射功能的ICMPv4重定向机制结合在一起。

    • ND被设计允许在同一个链路或者网段的节点(路由器或主机)找到彼此,确定它们之间是否有双向连通性,确定一个邻居是否变得不合作或不可用。它也支持无状态的地址自动配置。
    • 邻居请求NS/通告NA:在网络和链路层之间提供类似ARP的映射功能。也检测附近节点是否可达。
      • 邻居请求:手动或通过DHCP服务器或自动配置配置所有IPv6后,主机向其所有IPv6地址的FF02 :: 1/16多播地址发送邻居请求消息命令知道没有人占据相同的地址。
      • DAD(重复地址检测):当主机侦听不到来自段中关于其邻居请求消息的任何内容时,假定段上没有重复地址。
      • 邻居通告:在将地址分配给其接口并使其启动和运行后,主机再次发出邻居通告消息,通知该段上的所有其他主机,它已分配这些IPv6地址 其接口。
    • 路由器请求RS/通告RA:提供包括路由器发现、移动IP代理发现、重定向,以及对一些自动配置的支持。
      • 路由器请求:主机在其段上发送路由器请求组播数据包(FF02 :: 2/16),以了解此段上任何路由器的存在。 它帮助主机将路由器配置为其默认网关。 如果其默认网关路由器关闭,主机可以切换到新的路由器,并使其成为默认网关。
      • 路由器通告:当路由器接收到路由器请求消息时,它回应主机,通告它在该链路上的存在。
      • 重定向:这可能是路由器收到路由器请求,但它知道它不是主机的最佳网关的情况。 在这种情况下,路由器发回一个重定向消息,告诉主机有一个更好的“下一跳"路由器可用。 下一跳是主机将其发送给不属于相同段的主机的数据发送的地方。

广播和组播

  • 广播和组播为应用提供两种服务:数据分组交付到多个目的地,通过客户端请求/发现服务器。
  • 广播:将报文发送到网络中的所有可能接收者。路由器简单地将它接收到的任意报文副本转离(forward out)除报文到达的接口以外的每个接口。
  • 组播:只向对发送方感兴趣的接收方发送流量。组播状态必须由主机和路由器来保持,以说明那些接收方对哪类流量有兴趣。
  • 互联网组管理协议IGMP和组播侦听发现发现协议MLD定义了两组协议处理规则:
    • 成员主机的工作是自发地报告对组播组合源的兴趣改变,以及相应定期的查询
    • 组播路由器发送查询,以确定了;连接链路上的对于任意组或特定的组和源是否有兴趣。

UDP

  • UDP仅提供服务端口号和校验和。它有差错检测(UDP/IPv4可选,但对UDP/IPv6强制使用)和消息边界保留。
  • UDP报文:源端口号2字节,目的端口号2字节,长度2字节,校验和2字节
  • IP分片:当一个IP数据报分片了,直到目的地才会被重组。原因如下:
    • 在网络中不进行重组要比重组更能减轻路由器转发软件或硬件的负担
    • 同一数据报的不同分片可能经由不同的路径到达相同的目的地。
  • UDP分片,可能导致性能问题,因为如果一个分片丢失了,整个数据报就丢失了

DNS

  • DNS查询 递归查询 TCP/IP详解 卷一笔记_第5张图片

  • DNS协议:用于执行对DNS特定名称查询的查询/响应协议和名称服务器用于交换数据库记录的协议(区域传输)

  • 名称服务器(name server)或是DNS服务器(DNS server):存储名称空间相关信息。

  • 缓存:大部分的名称服务器(除了一些根服务器和TLD服务器)也缓存它们学习的区域信息,直到TTL生存时间的限制为止。

  • DNS资源记录类型:

    • A IPv4地址记录
    > host www.gongzicp.com
    www.gongzicp.com has address 39.106.14.121
    
    • AAAA IPv6地址记录
    • CNAME 规范别名记录
    > host -t any www.baidu.com
    www.baidu.com is an alias for www.a.shifen.com.
    
    • PTR 逆向DNS查询
    • MX 邮件交换记录
  • DNS区域传输:允许冗余的从服务器与主服务器同步区域内容

    • 完整区域传输AXFR和增量区域传输IXFR
    • 从服务器定期检查主服务器,查看区域是否更新。轮询
    • DNS NOTIFY允许修改区域内容的服务器通知从服务器更新已经发生,区域传输应该启动。
  • DNS动态更新:允许在线协议修改区域的内容

    • 标准化
    • 非标准化流行的动态DNS功能:允许用户分配临时IP来获得一个DNS条目。
  • DNS攻击

    • Dos攻击:使得DNS仅有有限的能力
    • DNS缓存中毒攻击:使得恶意的服务器显得如合法的

TCP报文

  • TCP/IP详解 卷一笔记_第6张图片

    • CWR 拥塞窗口减少(发送方降低它的发送速率)
    • ECE ECN回显(发送方接收到了一个更早的拥塞通告)

tcp连接

  • 三次握手,四次挥手
  • TIME_WAIT:当TCP执行一个主动关闭并发送最终的ACK时,连接必须处于TIME_WAIT状态并且持续两倍于最大生存期的时间。这样就能让TCP重新发送最终的ACK以避免出现丢失的情况。重新发送最终的ACK并不是因为TCP重传了ACK(它们不消耗序列号,也不会被重传),而是因为通信另一方重传了它的FIN(它消耗一个序列号)。
  • 终止一个连接:
    • 有序释放:发送一个FIN。因为FIN是在之前所有数据都已发送后才发送出去的,通常不会出现丢失数据的情况。
    • 终止释放:发送一个重置报文RST。
      • 任何排队的数据都将被抛弃,一个重置报文会立即发出去
      • 重置报文段的接收方会说明通信另一端采用了终止的方式而不是一次正常关闭
  • 连接队列
    • 当一个连接请求到达时(SYN报文段),将会检查系统范围的参数net.ipv4.tcp_max_syn_backlog(default 1000)。如果处于SYN_RCVD状态的连接数目超过这一阈值,进入的连接将会被拒绝。
    • 【ACCEPT】每一个处于侦听状态下的节点都拥有一个固定长度的连接队列。其中连接已经被TCP完全接受(即3次握手已经完成),但未被应用程序接受。未完成连接backlog,最大值称为net.core.somaxconn,默认值为128.

tcp超时重传

  • 两种机制:基于时间和基于确认信息
    • 重传超时RTO:TCP在发送数据时会设置一个计时器,若至计时器超时仍未收到ack,会引发基于计数器的重传.
      • 降低发送窗口,降低发送包速率
      • 重传报文被再一次重传时,增加RTO退避因子。如1,2,4,8.Linux RTO最大上限为TCP_RTO_MAX 120s。
    • 快速重传:TCP发送端在观测到至少dupthresh【重复ACk阈值 默认为3】个重复ACK后,即重传可能丢失的数据分组。
      • 若TCP累计确认无法返回新的ACK或者当ACK包含的选择确认信息(SACK)表明失序报文段时,快速重传会推断出丢包。
  • SACK:接收方就可以通过SACK选项告诉发送方字节的实际接收情况

tcp流量控制

  • 基于ACK数据包中的通告窗口大小字段完成对发送速率的调节。
  • 交互式通信。SSH
  • 延时确认:累计确认可以允许TCP延迟一段时间发送ACK,以便将ACK和相同方向上需要传输的数据结合发送。限制最大延时时长,免得引起不必要的超时重传
  • Nagle算法:当一个TCP连接在传数据(已发送未确认的数据),小的报文段(长度小于SMSS)就不能被发送,直到所有的在传数据都收到ACK。并且,在收到ACK后,TCP需要收集这些小数据,将其整合到一个报文段中发送。ACK返回越快,数据传输也越快。传输的包数目更少而长度更大,但同时传输时延也更长
  • 延迟确认和Nagle会构成短暂的死锁。TCP/IP详解 卷一笔记_第7张图片
  • TCP通过其发送的每个ACK中包含一个窗口通告来实现流量控制。该窗口告知对方还有多少缓存空间。通告窗口为0,表明接收端缓存已满。这时发送端停止发送,并以一定间隔不断地发送窗口探测,发送间隔类似于超时重传,直到收到的ACK表明窗口已变大。
  • 糊涂窗口综合征SWS:当通告窗口较小时,发送端会立即发送数据填满该窗口,这样连接中就出现大量高耗费的小数据包。
    • 解决策略:对发送端来说,若通告窗口较小则避免发送小数据包;接收端则尽量避免通告小窗口。

tcp拥塞控制

  • 路由器因为无法处理高速到达的流量而被迫丢弃数据信息的现象称为拥塞。
  • 反应网络传输能力的变量称为拥塞窗口cwnd(congestion window),发送端实际可用窗口W就是接收端通知窗口awnd和拥塞窗口的较小值。由于网络变化,cwnd和awnd的值会随之变化。W的值最好接近带宽延迟积【RTT乘以链路的最小通行速率】。
  • TCP发送方的拥塞控制操作是由ACK接收来驱动或"控制"的。
  • 慢启动:当一个新的TCP连接建立或检测到由重传超时RTO导致的丢包时,需要执行慢启动。慢启动阶段每接到一个ack,发两个包。指数增长,当发生丢包时,慢启动阈值(ssthresh)设为此时的一半。cwnd
  • 拥塞避免:一旦确立了慢启动阈值,TCP进入拥塞避免阶段,cwnd每次的增长值近似成功传输的数据段大小。
  • 快速恢复:当收到三次重复ACK,启动快速重传算法,将cwnd减少为一半,每接受一个重复ACK,cwnd加一个 SMSS
  • 拥塞窗口校验CWV:在发送长时间暂停的情况,ssthresh不变,如果由于空闲导致(无包可发),cwnd显著减少,如果是应用受限(cpu处理延迟),cwnd设为cwnd和W_userd平均值,Linux默认启用此机制。

tcp保活机制

  • linux保活参数 sysctl -a|grep net.ipv4.tcp_keepalive
    • net.ipv4.tcp_keepalive_time = 7200 # 保活时间
    • net.ipv4.tcp_keepalive_intvl = 75 # 保活时间间隔
    • net.ipv4.tcp_keepalive_probes = 9 # 保活探测数
  • 保活功能工作过程中,对端的四种状态。后三种状态最后都会发送重置RST报文到对端
    • 对方主机仍在工作,并且可以到达。发送保活报文,对方响应正常,保活计时器重置。
    • 对方主机已经崩溃,包括已经关闭或正在启动。对方TCP不会响应,在保活时间间隔之后超时。
    • 对方主机崩溃并且已重启。请求段会收到一个对其保活探测报文的响应,但这个响应是一个重置报文段RST。
    • 对方主机仍在工作,但是由于某种原因不能到达请求端(例如网络无法传输,而且ICMP也不能通知)。这种状况与2相同,TCP发送端不能区分,结果都是没有收到探测报文的响应。

你可能感兴趣的:(读书笔记,网络,网络,tcpip,网络通信)