TCP/IP协议族

TCP/IP是一个实现Internet体系结构的协议族,它来源于ARPANET参考模型。

协议族

一系列协议的集合称为一个协议族。

体系结构/参考模型

指定一个协议族中各种协议之间的相互关系并划分需要完成的任务的设计,称为协议族的体系结构或参考模型。

Internet体系结构原则

Internet体系结构应将多种网络互联起来,并在互联网络上同时运行多个应用。

Internet目标列表

  • Internet 通信在网络或网关失效时必须能持续。
  • Internet 必须支持多种类型的通信服务。
  • Internet 体系结构必须兼容多种网络。
  • Internet 体系结构必须允许对其资源的分布式管理。
  • Internet 体系结构必须是经济有效的。
  • Internet 体系结构必须允许低能力主机的连接。
  • Internet 中使用的资源必须是可统计的。

重要方案及结果

分组、连接和数据报

电话网络

直到20世纪60年代,网络的主要概念是基于电话网络的。电话网络是指在通话双方之间建立连接(最初是物理电路),为用户提供一定数量的带宽或容量,进而传输信息的一种网络传输方式。它经历了从模拟网络到数字网络的发展过程,最终保证了一定的可靠性和性能。但是,使用电话网络意味着在一次通话期间,即使用户没有进行任何数据传输,也要为通话付费。

分组交换思想

20世纪60年代出现的一个重要概念是分组交换思想。

分组交换概念

一个分组是包含一定字节数的数字信息块。来自不同来源或发送方的分组之间可以组合,以后也可以分解,这称为多路复用。分组在达到目的地的过程中,需要在交换设备之间传输,并且路径可以改变。

分组交换的优点

  • 网络更有弹性,不用担心网络受到物理攻击
  • 基于统计复用可更好地利用网络链路和交换设备

分组的调度处理方式

当分组交换机收到分组时,分组通常存储在缓存或队列中,以先进先出(FIFO)方式调度处理。

统计复用

统计复用是Internet中用来处理不同来源的混合流量的主要方法,它基于FIFO缓冲区管理和按需调度来实现。

  • 优点

    高利用率:如果网络带宽被使用和有流量通过,那么网络中的每个瓶颈或阻塞点将会繁忙(不是缺点,繁忙代表利用率高)。

  • 缺点

    可预测性有限:分组最终会分散在各处,任何点的收缩都可能造成线路繁忙。

时分复用和静态复用

时分复用和静态复用通常在每个连接上为数据保留一定量的时间或者其它资源,具有更好的可预测性,但无法充分利用网络带宽。最终被数字用户线(DSL)技术和支持Internet连接的电缆调制解调器所取代。

面向连接

面向连接需要在每个交换机中为每个连接存储一些信息或状态。在使用信令协议之前,每个流的状态已经建立,该协议支持连接建立、清除和状态信息。

数据报

数据报是一个特定类型的分组,有关来源和最终目的地的所有识别信息都位于分组中(而不是分组交换机中)。虽然这通常需要较大的数据包,但不需要在交换机中维护连接状态,可用于建立一个无连接的网络,并且没有必要使用复杂的信令协议。

消息边界/记录标记

当一个信息块发送到网络中,这些信息块可能被通信协议保留,也可能不被通信协议保留。大多数数据报协议保存消息边界。

TCP不保留消息边界。

端到端论点和命运共享

端到端论点

“只有在通信系统端角度的应用知识的帮助下,才能完全和正确地实现问题中提到的功能。因此,作为通信自身的一个特点,不可能提供有疑问的功能。”

// TODO 添加内容

命运共享

// TODO 添加内容

差错控制和流量控制

差错控制

在网络中存在数据损坏或丢失的情况。这可能出于各种原因,例如硬件问题、数据传输中被修改、在无线网络中超出范围,以及其它因素。对这种错误的处理称为差错控制。

设计和实现

分层

分层概念基于一个称为开放系统互联标准(OSI)的模型,该模型是由国际标准化组织(ISO)定义的。

ISO定义的OSI七层网络模型

我们最关心的是网络层。

TCP/IP的四层网络模型与OSI七层网络模型的对应关系

分层实现中的复用、分解和封装

复用

复用允许多种协议共存于同一基础设施中,也允许相同协议对象(例如连接)的多个实例同时存在,并且不会被混淆。

分解

协议对象是经过层层封装的,接收方要处理对应协议时,需要对协议对象进行分解,一般通过对应层的PDU中的分解标识符来处理。

分解标识符一般是硬件地址、IP地址和端口号。

封装

当某层的一个PDU(协议处理单元)的对象(分组、消息等)被低层携带时,这个过程称为在相邻低层的封装。封装的本质是,每层都承诺不查看上层的数据,把上层的数据看成不透明、无需解释的信息。

TCP/IP中的复用、分解和封装

以太网帧

以太网帧包含MAC地址和以太网类型字段。

MAC地址

MAC地址即介质访问控制地址,又称链路层地址。唯一标识一个网卡。48位。

以太网类型字段

用于选择处理以太网帧的网络层协议。16位。0x0800表示这个帧包含IPv4数据报。

有效载荷

帧的头部和尾部以外的字节,包含了帧的有效载荷。有效载荷是对接收者有用的信息数据。

端口号

端口号是16位非负整数(范围0~65535)。

熟知端口号: 0~1023

注册端口号: 1024~49151

动态/私有端口号:49152~65535

Internet、内联网和外联网

Internet

小写internet表示使用常见协议族互联的多个网络。

而大写Internet表示可用TCP/IP通信的世界范围的主机集合。Internet是一个internet,反过来说是错的。

内联网

也就是我们说的内网、局域网、企业/公司内网,通过防火墙来实现。

外联网

合作伙伴通过VPN连接到企业内网,这种涉及VPN的网络被称为外联网。

设计应用

C/S结构

即客户端/服务器结构,网络应用被设计为一端是服务器,另一端是客户端。服务器为客户端提供某类服务,例如访问服务器中的文件。

服务器分为两类:迭代和并发。

迭代就是阻塞式的循环处理,用户体验很差,目前很少使用。

并发就是异步服务器,通常使用多线程/异步函数/IOCP来完成。

P2P模式,对等网络

有些应用以更分布式的形式设计,没有专门的服务器,例如Skype(聊天通话软件)、BitTorrent(俗称BT),这种软件称为P2P应用或对等网络。并发的P2P应用接受到传入的请求,确定它是否能响应这个请求,如果不能,将这个请求转发给其他对等方。一组P2P应用共同形成一个应用网络,被称为覆盖网络。迅雷就是基于P2P的BT下载软件,相比一般的下载,P2P更快的原因就在于可以下载其他用户(对等方)已经下载的内容,而不是从文件服务器中下载。一个文件被越多人下载过,下载则越快。这也就是”我为人人,人人为我”的设计思路。

