一本书读懂TCP/IP
上QQ阅读APP看书,第一时间看更新

1.2 TCP/IP是什么

IP世界的根本大法,是TCP/IP协议族。

IP世界是由通信实体构成的,而通信实体,是要分层的。

就如一个公司混乱的管理要进行改革一样。我们首先思考一下一个企业最可能出现的管理混乱有哪些表现。

员工“越界”:员工不经过部门经理直接向公司总经理汇报工作;秘书经常到总经理处指责其对公司的未来规划缺乏经验。

部门经理做“二传手”:提交给总经理的汇报,是员工汇报的简单叠加;总经理给部门经理分配的工作,部门经理不做思索地推给某个员工。

两个部门之间职责不清:市场部经理经常指责客服部员工A,因为A没有按照市场部经理的要求向某个客户提供服务,而是把有限的时间给了另外一个客户,而这个工作是由客服部经理指派的;采购部经理要求市场部员工B在某个项目中必须向客户提供联想品牌笔记本电脑,而实际情况是,客户要求必须使用SONY笔记本电脑但采购部经理并不知情。

总经理一抓到底:布置任务跳过部门经理直接与员工沟通,而部门经理也经常布置任务给员工,部门经理无从了解员工的工作量,总经理也无法把控任务的进度。

公司与客户接口混乱:任何人都可以向客户随意承诺,而承诺出来的东西又无法兑现。

不管你做多少培训、增加多少职业经理人,最终改变这种状况的,无非是以下几个举措。

分层:要把总经理——部门经理——员工的三层结构搞清晰,每层的职责范围明确定义。公司总经理负责公司战略和重大事务的处理;公司部门经理负责管理部门,向公司总经理汇报工作;公司员工负责具体事物处理,向部门经理汇报工作。

明确层之间的关系:需要明确任何一个层面的人员,其与上下层的关系;总经理将公司战略和要求部署给每个部门经理,每个部门经理细化后部署给每个员工。

对等层之间的关系:需要明确任何一个层面的人员,与对等部门或对等公司的关系(对等公司如客户和原材料供应方)。

这样,公司都形成了三个层次的机构,每个层次都与上下层次的权责清晰明了,对外业务接口统一,沟通渠道通畅,业务流程规范。

通信实体也必须分出层次,以保证各种网络技术能和谐地共存和良好地配合,并不断激励技术创新。通信网的分层,与公司的组织结构极其相似。加入通信网中的各个实体就好比一个个公司,比如路由器是一个通信实体,某个通信软件(如浏览器或者QQ)是一个通信实体,网络游戏的服务器软件和用户端软件都是通信实体。这些实体必须满足以下要求。

要分出若干层次,管理上类似的功能要放在同一层,在实现技术经常变化的地方增加层次,每个层次有自己的职责。

要明确每个层次与上下层的关系,层次之间的边界要合理,使层次间的信息流量尽量最小且容易规范。

两个实体之间要明确每个层面之间的关系。

1.OSI RM(开放系统互连参考模型)

基于上述要求,国际标准化组织(ISO)于1984年建立了一套非常抽象的分层结构,这就是著名的ISO/OSI(国际标准化组织的开放网络架构)。与其说这是一个通信标准,不如说这是一种管理哲学。任何事物之间的联系都可以用OSI表示出来,虽然不是所有的事物都必须具备其所有的层面(通信网本身大部分实体也不具备其所有层面),但是这对我们分析事物是非常有帮助的。

两个通信实体可以友好合作、充分信任,但是也可以不互相信,可以打架、骂人,但是它们必须能互相理解对方说的是什么。

就像两国冲突,他们可以打若干年的仗,但是必须都具有能互相理解的语言展开外交辞令,可以和谈、破裂,可以下战书、声明、抗议。如果没有统一的能互相理解的语言,那叫鸡同鸭讲。

为了让两个通信实体保持最基本的沟通,在“层”的基础上,专家们定义了“协议”、“标准”和“规范”。

我们把这7层OSI结构与实现生活中的“说话”联系起来,有助于大家对OSI的理解,如表1.1所示。

表1.1 OSI参考模型

(1)物理层

物理层就像人与人沟通中的能够互相听懂的“发音”。物理层解决最基础的传送通道,涉及问题主要是建立、维护和释放物理链路所需的机械的、电气的/光学的、功能的和规程的特性,如光缆如何抗衰耗,无线设备如何提高发射功率,为什么双绞线要有屏蔽层等。

