TCP/IP 详解 卷一 一

是的,我又充满血来学习了,而且这次也是啃书,这次是书籍:《TCP/IP详解》

怎么说呢、最近在一直有在面试,在面试的过程中,被问到一些深层次的东西、就会一脸懵逼,这也是我为什么开始下定决心去研究网络协议栈这种东西,但是最开始的想法是跟着《LwIP应用实战开发实战指南》,但是为了之后和小伙伴一起研究,一起学,然后选择了更为详细的《TCP/IP详解》这本书。之前总是没有人一起学习、然后就导致有几本书学到一半就没了动力去学习。

在接下来的学习过程中,我会和小伙伴一起学习,并约定一段时间进行互相提问,然后查看自己的掌握情况如何。在此过程中,我还会单独写一篇博客来记录互相提问的问题。

在此系列中,我会多使用电子书中的原句中放在文章中,但是会在其中穿插个人理解在其中(并不保证其绝对正确),以倾斜加粗的方式显示。

其中除却个人理解部分以及部分图片,均裁剪于原书。如果有些部分部分不甚了解,则可以查看原书第二版以及本人添加的个人理解。

概述

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

本章是对Internet体系结构和TCP/IP协议族的概述,提供了一些历史知识,并为后续章节建立足够的背景支撑。体系结构(协议和物理)实际上是一组设计决策,涉及支持哪些特点和在哪里实现这些特点。设计一个体系结构更多的是艺术而不是科学。

体系结构原则

Internet体系结构在几个目标的指导下建立。在[C88]中, Clark描述首要目标是“发展一种重复利用已有的互联网络的技术” 。这旬话的本质是Internet体系结构应将多种网络互联起来,并在互联的网络上同时运行多个应用。基于这个首要目标, Clark提供了以下的二级目标列表‥

​ ● Internet通信在网络或网关失效时必须能持续。

​ ● Internet必须支持多种类型的通信服务。

​ ● Internet体系结构必须兼容多种网络。

​ ● Internet体系结构必须允许对其资源的分布式管理。

​ ● Internet体系结构必须是经济有效的。

​ ● Internet体系结构必须允许低能力主机的连接。

​ ● Internet中使用的资源必须是可统计的。

上面列出的很多目标将被最终的设计决策所采纳。但是,在制定这些体系结构原则时,这些原则影响到设计者所做的选择,最后少数几种设计方案脱颖而出。

分组、连接和数据报

在分组交换中,包含一定字节数的数字信息“块” (分组)独立通过网络。来自不同来源或发送方的块可以组合,而且以后可以分解,这称为“(多路)复用”。这些块在到达目的地的过程中,需要在交换设备之间传输,并且路径可以改变。这样做有两个潜在的优点‥ 网络更有弹性(设计者不用担心网络受到物理攻击),基于统计复用可更好地利用网络链路和交换设备。

个人理解:这个分组、多路复用主要和总线占用对标。书中与电话网络做对比,即使当前未使用发送任何数据,但是由于电话网络已经被你占用,所以在此情况下,会导致其他需要使用该网络时,也需要等待你通话的结束。但是分组的思想是将所有的数据,分成多组,也就是将你的语音分成多组,当你的发送完毕后,其他使用该网络的人也可以实现数据的发送而不用等待你通话的结束。可大大提高效率。

当一台分组交换机接收到分组时,它们通常存储在缓存或队列中,并通过先到达先服务(FCFS)的方式处理。这是最简单的分组处理调度方式,又称为先进先出(FIFO)。

在统计复用中,流量基于到达的统计或时间模式而混合在一起。这种多路复用是简单而有效的,因为如果网络带宽被使用和有流量通过,那么网络中的每个瓶颈或阻塞点将会繁忙(高利用率)。这种方法的缺点是可预测性有限,通过某些特定应用的性能可看出,它依赖于对共享网络的其他应用的统计。统计复用就像是一条高速公路,车辆可以变换车道,但是最终会分散在备处,任何点的收缩都可能造成道路繁忙。

面向连接的网络是多年来最流行的联网方式。在20世纪60年代后期,数据报作为另一种可选方案而得到发展。数据报起源于CYCLADES[P73]系统,它是一个特定类型的分组,有关来源和最终目的地的所有识别信息都位于分组中(而不是分组交换机中)。虽然这通常需要较大的数据包,但不需要在交换机中维护连接状态,它可用于建立一个无连接的网络,并且没必要使用复杂的信令协议。数据报很快被早期的Internet设计者所接受,这个决定对协议族其他部分有深远影响。