网络API

无论是C/S还是P2P,都需要表述所需的网络操作,进行编程。通常通过网络应用程序编程接口来实现。

常用的网络API为套接字(Socket)/伯克利套接字(Berkeley Socket)。

与Internet体系结构相关的攻击

欺骗

恶意用户在自己发送的每个IP数据报的源地址字段中插入任何IP地址。

Dos与DDos攻击

Dos攻击即拒绝服务攻击,原理是消耗服务器大量资源,造成流量堵塞,以导致合法用户被拒绝服务。

DDos攻击即分布式Dos攻击,利用多台计算机对目标机发起Dos攻击。

未授权访问

也就是以未授权方式访问信息或资源。在网络安全中,进入目标机后往往缺乏管理员权限,此时处于未授权状态,需要提权或者冒充管理员。提权往往是通过获得管理员鉴权信息,进而提升用户等级。冒充管理员则是通过窃取管理员的用户安全证书,来伪装自己是管理员。这种冒充,也就是未授权访问。

小结

网络层和传输层之间的区别

  • 网络层(IP)提供了一个不可靠的数据报服务,必须由Internet中所有可寻址的系统来实现。
  • 传输层(TCP/UDP)为端主机上运行的应用程序提供了端到端服务。TCP提供了带有流量控制、拥塞控制机制的有序可靠的流交付,常用于一般需要保证可靠性的应用,例如网络游戏。UDP提供了高速、不可靠传输,常用于广播/组播,用于视频传输。

DNS

DNS其实就是一个运行在Internet上的分布式数据库应用程序。

IP地址结构

表示IP地址

IP地址目前分为两种:IPv4和IPv6。

IPv4地址

IPv4地址为32位的非负整数,为了方便,采用点分四组表示法来表示,每一组8位。

例如00000001000000100000001100000100用点分四组表示法来表示就是:

先分成四组:00000001000000100000001100000100

然后将每组的二进制转为十进制:1234

然后在每组十进制之间通过.来分隔:1.2.3.4

IPv6地址

IPv6地址长度为IPv4地址长度的4倍,即128位。为了方便,采用8个块来表示,每个块是4个16进制数。块与块之间用:来分隔。

由于IPv6地址很长,自然也有省略的规则:

  • 前导的零必须压缩(例如2001:0db8::0022变成2001:db8::22)
  • ::只能用于影响最大的地方(压缩最多的零),但并不只是针对16位的块。如果多个块中包含等长度的零,顺序靠前的块将被替换为::
  • af的十六进制数应该用小写表示

基本IP地址结构

单播地址

大多数IPv4地址最终被细分为一个地址,用于识别连接Internet或某些专用的内联网的计算机网络接口。这些地址称为单播地址。

分类寻址

地址空间划分涉及五大类:A、B、C、D、E、F。

A类:8位网络号,其中第一位固定为0,其它7位自由。24位主机号。

B类:16位网络号,其中前两位固定为10,其它14位自由。16位主机号。

C类:24位网络号,其中前3位固定为110,其它21位自由。8位主机号。

D类:32位组播地址,其中前四位固定位1110,其它28位自由。

E类:保留,前四位为1111,其它28位自由。

子网寻址

即主机号进而划分为子网ID+主机ID。

例如原本B类地址的16位主机号,设置子网掩码255.255.255.0以后,主机号被划分为了8位子网ID+8位主机ID。这样一个站点被分为了256个子网,一个子网最多包含254个主机(256-2,因为0和255地址无效)。

子网掩码

子网掩码是由一台主机或者路由器使用的分配位,以确定如何从一台主机对应IP地址中获得网络和子网信息。它的长度与IP地址长度相同。

它可以静态配置(路由器)也可以动态配置(DHCP,动态主机配置协议)。

IP地址与子网掩码按位与操作以后可以得到用于路由的地址的网络/子网标识符(前缀)。

例如128.32.1.14使用长度为24的掩码255.255.255.0(/24)通过按位与,得到128.32.1.0/24,即子网标识符。

站点之外的路由器做出路由决策只基于地址的网络号部分,并不需要网络/子网或主机部分。

广播地址

每个IPv4子网中,都有一个特殊的地址作为子网广播地址。

计算过程

子网广播地址的计算过程:

  • 子网掩码取反
  • IP地址与子网掩码取反后的结果进行按位或操作

例如128.32.1.14,子网掩码255.255.255.0计算子网广播地址:

  • 255.255.255.0按位取反,得到0.0.0.255
  • 128.32.1.140.0.0.255进行按位或操作得到128.32.1.255

128.32.1.0/24的子网广播地址为128.32.1.255

定向广播

通过发送目标地址为子网广播地址的IP数据报,路由器进而转发到子网所有的主机,这种广播被称为定向广播,目前出于安全问题,被禁用。

本地网络广播

除了子网广播地址,特殊地址255.255.255.255被保留为本地网络广播地址,它不会被路由器转发,它是通过链路层的广播机制来完成的。

组播地址

一个IP组播地址标识一组主机接口。

任播地址

任播地址是根据发送者位置指向不同主机的单播地址,这种地址常用于发现可能出现在不同位置的网络服务。(最合适、最接近)

链路层

半双工和全双工

半双工

半双工指的是同一时间只能发送或者只能接受的通信方式。

全双工

全双工指的是同一时间既可以发送数据也可以接受数据的通信方式。

冲突检测

CSMA

CSMA,Carrier Sense Multiple Access,即载波监听多路访问,采用先到先得的方式占用信道发送数据,如果多个站同时发送帧,则会产生冲突现象,会造成网络拥堵与性能下降。

CSMA/CD

CSMA/CD,Carrier Sense Multiple Access with Collision Detection,即带冲突检测的载波监听多路访问。工作原理:

  • 如果载波信道上没有数据流动,则任何站都可以发送数据。
  • 检查是否会发生冲突。一旦发生冲突,放弃发送数据,同时立即释放载波信道。
  • 放弃发送以后,随机延时一段时间,再重新争用介质,重新发送帧。

CSMA/CA

CSMA/CA,Carrier Sense Multiple Access with Collision Avoidance,即带冲突避免的载波监听多路访问。工作原理:

  • 首先检测信道是否有使用,如果检测出信道空闲,则等待一段随机时间后,才送出数据。
  • 接收端如果正确收到此帧,则经过一段时间间隔后,向发送端发送确认帧ACK。
  • 发送端收到ACK帧,确定数据正确传输,在经历一段时间间隔后,再发送数据。

WiFi常用CSMA/CA,而非CSMA/CD。

以太网帧

以太网帧主要包含两个MAC地址(目标地址DST和源地址SRC)和有效载荷。

MAC地址

MAC地址是6字节(48位)的地址,是网卡的唯一标识。