(2)数据链路层

有了发音,才能有“字”或者“词”,对于说错的话,要尽快予以纠正;如果不能很好地纠正,就要重新把话再说一遍。

接下来,我们开始考虑在物理层提供的按“位”服务的基础上,在相邻的网络节点之间提供简单的、传输以帧为单位的数据,同时它还负责数据链路的流量控制、差错控制。

首先,数据链路层为网络层提供“简单”的通信链路,通信实体所在的系统必须经过物理介质直接相连——当然,这物理介质可以是有线的铜缆或者光缆,也可以是无线的微波。

大家要理解,这条链路不具备任何路径选择和转发功能,你可以把它仅仅理解为“一条封闭的路”,除了两端,没有额外出入口。

数据链路层将物理层提供的比特流组成“帧”,也就是说,把发送方发出来的若干“位”的数据组成一组,加上“开始”“结束”标志和与检错有关的代码等,形成有固定格式的数据帧——这有点像把货物放入标准集装箱中,正因为集装箱的体积、尺寸都是标准的,最后所有的集装箱看起来非常整齐,搬运和船载过程也会变得有序和规范。

本层要提供一定的差错检验和纠正机制。信号会因机械、电气等原因,出现错误,如将“0”“1”颠倒,丢失一个“0”或“1”,或者因为外界干扰而多出一位数字。接收者根据检错代码就可以判断收到的数据帧是否有错误,并在可能的情况下纠正错误。不能纠正的错误可以选择重传。

这里面很有学问。发送的信息,接收方是不清楚的。但是如何让接收方知道发送过来的信息有错误呢?对付这种问题,数据链路层有应对策略。

假如我们运送的不是数据信息而是货物,运送工具不是帧而是车。这个问题怎么处理?

发货方出货前,将附带一张“装箱单”,单子上标明了这车货物的相关参数,比如重量、体积、品质,接收方只需要称重量、测体积以及检验品质,并和装箱单上的数据做对比,即可判断运送过程中是否出现错误或者失误。

数据帧传送也有类似装箱单一样的信息,存储在“纠错字节”中。当数据帧到达目的地,它会对自身进行计算,计算结果和纠错字节中的内容进行对比。如果一致,进行下一步操作。如果不一致呢?这个类似“装箱单”的纠错字节就能够很快将错误检测出来并进行相应处理(比如进行重传)。

以太网就属于这一层。所以你会经常听到“以太网帧”这一术语。

(3)网络层

我们继续分析日常说话的方式。说话应该有目标、内容和语速,向谁说,通过谁转述,说什么,以多快的速度说。网络层所干的工作,就是进行路由选择、拥塞控制和网络互联。

网络层对自己的上级——传输层,可以提供两种服务,一种叫作“面向连接”的网络服务,一种叫作“无连接”的网络服务——这有点像有轨交通和无轨交通。

有轨交通的特点是,车辆沿着特定轨道行驶,自出发点到目的地,路线、速度基本确定。面向连接的服务也有类似特点。

无轨交通的特点是,车辆走一站看一站,线路、速度均不确定。无连接的服务与此惊人一致。

图1.5 面向连接与无连接服务

这两者的区别,直接导致相关技术体制的巨大差异。面向连接的服务关注于如何建立链路,而无连接的服务则专注于在每一站建立一套详尽的路由表。

传统IP技术就是无连接服务,而改造为MPLS(多协议标签交换)网络后,就属于面向连接的服务了。

网络层担负着的四大任务如下。

路由选择。任何数据包都不可能在网络上像无头的苍蝇乱跑乱撞,而网络层的关键任务是发现路由、选择路径,有时,也负责地址转换。它就像一个警察,在网络节点这样的“十字路口”管理来来往往的数据包,数据包的路径选择就是我们经常提到的“路由选择”。各种路由协议、MPLS的流量工程都与路由选择有关。

拥塞控制。后文会专门介绍拥塞发生的原理。网络层可以采用拥塞控制机制,尽量避免拥塞的发生,如果真的发生拥塞,也要通过多种途径缓解拥塞状况(比如丢弃一些数据,或者进行缓存)。