个人理解:将分组的数据,都通过一定的数据包格式包装起来,以用于接收者和发送者实现数据完整正确的发送。

另一个相关的概念是消息边界或记录标记。如图1 ̄1所示,当一个应用将多个信息块发送到网络中,这些信息块可能被通信协议保留,也可能不被通信协议保留。大多数数据报协议保存消息边界。这样设计是很自然的,因为数据报本身有一个开始和结束。但是,在电路交换或虚电路网络中,一个应用程序可能需要发送几块数据,接收程序将所有数据作为一个块或多个块来读取。这些类型的协议不保留消息边界。在底层协议不保留消息边界,而应用程序需要它的情况下,应用程序必须自已来提供这个功能。

消息边界

个人理解:将数据进行分组后,如果有消息边界则在应用程序中读取次数较少。且由于分层的思想,每层完成特定功能的情况下,而不考虑其他问题,因此消息边界大多由应用层来进行添加

端到端论点和命运共享

当我们设计一个大的系统(例如操作系统或协议族)时,随之而来的问题通常是在什么位置实现某个功能。影响TCP/IP协议族设计的一个重要原则称为端到端论点[SRC84]。

端到端论点倾向于支持一种使用“哑”网络和连接到网络的“智能”系统的设计方案。这是我们在TCP/IP设计中所看到的,很多功能(例如,保证数据不丢失、发送方控制发送速率)在端主机的应用程序中实现。选择哪些功能在同一计算机、网络或软件栈中实现,这是另一个称为命运共享的相关原则[C88]。

命运共享建议将所有必要的状态放在通信端点,这些状态用于维护一个活动的通信关联(例如虚拟连接)。由于这个原因,导致通信失效的情况也会导致一个或更多端点失效,这样显然会导致整个通信的失败。命运共享是一种通过虚拟连接(例如,由TcP实现)维持活动的设计理念,即便网络连接在一段时间内失效。命运共享也支持一种“带智能终端主机的哑网络”模型,当前Internet中的矛盾是:哪些功能在网络中实现,哪些功能不在网络中实现。

个人理解:这小节概念不算很懂,这小节则是主要阐述了多台设备在网络中,在其中两个设备之间的通讯出现了问题,而不导致整个网络出现问题。而两个设备这是端到端,同时出现故障或者同时正常运行则称之为命运共享。而保证这一功能的前提是,哪些需要在应用层实现,哪些由网络层实现。

差错控制和流量控制

在网络中存在数据损坏或丢失的情况。这可能出于各种原因,例如硬件间题、数据传输中被修改、在无线网络中超出范围,以及其他因素。对这种错误的处理称为差错控制,以在构成网络基础设施的系统、连接到网络的系统或其他组合中实现。显然,端到端论点和命运共享建议在应用程序附近或内部实现差错控制。当更多严重损坏发生在分组网络时,整个分组通常被重新发送或重新传输。这对那些顺序要求严格和无差错交付的应用是有用的,但有些应用不需要这种功能或不希望为数据可靠交付而付出代价。

针对网络中可靠、按顺序交付的实现开销,帧中继和Internet协议采用一种称为尽力而为交付的服务。如果尽力而为的交付成功,发送方能以超过接收方处理能力的速度生成信息。在尽力而为的IP网络中,降低发送方的发送速度可通过流量控制机制实现,它在网络外部或通信系统高层中运行。注意, TCP会处理这种问题。这与端到端论点一致‥ TCP在端主机中实现速率控制。它也与命运共享一致:这种方案在网络基础设施中有些单元失效的情况下,不会影响网络设备的通信能力(只要有些通信路径仍然可用)。

个人理解:显然,由于各种不可预料的问题,可能导致数据会出现错误,而处理这些错误时,则对于不同的应用场景中,其处理的方式是不同的。而尽力而为的交付则会在TCP中处理。

设计与实现

虽然建议用一个特定方法实现一个协议体系结构,但是这通常不是强制的。因此,我们对协议体系结构和实现体系结构加以区分,实现体系结构定义了协议体系结构中的概念如何用于软件形式的实现中。