环路检测

生成树协议(STP)

STP通过生成树算法,来解决冗余环路拓扑的问题。

快速生成树协议(RSTP)

RSTP改进了STP的算法,比STP更快更高效。

环回

环回机制实现了客户机在同一计算机上的服务器通信。它像是一个真正的网络接口,但实际上是操作系统提供的专用虚拟软件,可通过TCP/IP与同一主机的其它部分通信。

IPv4中,环回地址为127.0.0.1,名称是localhost。

MTU与路径MTU

MTU

PDU的帧大小是有限制的,这种特征被称为最大传输单元(MTU)。在IP中,数据报如果超过链路层MTU,则IP会对数据报进行”分片”操作,使得每个分片都小于MTU。

路径MTU

当两台主机之间跨越多个网络通信时,每条链路可能有不同大小的MTU。在包含所有链路的整个网络路径上,最小的MTU称为路径MTU。

路径MTU发现

路径MTU发现机制可以找到路径MTU,以路径MTU分片,进而减少分片次数,提高效率。

隧道

网络A使用IPv6,网络B使用IPv4,网络C使用IPv6,而网络A经过了网络B与网络C相联,这种情况下就需要使用IP隧道来使得网络A与C可以正常通信。

隧道的原理就是在原有数据报之前加一个IP首部,进而转发。

ARP 地址解析协议

ARP简介

仅知道主机的IP地址是不够的,因为以太网驱动程序需要知道主机的硬件地址(MAC地址),才能进一步发送数据。

对于TCP/IP网络,地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。

ARM仅适用于IPv4,IPv6使用邻居发现协议,它被合并入ICMP。

ARP提供从网络层地址道相关硬件地址的动态映射。动态指它会自动执行,随时间而变化,无需系统管理员重新配置。

ARP 过程

ARP的流程:

  • 向广播域中的所有主机发送ARP请求:”如果你的IP为X.X.X.X,则告诉我你的MAC地址”
  • 域中某主机收到ARP请求,并对请求方传回响应:”你好,我的IP为X.X.X.X,我的MAC地址为X:X:X:X:X:X”
  • 收到请求的主机,进行自学习,将IP和MAC地址的映射关系记录在内存中,方便以后使用(ARP缓存)

ARP缓存超时

ARP一般在20分钟后重新操作。

代理ARP

代理ARP又称混杂ARP或ARP黑客。功能是两个物理网络互相隐蔽自己。一些老旧的不支持子网划分的设备需要采用代理ARP。

免费ARP

免费ARP指的是一台主机发送ARP请求,寻找自己的MAC地址。

ARP相关的攻击

ARP断网攻击:使用代理ARP,实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。

Internet 协议

IP简介

IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP等数据都通过IP数据报传输。

IP提供了一种尽力而为(尽可能地传输IP数据报,不保证IP数据报能成功到达目的地)、无连接的数据报交付服务。

IP的错误处理:丢弃一些数据。任何的可靠性必须由上层(例如TCP)提供。

无连接意味着IP不维护网络单元中数据报相关的任何链接状态信息,每个数据报独立于其他数据报来处理。也就是说IP数据报可以不按照顺序交付,先发的数据报可能后处理。

IP头部

IPv4头部一般是20字节。IPv6头部固定为40字节。

IPv4头部字段

  • 版本号,4位。4代表IPv4,6代表IPv6,还有其他的版本,不过用的很少。
  • IHL,Internet Header Length,即Internet头部长度(32位字(4字节)的数量),4位。限制了IPv4头部长度最多60字节(4*15)。
  • DS,DiffServ,区分服务字段,6位。用于支持Internet上不同类型的服务。
  • ECN,拥塞标识符,2位。一台持续拥塞的具有ECN感知能力的路由器在转发分组时会设置这两位。用于避免或处理网络拥塞。
  • 总长度,16位。表示IPv4数据报的总长度(单位为字节)。可以通过IHL+总长度,得到数据报的数据部分从哪里开始,以及数据部分的长度。
  • TODO

Internet 校验和

Internet校验和是一个16位的数字和,用于检测接受的消息是否与发送的消息匹配。

  • 首先将数据报的校验和字段值设置为0
  • 然后对头部计算16位二进制反码和
  • 将二进制反码和存储在校验和字段中
  • 校验和为0,头部则没有差错,否则头部出现了差错。

对于出现差错的数据报,IPv4会丢弃它,而不是生成差错信息。更高层以某种方式检测丢失的数据报,在必要时重新发送。

IP转发

如果是对等网络或共享网络,IP数据报可以直接发送到目的地,不需要路由器。否则,主机将数据报发送到一台路由器,该路由器将数据报转发交付到目的地。

TODO

防火墙和网络地址转换

防火墙

防火墙是一种能够限制所转发的流量类型的路由器。

包过滤防火墙

包过滤防火墙是一个互联网路由器,能够丢弃符合(或者不符合)特定条件的数据包。

代理防火墙

代理防火墙是一个多宿主的服务器主机,它是TCP和UDP传输关联的终点,通常不会在IP协议层中路由IP数据报。

网络地址转换(NAT)

NAT本质上是一种允许在互联网的不同地方重复使用相同的IP地址集的机制。建立NAT的动机是正在急剧减少的有限IP地址空间。

NAT解决的问题

NAT的引入解决了两个问题:

  • IP地址枯竭
  • 路由可扩展性的担忧

NAT的缺点

NAT的缺点:

  • 需要特殊配置
  • 每个隶属于同一个连接或关联的双向数据包都必须通过相同的NAT,NAT才能工作(因为NAT必须重写每个数据包的寻址信息,以便私有地址空间的系统和Internet主机之间能够正常通信)
  • 修改IP层地址也需要同时修改传输层的校验码
  • 对一些应用协议造成困扰,尤其是在应用层有效载荷中记录IP地址信息的协议(例如FTP)

NAT的原理

NAT的工作原理就是重写通过路由器的数据包的识别信息。它需要重写往一个方向传输的数据包的源IP地址,重写往另一个方向传输的数据包的目的IP地址。

NAT与包过滤

大多数的NAT同时执行转换和包过滤,包过滤的标准取决于NAT的动态状态。

基本NAT与NAPT

基本NAT,重写IP地址,但保持端口号不变。

NAPT(Network Address Port Translation, 网络地址端口转换),又称IP伪装,通常将所有的地址都写到一个地址。它有时必须重写端口号,以免冲突。

NAT的共同策略

几乎允许所有的传出及其返回流量(与传出流量相对应的)通过NAT,但几乎阻断所有传入的新连接请求。此行为抑制了试图确定可利用的活动主机的IP地址”探测”攻击。

NAT与TCP

TODO

用户数据报协议(UDP)和IP分片

UDP

UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。