局域网间互联。数据包在局域网间穿梭,会面临诸如包大小、网络速度,甚至协议的差异,这些都是网络层要解决的,就是通过一定的调整,让两个网络之间的数据包成功的传递。

统计和控制。如统计哪些用户需要的网络流量比较多,访问哪些站点比较频繁,或者禁止或控制用户访问某些站点;记账功能一般也在网络层解决。

网络层最知名的协议就是IP。

(4)传输层

要保证别人听到你说的话,不能“想当然”。

传输层的任务是向用户提供可靠的、透明的端到端的数据传输,以及差错控制和流量控制机制。由于它的存在,网络硬件技术的任何变化对高层都是不可见的,也就是说会话层、表示层、应用层的设计不必考虑低层细节,因此传输层起到“承上启下”的作用。

所谓“端到端”是相对链接而言的。

各位读者要记住一个概念,OSI参考模型的四层到七层属于端到端的方式,而一到三层属于链接的方式。在传输层,通信双方的两机器之间,有一对应用程序或进程直接对话,它们并不关心低层的实现细节。低层的链接方式就不一样,它要负责处理通信链路中的任何相邻机器之间的通信。假如两台计算机A和B要通信,那么A和B之间可以进行直接的传输层的通信,而在A和B之间如果有若干网络节点,如路由器X、Y、Z,那么A与X、X与Y、Y与Z、Z与B之间都要进行低三层的通信。

传输层通过逻辑接口向高层提供服务。服务的类型是在连接建立时确定的,最重要的服务是端到端的、可靠的、面向连接的字节流服务——这里已经不是“位流”(也称“比特流”)了。

一般情况下,传输层为每一条传输连接生成一条第三层的网络链接,但也有例外:需要高吞吐率的传输连接可以同时占用多条网络链接。

传输层有一项很有趣的工作——流量控制,通过技术手段,使字节流均匀、稳定。当然,这不是必需的。

大名鼎鼎的TCP和UDP就属于传输层。

(5)会话层

说话要有开始、过程和终止。在不同的机器之间提供会话进程的通信,如建立、管理和拆除会话进程。你可能要考虑这个话是在大庭广众之下说还是专门对某个人说,或者是说一句等对方答复后再说下一句。

会话层还提供了许多增值服务,如交互式对话管理,允许一路交互、两路交换和两路同时会话;管理用户登录远程分时系统;在两机器之间传输文件,进行同步控制等。

(6)表示层

有些话要以悄悄话的形式,避免第三者听到;有些话,要简单明了,不要拖泥带水。表示层就处理通信进程之间交换数据的表示方法,包括语法转换、数据格式的转换、加密与解密、压缩与解压缩等。

(7)应用层

有了上面所列的网络层次,你已经把要说的话通过声带的震动,一字一句、清晰明了地地告诉了你的某个好朋友,并且保证他听到了,没有让第三者听到。你明确地让对方知道,你的谈话何时开始以及何时结束。

应用层就负责管理应用程序之间的通信。

应用层是OSI参考模型的最高层,低层所有协议的最终目的都是为应用层提供可靠的传送手段,低层协议并没有直接满足用户的任何实际需求。我们日常使用的收发电子邮件、传送文件、浏览网页、交互即时信息、播放网络视频等都属于应用层的范畴,这是用户体验最直观的服务。

OSI是哲学,而不仅仅是技术!

通信“层”的概念,让各种协议、规范、标准变得有所不同——它们更灵活但可控,更开放但不混乱,更清晰但不拘束。上面的论述会让一些读者觉得乏味,但是如果你能够紧密结合通信网络的一些实际应用,并类比生活中的例子,你会发现其实枯燥中蕴含着无穷乐趣,你也会发现,其实分层是一种哲学而非技术。

2. TCP/IP(传输控制协议/网际协议)

在《倚天屠龙记》中,张无忌为什么做不成皇帝,而朱元璋却可以?那是张无忌心太软,他不爱江山爱美人的性格不适合当皇帝。“优胜劣汰,适者生存”是一条永恒不变的法则,OSI由于体系比较复杂,不太方便计算机软件实现,逐渐退出人们关注的视野,TCP/IP得到了广泛的应用。

TCP/IP是Internet的核心技术,是由IETF定义的。所有的系统、终端、线路、用户、开发者,都必须遵守TCP/IP协议族所规定的法则,否则,将不被IP世界所接受。