很多负责实现ARPANET协议的人员都熟悉操作系统的软件结构,一篇有影响力的论文描述的“ THE”多编程系统[D68],主张使用一种层次结构的处理方式,以检查一个大型软件实现逻辑的稳健性和正确性。最终,这有助于形成一种网络协议的设计理念,它涉及实现(和设计)的多个层次。这种方案现在称为分层,它是实现协议族的常用方案。

分层

通过分层,每层只负责通信的一个方面。采用多层是有益的,这是因为分层设计允许开发人员分别实现系统的不同部分,它们通常由在不同领域的专业人员完成。最常提到的协议分层概念基于一个称为开放系统互连标准(OSI)的模型[Z80],该模型是由国际标准化组织(ISO)定义的。

个人理解:其实之前在工作过程中,已经了解到了任务分层的概念,通过分层,可以实现模块之间的解耦合,减少关联性,在分析问题、解决问题时也可以更加快速。而TCP/IP协议族通过分层,也可以轻易实现协议的增加而不需要修改整体框架,但分层不止于这些优点。例如在无线传输网络的WiFi和网线传输的rj45接口,只需要在物理层和数据链路层进行处理,更高层级的协议则不需要关心底层的实现。这也是异构性

ISO协议分层

在层次结构中,我们对网络层或互联网络层最有兴趣。对于分组网络(例如TCP/IP),它提供了一种可互操作的分组格式,可通过不同类型的链路层网络来连接。本层也包括针对主机的地址方案和用于决定将分组从一台主机发送到另一台主机的路由算法。对于上述3层,我们发现协议(至少在理论上)仅实现在端主机中,这也包括传输层。

我们对传输层也有很大兴趣,它提供了一个会话之间的数据流,而且可能相当复杂,这取决于它提供的服务类型(例如,分组网络的可靠交付可能会丢弃数据)。

会话表示运行中的应用(例如, Cookies用于Web测览器的Web登录会话过程中)之间的交互,会话层协议可提供例如连接初始化和重新启动、增加检查点(保存到目前为止已完成的工作)等功能。

在会话层之上是表示层,它负责信息的格式转换和标准化编码。正如我们所看到的, Internet协议不包括正式的会话层或袁示层,如果需要的话,这些功能由应用程序来实现。

最高层是应用层。备种应用通常会实现自已的应用层协议,它们对用户来说是最容易看到的。目前已存在大量的应用层协议,并且程序员仍在不断开发新协议。因此,应用层是创新最多,以及新功能开发和部署的地方。

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

分层体系结构的一个主要优点是具有协议复用的能力。这种复用形式允许多种协议共存于同一基础设施中。

复用可以发生在不同层,并在每层都有不同类型的标识符,用于确定信息属于哪个协议或信息流。

每层都有自己的消息对象概念。

在某些设备中,也可以只需要实现其中的某些部分。

互联网络的目标之一是对应用隐藏所有关于物理布局(拓扑)和低层协议的异构性的细节。

TCP/IP协议族结构和协议

到目前为止,我们已讨论了体系结构、协议、协议族和抽象的实现技术。在本节中,我们将讨论构成TCP/IP协议族的体系结构和特定协议。虽然这已成为Intenet使用的协议的既定术语,但是也有很多TCP和IP之外的协议被包含在Internet使用的协议集或协议族中。我们将从最终形成Internet协议分层基础的ARPANET参考模型开始,研究它与前面讨论的OSI参考模型的区别。

ARPANET参考模型

TCP/IP协议族采纳。它的结构比OSI模型更简单,但在实现中包括一些特定协议,并且不适合于常规层次的简化。

个人理解:TCP/IP协议族有多种参考模型用于设计

由于电子书的问题,直接截图不清楚,因此此处使用手机拍照

ARPANET参考模型

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

我们已讨论了协议复用、分解和封装的基础内容。每层都会有一个标识符,允许接收方决定哪些协议或数据流可复用在一起。每层通常也有地址信息,它用于保证一个PDU被交付到正确的地方。

PDU的分解

这里使用以太网作为例子。以太网帧包含一个48位的目的地址(又称为链路层或介质访问控制(MAC)地址)和一个16位的以太网类型字段0 0x0800 (十六进制)表示这个帧包含IPv4数据报。 0x0806和0x86DD分别表示ARP和IPv6。假设目的地址与接收方的一个地址匹配,这个帧将被接收并校验差错,以太网类型字段用于选择处理它的网络层协议。