它提供差错检测,包含端到端的校验和。它仅提供最小功能,使用它的应用程序需要做许多关于数据包如何发送和处理的控制工作。想要保证数据被可靠投递或正确排序,应用程序必须自己实现这些保护功能。

UDP优缺点

缺点:

  • 没有提供差错纠正,不保证传给IP层的数据能够到达目的地
  • 没有协议机制防止高速UDP流量对其他网络用户的消极影响

优点:

  • 开销更小
  • 适合实现广播和组播
  • 应用程序可以选择自己的重传单元

UDP头部

  • 源端口号,2字节
  • 目的端口号,2字节
  • 总长度(头+数据的长度),2字节
  • 校验和,2字节

其中,UDP校验和是经过计算得到的,计算依据自UDP头部的源端口号、目的端口号、伪头部。任何对UDP头部字段的修改,都需要相应修改UDP校验和字段。

总长度字段其实是冗余的,因为UDP/IPv4数据报可以通过IPv4数据报总长度减去IPv4头部长度得到。

UDP校验和

UDP校验和是端到端的传输层校验和。它覆盖了UDP头部、UDP数据和一个伪头部。它由发送方计算得到,由最终目的方校验。它在传输中不会被修改(除非通过一个NAT)。

UDP的校验和是可选的。

UDP的校验和的计算与普通互联网校验和计算类似,但有两个小细节:

  • UDP数据报可以是奇数个字节,所以奇数长度的UDP数据报尾部会被追加一个值为0的填充(虚)字节。虚指的是仅用于计算,而不传送出去。
  • UDP为了验证是否正确到达,计算校验和时会包含一个UDP伪头部,它包含了来自IP头部的源地址和目的地址以及协议或下一个头部字段。它同样仅用于计算,而不传送出去。

名称解析和域名系统(DNS)

DNS

DNS是一个分布式的C/S网络数据库,TCP/IP应用程序使用它来完成主机名称和IP地址之间的映射。

TCP初步

信息避免出错的手段:

  • 差错校正码,即添加一些冗余的比特,使得即使某些比特被毁,真实的信息也能被恢复。
  • 自动重复请求(Automatic Repeat Request, ARQ)。TCP就使用了这种方式进行差错纠正。

ARQ和重传

确认(acknowledgment,ACK),指接收方给发送方发信号以确定自己已经接收到一个分组。

ACK的模式:

  1. 发送方发送一个分组,等待一个ACK。
  2. 接收方接收到分组,回应一个ACK。
  3. 发送方接收到该ACK,再发送另一个分组。

但是这样会存在几个问题:

  • 发送方对一个ACK等待多长时间?
  • 如果ACK丢失了怎么办?
  • 如果分组被接收到了,但是里面有错怎么办?

第一个问题涉及重传超时相关的策略。

第二个问题,采用重发策略,可能会出现分组重复,需要通过序列号来标记,解决重复问题,一旦分组重复,则重复的分组被丢弃。

第三个问题,一般使用校验和来解决。

分组窗口和滑动窗口

分组窗口

分组窗口即已被发送方注入但还没完成确认的分组的集合。

窗口大小

分组窗口中的分组数量称为窗口大小。

滑动窗口协议

滑动窗口(sliding window)协议是一种基于缓冲区的优化策略。

变量窗口:流量控制和拥塞控制

流量控制

流量控制是指接收方跟不上时会强迫发送方慢下来。

基于速率(rate-based)的流量控制

基于速率的流量控制是给发送方指定某个速率,同时确保数据永远不能超过这个速率发送。

适用于应用程序、广播、组播发现等。

基于窗口(window-based)的流量控制

窗口通告/窗口更新:滑动窗口时,让接收方可以通知发送方使用多大的窗口,来动态调整(更新)窗口大小。

拥塞控制

发送方的速率可能超过某个路由器的能力,从而导致丢包。这可以用拥塞控制的流量控制形式来处理。

拥塞控制涉及发送方减低速度以不至于压垮其与接收方之间的网络。

明确发信

使用窗口通告或其他方式,明确地来告诉发送方减慢速度。

隐性发信

根据其他某些依据来猜测是否需要减慢速度。

重传超时

问题

重传超时应该是多大?

直观上看重传超时的量大概是:发送分组所用的时间 + 接收方处理它和发送一个ACK所用的时间 + ACK返回到发送方所用的时间 + 发送方处理ACK所用的时间。

可惜,这些时间都是无法确切知道的。更糟的是它们中的某些或全部会随着来自终端主机或路由器的额外负载的增加而减少而随时改变。

更好的策略——估计

通过统计分析,得到一组RTT样本的均值,作为RTT的估算值,这称为往返时间估计(round-trip-time estimation)。

均值其实也是不太合理的,所以还是存在更多问题,TCP中会实际处理这些问题。

TCP服务模型

TCP提供了面向连接的、可靠字节流服务。

面向连接指的是使用TCP的两个应用程序必须在它们可交换数据之前,通过相互联系来建立一个TCP连接。

TCP没有记录标志或者消息边界。

TCP的可靠性

组包(packetization)

TCP提供了一个字节流接口,TCP必须把一个发送应用程序的字节流转换成一组IP可以携带的分组。这被称为组包。

分组包含序列号,序列号不是分组号,而是每个分组的第一个字节在整个数据流中的字节偏移量。

重新组包(repacketization)

分组在传送中是可变大小的,并允许它们组合,称为重新组包。

报文段(segment)

TCP传给IP的块被称为报文段。

TCP校验和

TCP维持了一个强制的校验和,TCP校验和涉及TCP头部+TCP数据+IP头部。

校验和出现问题的TCP报文段会被丢弃。

重传计时器

TCP发送一组报文段时,它通常设置一个重传计时器,等待对方接收。

ACK的鲁棒性

一个指示字节号N的ACK暗示着所有直到N的字节(但不包含N)已经成功被接收了。

双工服务

TCP给应用程序提供了一种双工服务。数据可以向两个方向流动,两个方向相互独立。

序列号

序列号可以让TCP接收端方便丢弃重复的报文段和记录以杂乱次序到达的报文段。

TCP头部和封装