图1.6 OSI与TCP/IP参考模型对照图

对比ISO/OSI的七层结构,看完上面的图,读者会奇怪了:怎么没有表示层和会话层呢?他们到哪里去了?

在TCP/IP分层结构中,的确没有表示层和会话层,也就是说OSI规定的这两层,在TCP/IP中并不是必需的。

还有一种五层的说法,将网络接口层分为物理层和数据链路层两层,这样有利于数据通信的分析。TCP/IP体系结构中最核心的部分是上面的三层:应用层、传输层和互联网层(也称网络层),互联网层以下的层次没有制定相关标准,萝卜咸菜各有所爱,至于最下面的是一层还是两层,这都不太重要。我们建议提到分层模型时按四层来分,在进行数据通信时按五层来分析。

说到《快乐大本营》,你会立刻想到何炅,谢娜,其实快乐大本营是一个节目组,不仅包括主持人,还有导演、摄像、录音等其他工作人员。TCP/IP也是一个组,是一个协议组,不仅包括TCP、IP,还包括HTTP、TELNET、FTP、RIP、OSPF、BGP、UDP、ARP、pop3等,只不过TCP/IP这个名字来源于协议族中最主要的两个协议——TCP(传输控制协议)和IP(网际协议)。各个层次分别对应着不同的协议,如图1.7所示。

图1.7 TCP/IP分层协议

下面,分别介绍各层的主要功能。

(1)网络接口层也称为数据链路层,TCP/IP并没有严格定义该层,它只是要求能够提供给其上层——网络层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。以太网是IP通信中数据链路层最常见的形式,除此之外还有PPP、HDLC等。10Gbit/s以下的以太网一般应用于局域网,而PPP、HDLC则应用于广域网范围内居多。

(2)网络层(Internet Layer)俗称IP层,它处理机器之间的通信。IP是一个不可靠的、无连接协议,它接受来自传输层的请求,传输某个具有目的地址信息的分组。该层把分组封装到IP数据报中,填入数据报的首部(也称为报头),使用路由算法来选择是直接把数据报发送到目标机还是把数据报发送给路由器,然后把数据报交给下面的网络接口层中的对应网络接口模块。IP负责给互联网的每一台计算机或者终端分配一个地址,并将信息以IP包的形式传送到正确的目的地。这是TCP/IP的核心。IP协议族中最关键的是路由协议。除此之外还有ICMP,被用来传送IP的控制信息。我们熟知的Ping和Traceroute命令就出自ICMP。

(3)传输层:传输控制协议(Transmission Control Protocol,TCP)和用户数据报协议(User Datagram Protocol,UDP)是该层的重要协议。TCP是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP还要处理端到端的流量控制。UDP是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。大家注意一下,在数通试题中,会经常涉及TCP、IP、UDP可靠不可靠,连接无连接的内容。

图1.8 TCP/IP层的协议族

3.TCP报文格式

TCP报文包括首部(报头)和数据部分,其中首部的具体字段如下。

图1.9 TCP报文

(1)源端口和目的端口字段——各占16bit。端口是传输层与应用层的服务接口。

(2)序号字段——SEQ序号,占32bit。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

(3)确认序号:ACK序号,占32 bit,是期望收到对方的下一个报文段的数据的第一个字节的序号。只有ACK标志位为1时,确认序号字段才有效,ACK=SEQ+1。

(4)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下。

紧急比特 URG——当 URG=1 时,表明紧急指针(urgent pointer)字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

确认比特ACK——只有当ACK=1时确认号字段才有效。当 ACK=0时,确认号无效。

推送比特PSH(PuSH)——接收TCP收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。

复位比特 RST(ReSeT)——当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。

终止比特 FIN(FINal)——用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

需要注意的是:不要将确认序号ACK与标志位中的ACK搞混了;确认方ACK=发起方SEQ+1,两端配对。

(5)数据偏移——占4bit,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。

(6)窗口字段——占16bit。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。

(7)检验和——占16bit。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

(8)紧急指针字段——占16bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。

(9)选项字段——长度可变。TCP只规定了一种选项,即最大报文段长度MSS(Maximum Segment Size)。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”

(10)保留字段——占6bit,保留为今后使用,但目前应置为0。