如果接收到的帧包含一个IP数据报,以太网头部和尾部信息将被清除,并将剩余字节(包含帧的有效载荷)交给IP来处理。 IP检测一系列的字段,包括数据报中的目的地址。如果目的地址与自已的一个IP地址匹配,并且数据报头部(IP不检测有效载荷)没有错误,则检测8位的IPv4协议字段(在IPv6中称为下一个头部字段),以决定接下来调用哪个协议来处理。常见的值包括1 (ICMP)、 2 (IGMP)、 4 (IPv4)、 6 (TCP)和17 (UDP)。数值4 (和41,表示IPv6 )的含义是有趣的,因为它表示一个IP数据报可能出现在另一个IP数据报的有效载荷中。它违反了分层和封装的原有概念,但是作为隧道投术的基础,我们在第3章进行更多讨论。

如果网络层(IPv4或IPv6)认为传入的数据报有效,并且已确定正确的传输层协议,则将数据报(必要时由分片重组而成)交给传输层处理。在传输层中,大部分协议(包括TCP和UDP)通过端口号将复用分解到适当的应用。

个人理解:这里只是简单的介绍了PDU

端口号

端口号是16位的非负整数(范围是0 - 65535)。这些数字是抽象的,在物理上没有指任何东西。

端日用于识别很多众所周知的服务。

个人理解:在连接网络时,IP通常也经常叫做Host name,用来表示网络中的设备,而端口号则是该设备可能支持的服务:例如SSH、SMTP等

名称、地址和DNS

在TCP/IP中,每台计算机(包括路由器)的每个链路层接口至少有一个IP地址。它们不方便被人们记忆或操作。

DNS是一个应用层协议,因此它的运行依赖于其他协议。

个人理解:域名解析协议(DNS)也算是很常用的概念了,其功能就是域名和IP的相互转化。例如www.baidu.com就是一个域名,而如果通过访问一些IP地址也可进入百度页面

Internet、内联网和外联网

内联网是一个用于描述专用互联网络的术语,它通常由一个商业机构或其他企业来运行。

在很多情况下,一个企业或商业机构可能希望建立一个网络,其中包含可供合作伙伴或其他相关公司通过Internet访问的服务器。这种涉及VPN的网络通常被称为外联网,由连接在提供服务的企业防火墙之外的计算机组成(见第7章)。

设计应用

网络应用的典型结构基于少数几种模式。最常见的模式是客户机/服务器模式和对等模式。

客户机/服务器

大多数网络应用被设计为一端是客户机,而另一端是服务器。服务器为客户机提供某类服务,例如访问服务器主机中的文件。我们可以将服务器分为两类:迭代和并发。

迭代

A.等待客户机请求到达。

B.处理客户机请求。

C.将响应发送给请求的客户机。

D.回到步骤A。

迭代服务器的问题是步骤B需要经过较长时间。在此期间,无法为其他客户机服务。

个人理解:迭代的方式在某个时间段只能处理一个请求

并发

并发服务器的优点是服务器只产生其他服务器实例,并由它们来处理客户机请求。大多数服务器通常是并发的。

对等

有些应用以更分布式的形式设计,其中没有专门的服务器。相反,每个应用既是客户机,又是服务器,有时同时是两者,并能转发请求。

采用这种形式。这种应用称为对等或P2P应用。并发的P2P应用接收到传入的请求,确定它是否能响应这个请求,如果不能,将这个请求转发给其他对等方。因此,一组P2P应用共同形成一个应用网络,也称为覆盖网络。

P2P网络的一个主要问题是发现服务。也就是说,一个对等方如何在一个网络中发现提供它所需的数据或服务的其他对等方,以及可能进行交互的那些对等方的位置?这通常由一个引导程序来处理,以便每个客户机在最初配置中使用它所需的对等方的地址和端口号。一旦连接成功,新的参与者向其他活跃的对等方发出请求,并根据协议获得对等方提供的服务或文件。

个人理解:无,此介绍已经很详细

应用程序编程接口

主机操作系统使用一个网络应用程序编程接口(API)来实现。最流行的API被称为套接字或Berkeley套接字,它最初由[LJFK93]开发。

标准化进程

个人理解:每一个广泛使用的协议都会有一个标准化的进程

RFC

Internet社会中的每个官方标准都以一个RFC (征求意见)的形式发布。