TCP头部在20~60字节之间。没有选项的TCP头部为20字节,TCP头通常不带选项。

  • 源端口,16位
  • 目的端口,16位
  • 序列号,32位,标识了TCP发送端到接收端的数据流的一个字节,该字节代表着包含该序列号的报文段的数据中的第一个字节(偏移量)。
  • 确认号,32位,也称ACK号或ACK字段,只有在ACK位字段被启动时才有效。包含的值是确认号的发送方期待接收的下一个序列号。即序列号+1。
  • 头部长度,4位。以4字节为单位,故TCP头部最大(2^4 -1) * 4 = 60字节。
  • 填充0(保留),4位
  • CWR,1位。拥塞窗口减(发送方降低它的发送速率)。
  • ECE,1位。ECN回显(发送方接收到了一个更早的拥塞通告)。
  • URG,1位。紧急(紧急指针字段有效)。
  • ACK,1位。确认(确认号字段有效,连接建立以后一般都是启用状态)。
  • PSH,1位。推送(接收方应尽快给应用程序传送这个数据)。
  • RST,1位。重置连接(连接取消,一般是因为错误)。
  • SYN,1位,当建立一个连接时,从客户机发送至服务器的第一个报文段的SYN位字段被启用。这样的报文段称为SYN报文段。
  • FIN,1位。该报文段发送方已经结束向对方发送数据。
  • 窗口大小,16位。限制了窗口最大为65535字节,从而限制了TCP的吞吐能力。
  • TCP校验和,16位。覆盖了TCP头部、数据和IP头部。也是伪头部计算。
  • 紧急指针,16位。仅在URG位字段被设置时有效。
  • 选项,可选,最多40字节。最常见的选项是MSS选项,即最大段大小选项。

端点/套接字(Socket)

一个IP地址和一个端口的组合被称为端点,也被称为套接字(Socket),或者被称为伯克利套接字(Berkeley Socket)。

TCP连接管理

TCP是面向连接的单播协议。发送数据之前,通信双方必须在彼此之间建立一条连接。TCP必须检测并修补所有在IP层产生的数据传输问题,比如丢包、重复以及错误。

连接建立的过程中,通信双方需要交换一些选项,这些选项被认为是连接的参数。选项最大40字节。

TCP连接的建立与终止

TCP连接

一个TCP连接由一对套接字唯一标识(四元组,由客户机IP,客户机端口号,服务机IP,服务机端口号组成)。

TCP连接的三个步骤

一个TCP连接通常分为3个阶段:启动、数据传输(连接已建立)、退出(关闭)。

通过调用connect,来进行TCP连接的建立,这个过程被称为三次握手。

通过调用close,来进行TCP连接的关闭,这个过程被称为四次挥手。

Q: 为什么需要四次挥手?

A: 因为TCP是全双工的,支持半关闭,需要在每个方向单独进行关闭操作。

TCP半关闭

通过调用shutdown(而非close),来进行TCP连接的关闭,这样会进行TCP半关闭操作。

TCP发送FIN段的一方收到ACK段后进入半关闭状态,不会再发送数据,但可以继续接收数据,直到另一方发送FIN段。

两方都通过调用shutdown进行半关闭操作,整个连接才完全关闭。

同时打开和同时关闭

同时打开需要四个报文段(SYN*2、SYN+ACK*2),比三次握手多了一个报文段。

同时关闭需要四个报文段,和四次挥手一样,但区别在于报文段序列是交叉的还是顺序的,同时关闭是交叉的,四次挥手是顺序的。

TCP选项

TCP报文段中允许包含最大40字节的选项。

最大段大小选项

最大段大小(Maximum Segment Size, MSS)是指TCP协议所允许的从对方接收到的最大报文段。

最大段大小只记录TCP数据的字节数,而不包括其他相关的TCP与IP头部。

当建立一条TCP连接时,通信的每一方都要在SYN报文段的MSS选项中说明自己允许的最大段大小。

最大段大小的默认数值是536字节。 IPv4典型最大段大小的值为1460字节。

选择确认选项

通过接收SYN(或者SYN+ACK)报文段中的”允许选择确认”选项,TCP通信方会了解到自身具有了发布SACK信息的能力。

窗口缩放选项

窗口缩放选项(WSCALE或WSOPT)能够有效地将TCP窗口广告字段的范围从16位增加至30位。

时间戳选项与防回绕序列号

时间戳选项

时间戳选项(记作TSOPT或TSopt)要求发送方在每一个报文段中添加2个4字节的时间戳数值。发送方将一个32位(4字节)的数值填充到时间戳数值字段(称为TSV或TSval)作为时间戳选项的第一部分。接收方将会在确认中反应这些数值,允许发送方针对每一个接收到的ACK估算TCP连接的往返时间。接收方将收到的时间戳数值填充到时间戳回显重试字段(称作TSER或TSecr)作为时间戳选项的第二部分。包含时间戳选项,TCP头部会增加10字节(8字节保存两个时间戳数值,另外2个字节用于指明选项的数值与长度)。

时间戳选项使我们获得了更多的往返时间样本,从而提升了精确估算往返时间的能力,更利于处理重传超时。

防回绕序列号

由于序列号为32位字段,超过最大值后会回绕。

防回绕序列号算法会将重新出现的丢弃报文段丢弃。

用户超时选项

用户超时(UTO)选项是一个相对较新的TCP的功能。用户超时数值(也被称为USER_TIMEOUT)指明了TCP发送者在确认对方未能成功接收数据之前愿意等待该数据ACK确认的时间。

认证选项

TCP认证选项(TCP Authentication Option,TCP-AO)使用了一种加密散列算法以及TCP连接双方共同维护的一个秘密值来认证每一个报文段。

TCP的路径最大传输单元发现

数据包太大

可以利用IPv6协议中”数据包太大”(Packet Too Big, PTB)的术语来代表ICMPv4地址不可达(需要分片)或ICMPv6数据包太大的消息。

常规过程

  • 连接建立时,TCP使用对外接口的最大传输单元的最小值,或者根据通信对方声明的最大段大小来选择发送方的最大段大小(SMSS)。

  • 一旦发送方的最大段大小选定了初值,TCP通过这条连接发送的所有IPv4数据报都会对DF位字段进行设置。

  • 如果收到PTB消息,TCP就会减少段的大小,然后用修改过的段大小进行重传。

  • 如果PTB消息中已经包含了下一跳推荐的最大传输单元,段大小的数值可以设置为下一跳最大传输单元的数值减去IPv4(或IPv6)与TCP头部的大小。

  • 如果下一跳最大传输单元的数值不存在,发现者需要尝试多个数值(二分搜索),这会影响到拥塞控制。

  • 由于路由是动态变化的,在减少段大小的数值一段时间后需要尝试一个更大的数值。重新尝试的时间间隔一般为10分钟。

TCP状态转换

TCP状态转换图

TIME_WAIT状态

TIME_WAIT状态又称2MSL等待状态。该状态中,TCP等待两倍的最大段生存期(Maximum Segment Lifetime, MSL)的时间,也称加倍等待。

当TCP执行一个主动关闭并发送最终的ACK时,连接必须处于TIME_WAIT状态并持续两倍于最大生存期的时间。这样就能够让TCP重新发送最终的ACK以避免出现丢失的情况。

TCP总是重传FIN,直到它收到一个最终的ACK。

2MSL的约束