4.TCP的三次握手和四次挥手

TCP的连接和建立都是采用客户服务器方式。主动发起连接建立的应用进程叫作客户(Client)。被动等待连接建立的应用进程叫作服务器(Server)。

建立TCP需要三次握手才能建立,而断开连接则需要四次挥手。整个过程如图1.10所示。

图1.10 TCP建立连接、传输数据、释放连接

(1)三次握手

在TCP/IP中,采用三次握手建立一个连接,连接过程就像打电话的过程,如图1.11所示。

图1.11 三次握手

第一次握手:Client(主机A)向Server(主机B)发送一个连接请求,在这个包中,标志位SYN=1,发送序号SEQ=x,上图中x=200,Client进入SYN_SEND状态,等待Server确认。

第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,确认序号ACK=x+1=201,随机产生一个发送序号SEQ=y,上图中y=500,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:Client收到确认后,检查确认序号ACK是否为x+1=201,标志位ACK是否为1,如果正确,则将标志位ACK置为1,确认序号ACK=y+1=501,并将该数据包发送给Server,Server检查确认序号ACK是否为y+1=501,标志位ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态。

完成三次握手,客户端与服务器开始传送数据。

(2)四次挥手

四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开,如图1.12所示。

图1.12 四次挥手

第一次挥手:当客户A要断开TCP连接时,发送一个包,其中标志位fin=1,ACK=1,发送序号SEQ=x,确认序号ACK=y,上图中x=200,y=500。Client进入FIN_WAIT_1状态。

第二次挥手:客户B知道A要断开后,发送一个确认包,其中标志位ACK=1发送序号,SEQ=y确认序号ACK=x+1=201,Server进入CLOSE_WAIT状态。

第三次挥手:客户B也断开TCP连接,此时发送一个包,其中,标志位fin=1,发送序号SEQ=y+1=501,Server进入LAST_ACK状态。

第四次挥手:客户A收到B的断开请求后,Client进入TIME_WAIT状态,接着发送一个确认包,标志位ACK=1,发送序号SEQ=x+1=201,确认序号ACK=y+2=502;Server进入CLOSED状态。

由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。

5.TCP/IP协议体系常见术语

(1)包

包(Packet)是网络上传输的数据片段,也称分组。包是一种统称,在不同的协议不同的层次,包有不同的名字,如TCP/IP中,数据链路层的包叫帧(Frame),IP层的包称为IP数据报,TCP层的包常称为TCP报文等。大多数包都由包头和信息组成:包头常常包括诸如源和目的地址、包的长度和类型指示符等信息;信息部分可以是原始数据,也可以包含另一个包。

(2)封装

不同设备的对等层之间依靠封装和解封装来实现相互间的通信。封装就像洗完澡光着身子穿衣服,解封装就像洗澡前脱衣服,脱了一层又一层直到脱光。

TCP/IP也是一种计算机数据打包和寻址的标准方法。在数据传送中,可以形象地理解为有两个信封,TCP和IP就像是信封,要传递的信息被划分成若干段,每一段塞入一个TCP信封,并在该信封面上记录有分段号的信息,再将TCP信封塞入IP大信封,发送上网。在接受端,一个TCP软件包收集信封,抽出数据,按发送前的顺序还原,并加以校验,若发现差错,TCP将会要求重发。因此,TCP/IP在互联网中几乎可以无差错地传送数据。

在通信过程中,TCP/IP每一层都让数据得以通过网络进行传输,这些层之间使用协议数据单元(Protocol Data Unit,PDU)彼此交换信息,确保网络设备之间能够通信。不同层的PDU中包含有不同的信息,因此PDU在不同层被赋予了不同的名称。如图1.13所示,传输层在上层数据中加入TCP报头后得到的PDU被称为数据段(Segment);数据段被传递给网络层,网络层添加IP报头得到的PDU被称为数据包(Packet);数据包被传递到数据链路层,封装数据链路层报头得到的PDU被称为数据帧(Frame);最后,帧被转换为比特,通过网络介质传输。这种协议栈向下传递数据,并添加报头和报尾的过程称为封装。数据被封装并通过网络传输后,接收设备将删除添加的信息,并根据报头中的信息决定如何将数据沿协议栈上传给合适的应用程序,这个过程称为解封装。

图1.13 主机通信过程