不是所有RFC都是标准。只有标准跟踪类别的RFC被认为是官方标准。其他类别包括当前最佳实践(BCP)、信息、实验和历史。重要的是,一个文件成为一个RFC,并不意味着IETF已采纳它作为标准。事实上,针对现有RFC有明显分歧。

许多RFC具有特殊意义,它们总结、澄清或解释其他一些特殊标准。例如,

其他标准

虽然IETF负责我们在书中讨论的大部分协议的标准化,但是其他SDO负责定义的协议同样值得我们注意。这些重要组织包括电气和电子工程师学会(IEEE)、万维网联盟(W3C)以及国际电信联盟(ITU)。

实现和软件分发

实际上,标准的TCP/IP实现来自加州大学伯克利分校计算机系统研究组(CSRG)。它们通过4.xBSD系统发布,直到20世纪90年代中期才出现BSD网络发布版。这个源代码已成为许多其他实现的基础。今夫,每个流行的操作系统都有自已的实现。在本书中,我们倾向于以Linux、 Windows的TCP/IP实现为例,有时也采用FreeBSD和Mac OS (两者都由BSD版本派生而来)。在大多数情况下,某些特定实现通常无关紧要。

20世纪90年代中期, Internet和TCP/IP已很好地被实现。随后,所有流行的操作系统都开始支持TCP/IP协议。通过研究TCP/IP的新特点发现,之前首先出现在BSD版本中的功能,现在通常首先出现在Linux版本中。最近, Windows已实现了一个新的TCP/IP协议栈(从Windows Vista开始),它具备很多新特点和本地IPv6功能o Linux、 FreeBSD、 MacOS X也支持IPv6,并且不需要设置任何特殊配置选项。

与Internet体系结构相关的攻击

在整本书中,我们将简要描述攻击和漏洞,这些内容在讨论设计或实现主题时已谈到。很少有攻击将Internet体系结构整体作为目标。但是,值得注意的是, Internet体系结构交付IP数据报是基于目的IP地址。因此,恶意用户能在自已发送的每个IP数据报的源地址字段中插人任何IP地址,这种行为称为欺骗。生成的数据报被交付到目的地,但难以确定它的真实来源。也就是说,很难或不能确定从Internet中接收的数据报来源。

欺骗可以与Internet中出现的各种攻击相结合。拒绝服务(DoS)攻击通常涉及消耗大量的重要资源,以导致合法用户被拒绝服务。例如,向一台服务器发送大量IP数据报,使它花费所有时间处理接收的分组和执行其他无用的工作,这是一种类型的Dos攻击。有些DoS攻击可能涉及以很多流量堵塞网络,导致其无法发送其他分组。这通常需要使用很多计算机来发送,并形成一个分布式DoS (DDoS)攻击。

未授权访问攻击涉及以未授权方式访问信息或资源。它可以采用多种技术来实现,例如利用协议实现上的错误来控制一个系统(称为占有这个系统,并将它变成一个僵尸)。它也可以涉及备种形式的伪装,例如攻击者的代理冒充一个合法用户(例如运行用户证书)。有些更恶毒的攻击涉及使用恶意软件(malware)控制很多远程系统,并以一种协同、分布式的方式(称为僵尸网络(botnets))使用它们。那些出于(非法)获利或其他恶意目的而有意开发恶意软件和利用系统的程序员通常称为黑帽。所谓的白帽也在利用同样的技术做这方面的事情,但他们只是通知系统存在漏洞而不是利用它们。

关于Internet体系结构,值得注意的是,最初的Internet协议没有进行任何加密,加密可用于支持认证、完整性或保密。因此,恶意用户仅通过分析网络中的分组,通常就可以获得私人信息。如果具有修改传输中的分组的能力,他就可以冒充用户或更改消息内容。虽然这些问题由于加密协议(见第18章)而显著减少,但旧的或设计不当的协议有时在简单的窃听攻击面前仍很脆弱。由于无线网络的流行, “嗅探”其他人发送的分组比较容易,因此应避免使用旧的或不安全的协议。注意,虽然可在某层(例如WiFi网络的链路层)启用加密,但只有主机到主机的加密(IP层或以上)能保护穿过多个网段,以及可能采用遍历方式到达最终目的地的IP数据报。

个人理解:都是在此过程中才会不断完善


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!