TCP处于TIME_WAIT状态时,通信双方将该连接定义为不可重新使用,任何延迟到达的报文段都将被丢弃。

如果一个端口号被处于2MSL等待状态的任何通信端所用,那么该端口号将不能被再次使用。

客户端主动关闭

客户端主动关闭后立刻重新启动同一个客户端,那么新的客户端也不能重新使用相同的本地端口号。但是这样没什么大问题,因为客户端的端口号是操作系统分配的临时端口号。

服务端主动关闭

服务端主动关闭后立刻重新启动同一个服务端,那么新的服务端不能重新使用相同的本地端口号,如果启动,会提示端口被占用。因为之前的连接处于2MSL,端口号仍然是连接的一部分,而连接被定义为不可重新使用,故需要等到2MSL结束以后,新的服务端才能正常启动。

静默时间

在崩溃或者重启后TCP协议应当在创建新的连接之前等待相当于一个MSL的时间,这段时间被称为静默时间。

然而只有极少数实现了这一点,绝大多数主机在崩溃或者重启后都需要超过一个MSL的时间才能重新启动。

FIN_WAIT_2状态

通信的某一方主动关闭,会发送一个FIN给另一方,当收到另一方传回的ACK后,主动关闭方会进入FIN_WAIT_2状态。

一般情况下,只有当主动关闭方收到另一方的FIN,才会进入TIME_WAIT状态,否则会一直无限等待。

但是,Linux提供了计时器,当处于FIN_WAIT_2状态的一方等待对方FIN的时间超过某阈值后,如果此时连接是空闲的,则它会转移到CLOSED状态。

同时打开与关闭的转换

同时打开:SYN_SENT->SYN_RCVD

同时关闭:FIN_WAIT_1->CLOSING->TIME_WAIT

重置报文段

一般而言,当发现一个到达的报文段对于相关连接而言是不正确时,TCP就会发送一个重置报文段。

不存在的端口的连接请求

当一个连接请求到达本地却没有相关进程在目的端口侦听时,就会产生一个重置报文段。

UDP使用ICMP目的不可达消息来处理。TCP使用重置报文段来处理。

终止一条连接

在任何时刻都可以发送一个重置报文段替代FIN来终止一条连接,这种方式有时被称为终止释放。

  • 任何排队的数据都将被抛弃,一个重置报文段会被立即发送出去(FIN则是在所有排队数据都已发送后才被发送出去)
  • 重置报文段的接收方会说明通信另一端采用了终止的方式而不是一次正常关闭。

接收方会终止连接并通知应用程序当前连接已被重置。这样通常会造成”连接被另一端重置”的错误提示或类似的消息。

半开连接

只要不尝试通过半开连接发送数据,正常工作的一段将不会检测出另一端已经崩溃。

半开连接一般是主机电源突然被切断(或者网线突然被拔了,网线坏了,hhh,总之就是并没有通过主动关闭TCP,而是被动断开了以太网连接),而不是正常关机。

主机(服务端)突然崩溃,此时客户端进入半开状态,只要客户端没有发送数据,它就不知道服务端已经崩溃了。此时重启服务端,客户端发送数据,服务端对接收到的数据一无所知,它对之前的连接啥也不记得了,它(服务端)会回复一个重置报文段,让客户端关闭连接(就好像它对客户端说:”你是谁啊,我们见过吗,你说啥也没用,拜拜!”)。

模拟的时候,重启服务器之前,断开以太网,是为了防止其通过已开启的连接发送一个FIN,因为发送FIN就意味着服务器主动关闭,此时客户端会回应ACK和FIN,服务器再回复ACK,进而双方都关闭,这不是我们所期望的。

时间等待错误

TIME_WAIT期间,如果TCP收到当前连接的一些报文段,或者是更特殊的重置报文段,则它会被破坏,这被称为时间等待错误(TIME-WAIT Assassination, TWA)。

一个重置报文段能”破坏”TIME_WAIT状态并强制使连接提前关闭。目前有很多方法阻止这个问题,包括可以让TIME_WAIT状态忽略重置报文段。

如图,客户端正常关闭,进入TIME_WAIT状态,服务端进入CLOSED状态。如果此时有一个很老的包刚刚才传到客户端,此时客户端会发送最新序列号与ACK号的ACK段给服务器。但是这个连接对于服务器而言已经关闭了,它对这个ACK段一无所知,它没有这条连接的任何信息,它会回复一个重置报文段给客户端,客户端收到这个重置报文段后会关闭,进入CLOSED状态。客户端本来应该等待2MSL后进入CLOSED,但是却被提前关闭。

许多系统规定当处于TIME_WAIT状态时不对重置报文段做出响应,从而避免了这个问题。

TCP服务器选项

TCP服务器大多是并发的,当一个新的连接请求到达服务器时,服务器接受该连接,并调用一个新的进程或者线程(还有IOCP等)来处理新的客户端。

TCP服务器如何使用端口号以及如果处理多个并发客户端至关重要。

TCP端口号

TCP依靠四元组多路分解了获得的报文段。目的IP地址与目的端口号、源IP地址与源端口号,这四元组共同构成了本地与外地节点。

TCP不能仅仅根据目的端口号来决定哪一个进程该得到接收的报文段。处于ESTABLISHED状态的节点不能接收SYN报文段,处于LISTEN状态的节点不能接收数据段。

限制本地IP地址

服务端限制本地IP地址以后,客户端只能将目的地址设为服务端的本地IP地址,才能进行连接。如果目的地址不是服务端的本地IP地址,TCP会拒收连接请求,返回一个重置报文段。应用程序不会察觉这个请求。

限制外部节点

local_IP必须是一个应用于本地系统的单播IP地址。

如果服务器使用IPv6地址绑定了一个端口号,那么也就将该端口号应用于了IPv4地址。

进入连接队列

两种不同的连接队列分别处理两种不同的状态:

  • 连接尚未完成但是已经接收到SYN(处于SYN_RCVD状态)——半连接队列
  • 连接已经完成了三次握手并且处于ESTABLISHED状态,但还未被应用程序接受——全连接队列

规则:

  • 当一个连接请求到达(SYN报文段),将会检查系统范围的参数net.ipv4.tcp_max_syn_backlog(默认为1000)。如果处于SYN_RCVD状态的连接数目超过了这个阈值,进入的连接将会被拒绝。
  • 每一个处于监听状态下的节点都拥有一个固定长度的连接队列。其中的连接已经被TCP完全接受(三次握手已经完成),但未被应用程序接受。应用程序会对这一队列做出限制,通常称为未完成连接(backlog)。backlog的数目必须在0与一个系统指定的最大值之间(net.core.somaxconn,默认为128)。
  • 如果侦听节点的队列种仍然有空间分配给新的连接,TCP模块会应答SYN并完成连接。直到三次握手完成,与侦听节点相关的应用程序才会知道新的连接。当客户端的主动打开操作顺利完成以后,客户端可能会认为服务器已经准备好接收数据,然而服务器上的应用程序此时可能还未收到关于新连接的通知。如果这种情况发生,服务器的TCP模块将会把到来的数据存入队列中。
  • 如果队列中已经没有足够的空间分配给新的连接,TCP将会延迟对SYN做出响应,从而给应用程序一个跟上节奏的机会。

TCP超时与重传

当数据段或确认信息丢失,TCP启动重传操作,重传尚未确认的数据。

TCP拥有两套独立机制来完成重传,一是基于时间,二是基于确认信息的构成。第二种更高效。

重传超时(RTO)

TCP在发送数据时会设置一个计时器,若至计时器超时仍未收到数据确认信息,则会引发相应的超时或基于计时器的重传操作,计时器超时称为重传超时(Retransmission Time Out, RTO)。

每次重传间隔时间会加倍,称为二进制指数退避(binary exponential backoff)。

TCP有两个阈值来决定如何重传同一个报文段:R1和R2。

R1表示TCP在向IP层传递”消极建议”前,愿意尝试重传的次数(或等待时间)。

R2(大于R1)表示TCP应该放弃当前连接的时机。

R1和R2分别至少设为3次和100秒。

SYN段的R2最少设为3分钟

R1和R2是可以被配置的。

Linux中配置

R1通过系统配置变量net.ipv4.tcp_retries1来设置,R2通过系统配置变量net.ipv4.tcp_retries2来设置。变量值为重传次数,而不是以时间为单位。

net.ipv4.tcp_retries1默认值为3。net.ipv4.tcp_retries2默认值为15,对应13~30分钟。

SYN段,net.ipv4.tcp_syn_retriesnet.ipv4.tcp_synack_retries默认为5,限定重传次数。

Windows中配置

R2通过配置表HKLM\System\CurrentControlSet\Services\Tcpip\ParametersTcpMaxDataRetransmissions变量来设置,对应Linux中的net.ipv4.tcp_retries2。默认值为5。

基于计时器的重传

一旦TCP发送端得到了基于时间变化的RTT测量值,就能据此设置RTO,发送报文段时应确保重传计时器设置合理。

每一个TCP连接的发送端不断地设定和取消一个重传计时器;如果没有数据丢失,则不会出现计时器超时。

若在连接设定的RTO内,TCP没有收到被计时报文段的ACK,将会触发超时重传。它通过降低当前数据发送率来对此进行快速响应。

实现这样的操作有两种方式:

  • 基于拥塞控制机制,减小发送窗口大小
  • 每当重传报文段被再次重传时,增大RTO退避因子(γ),RTO = γRTO。通常γ=1,随着多次重传,γ=2,4,8,16,…逐渐翻倍,但它通常不超过最大退避因子的值(Linux中是TCP_RTO_MAX,默认120s),一旦收到相应的ACK,则γ重置为1。

快速重传

快速重传机制基于接收端的反馈信息(接收端告诉发送端失序的包)来引发重传,而非重传计时器的超时。

重复ACK

当接收到失序报文段时,TCP需要立即生成确认信息,即重复ACK,并且失序情况表明在后续数据到达前出现了丢段,即接收端缓存出现了空缺。发送端的工作即为尽快地、高效地填补该空缺。

重复ACK阈值:dupthresh

dupthresh是重复ACK的阈值,默认为3。

具体算法概况

TCP发送端在观测至少dupthresh个重复ACK后,当即重传可能丢失的数据分组,而不必等到重传计时器超时。

不采用SACK,在接收到有效ACK前至多只能重传一个报文段。

采用SACK,ACK可以包含额外信息,使得发送端在每个RTT时间内可以填补多个空缺。

带选择确认的重传

原理

TCP接收端可提供SACK功能,通过TCP头部的累计ACK号字段来描述其接收到的数据。

空缺

ACK号与接收端缓存中的其他数据之间的间隔称为空缺。

失序数据

序列号高于空缺的数据称为失序数据。

SACK选项

SACK选项指定n个块的长度为8n + 2字节,但由于SACK通常和TSOPT选项一起使用,而TSOPT占用10字节,所以SACK在每个ACK中只能包含3个块。

每个块包含两个部分:

  • Left Edge of Block,4字节,代表接收端存储的失序数据的起始序号
  • Right Edge of Block,4字节,代表接收端存储的失序数据的最后一个序列号+1

接收端行为

接收端在TCP建立期间收到SACK许可选项即可生成SACK。通常来说,每当缓存中存在失序数据时,接收端就可生成SACK。

发送端行为

当SACK发送端执行重传时,通常是由于其收到了SACK或重复ACK,它可以选择发送新数据或重传旧数据。SACK信息提供接收端数据或重传旧数据。SACK信息提供接收端数据的序列号范围,因此发送端可据此推断需要重传的空缺数据。最简单的方法是使发送端首先填补接收端的空缺,然后再继续发送新数据。

包失序与包重复

我们希望TCP能区分是出现了失序或重复还是丢失。

失序

失序问题可能存在于TCP连接的正向或反向链路中。

如果发生在反向(ACK)链路,就会使得TCP发送端窗口快速前移,接着又可能收到一些显然重复而应被丢弃的ACK。由于TCP的拥塞控制行为,这种情况会导致发送端出现不必要的流量突发(瞬间的高速发送)行为,影响可用网络带宽。

如果发生在正向链路,TCP可能无法正确识别失序和丢包。当出现严重失序时,TCP会误认为数据已经丢失,导致伪重传,主要来自快速重传算法。任何一个失序的数据包都会生成重复ACK,为了解决大量不必要重传的问题,快速重传仅在达到重复阈值(dupthresh)后才会被触发。

重复

IP协议也可能出现将单个包传输多次的情况。这样会导致有重复的包。

3个重复的包,会导致伪重传(快速重传)。利用SACK(尤其是DSACK)可以简单忽略这个问题。

采用DSACK,每个重复ACK都包含报文段已成功接收的信息,并且没有包含失序数据信息。

与TCP重传相关的攻击

低速率DoS攻击:攻击者向网关或主机发送大量数据,使得受害系统持续处于重传超时的状态。

TCP数据流与窗口管理

交互式通信

ssh或者网络游戏等的通信都属于交互式通信,每次传输的数据段比较小,一般都是几十字节。

对于ssh而言,TCP会把数据字节确认和字节回显同时操作。

每个带数据(长度不为0)的包都将PSH置位。该标志位通常表示发送端缓存为空。也就是说PSH置位的数据包发送完成后,发送端没有其他数据包需要传输。

延时确认

利用TCP累计ACK字段可以实现延时确认。累计确认允许TCP延迟一段时间发送ACK,以便将ACK和相同方向上需要传送的数据结合发送,这叫做捎带传输,经常用于批量数据传输。

Nagle算法

当一个TCP连接中有在传数据(即那些已发送但还未经确认的数据),小的报文段(长度小于SMSS)就不能被发送,直到所有的在传数据都收到ACK。并且,在收到ACK后,TCP需要收集这些小数据,将其整合到一个报文段中发送。

它实现了自时钟(self-clocking)控制:ACK返回越快,数据传输也越快。

延时ACK与Nagle算法结合

如果将延时ACK与Nagle算法直接结合使用,得到的效果可能差强人意。因为可能会出现短暂的死锁,一直持续到延时ACK计时器超时。

禁用Nagle算法

Socket API一般提供设置禁用方法。

Windows可以设置注册表项HKLM\SOFTWARE\Microsoft\MSMQ\Parameters\TCPNoDelay

设为1代表禁用Nagle算法。

流量管理与窗口管理

2021-06-24
Contents
  1. TCP/IP协议族
    1. 协议族
    2. 体系结构/参考模型
  2. Internet体系结构原则
    1. Internet目标列表
    2. 重要方案及结果
      1. 分组、连接和数据报
        1. 电话网络
        2. 分组交换思想
        3. 面向连接
        4. 数据报
        5. 消息边界/记录标记
      2. 端到端论点和命运共享
        1. 端到端论点
        2. 命运共享
      3. 差错控制和流量控制
        1. 差错控制
    3. 设计和实现
      1. 分层
        1. ISO定义的OSI七层网络模型
        2. TCP/IP的四层网络模型与OSI七层网络模型的对应关系
      2. 分层实现中的复用、分解和封装
        1. 复用
        2. 分解
        3. 封装
      3. TCP/IP中的复用、分解和封装
        1. 以太网帧
        2. 有效载荷
        3. 端口号
      4. Internet、内联网和外联网
        1. Internet
        2. 内联网
        3. 外联网
      5. 设计应用
        1. C/S结构
        2. P2P模式,对等网络
        3. 网络API
      6. 与Internet体系结构相关的攻击
        1. 欺骗
        2. Dos与DDos攻击
        3. 未授权访问
    4. 小结
      1. 网络层和传输层之间的区别
      2. DNS
  3. IP地址结构
    1. 表示IP地址
      1. IPv4地址
      2. IPv6地址
    2. 基本IP地址结构
      1. 单播地址
      2. 分类寻址
      3. 子网寻址
      4. 子网掩码
      5. 广播地址
        1. 计算过程
        2. 定向广播
        3. 本地网络广播
      6. 组播地址
      7. 任播地址
  4. 链路层
    1. 半双工和全双工
      1. 半双工
      2. 全双工
    2. 冲突检测
      1. CSMA
      2. CSMA/CD
      3. CSMA/CA
    3. 以太网帧
      1. MAC地址
    4. 环路检测
      1. 生成树协议(STP)
      2. 快速生成树协议(RSTP)
    5. 环回
    6. MTU与路径MTU
      1. MTU
      2. 路径MTU
      3. 路径MTU发现
    7. 隧道
  5. ARP 地址解析协议
    1. ARP简介
    2. ARP 过程
    3. ARP缓存超时
    4. 代理ARP
    5. 免费ARP
    6. ARP相关的攻击
  6. Internet 协议
    1. IP简介
    2. IP头部
      1. IPv4头部字段
      2. Internet 校验和
    3. IP转发
    4. TODO
  7. 防火墙和网络地址转换
    1. 防火墙
      1. 包过滤防火墙
      2. 代理防火墙
    2. 网络地址转换(NAT)
      1. NAT解决的问题
      2. NAT的缺点
      3. NAT的原理
      4. NAT与包过滤
      5. 基本NAT与NAPT
      6. NAT的共同策略
      7. NAT与TCP
  8. 用户数据报协议(UDP)和IP分片
    1. UDP
      1. UDP优缺点
      2. UDP头部
      3. UDP校验和
  9. 名称解析和域名系统(DNS)
    1. DNS
  10. TCP初步
    1. ARQ和重传
    2. 分组窗口和滑动窗口
      1. 分组窗口
      2. 窗口大小
      3. 滑动窗口协议
  11. 变量窗口:流量控制和拥塞控制
    1. 流量控制
      1. 基于速率(rate-based)的流量控制
      2. 基于窗口(window-based)的流量控制
    2. 拥塞控制
      1. 明确发信
      2. 隐性发信
  12. 重传超时
    1. 问题
    2. 更好的策略——估计
  13. TCP服务模型
  14. TCP的可靠性
    1. 组包(packetization)
    2. 重新组包(repacketization)
    3. 报文段(segment)
    4. TCP校验和
    5. 重传计时器
    6. ACK的鲁棒性
    7. 双工服务
    8. 序列号
  15. TCP头部和封装
    1. 端点/套接字(Socket)
  • TCP连接管理
    1. TCP连接的建立与终止
      1. TCP连接
        1. TCP连接的三个步骤
        2. TCP半关闭
        3. 同时打开和同时关闭
    2. TCP选项
      1. 最大段大小选项
      2. 选择确认选项
      3. 窗口缩放选项
      4. 时间戳选项与防回绕序列号
        1. 时间戳选项
        2. 防回绕序列号
      5. 用户超时选项
      6. 认证选项
    3. TCP的路径最大传输单元发现
      1. 数据包太大
      2. 常规过程
    4. TCP状态转换
      1. TCP状态转换图
      2. TIME_WAIT状态
        1. 2MSL的约束
        2. 客户端主动关闭
        3. 服务端主动关闭
      3. 静默时间
      4. FIN_WAIT_2状态
      5. 同时打开与关闭的转换
      6. 重置报文段
        1. 不存在的端口的连接请求
        2. 终止一条连接
        3. 半开连接
        4. 时间等待错误
      7. TCP服务器选项
        1. TCP端口号
        2. 限制本地IP地址
        3. 限制外部节点
        4. 进入连接队列
  • TCP超时与重传
    1. 重传超时(RTO)
      1. Linux中配置
      2. Windows中配置
    2. 基于计时器的重传
    3. 快速重传
      1. 重复ACK
      2. 重复ACK阈值:dupthresh
      3. 具体算法概况
    4. 带选择确认的重传
      1. 原理
      2. 空缺
      3. 失序数据
      4. SACK选项
      5. 接收端行为
      6. 发送端行为
    5. 包失序与包重复
      1. 失序
      2. 重复
    6. 与TCP重传相关的攻击
  • TCP数据流与窗口管理
    1. 交互式通信
    2. 延时确认
    3. Nagle算法
      1. 延时ACK与Nagle算法结合
      2. 禁用Nagle算法
    4. 流量管理与窗口管理

  • ⬆︎TOP