网络另一篇干货《图解TCP/IP》-封顶大吉【值得收藏】

·  阅读 1989

前序

本篇博客是承继上篇博客网络中【图解HTTP与HTTPS】的另一篇关于TCP/IP。

信息通信社会这个词俨然已经是现代社会的一个代名词。人们可以使用手机等信息终端随时随地进行 交流,而这种环境正是要依赖于网络才得以实现。在这些网络当中,目前使用最为广泛的协议就是 TCP/IP。

为了构造和运营一个安全的、使用户安心的网络环境,理解TCP/IP刻不容缓。本篇博客旨在让大家理解TCP/IP的基本知识,掌握TCP/IP的基本技能。 

【图解TCP/IP】第五次修订。希望大家通过本篇博客,可以不费更多的时间去拜读这本书,只需要收藏此篇博客,需要的时候去看下就可以啦。

关于网络,【图解HTTP和HTTPS】及【图解TCP/IP】这两篇书籍是排名1,2位置,特花时间将两本书核心内容!!!

正是春节:祝大家新年快乐,牛气冲天,发大财喔

网络基础知识

本模块主要深入了解TCP/IP所必备的基础知识:OSI参考模型、网络概念的本质等。

1.1 OSI参考模型

  • 应用层

为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、远程登录(虚拟 终端)等协议。

  • 表示层

将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。 因此它主要负责数据格式的转换。 

具体来说,就是将设备固有的数据格式转换为网络标准传输格式。不同设备对同一比特流解释的结果 可能会不同。因此,使它们保持一致是这一层的主要作用。

  • 会话层

负责建立和断开通信连接(数据流动的逻辑通路),以及数据的分割等数据传输相关的管理。

  • 传输层

起着可靠传输的作用。只在通信双方节点上进行处理,而无需在路由器上处理。

  •  网络层

将数据传输到目标地址。目标地址可以是多个网络通过路由器连接而成的某一个地址。因此这一层主 要负责寻址和路由选择。

  • 数据链路层

负责物理层面上互连的、节点之间的通信传输。

例如与1个以太网相连的2个节点之间的通信。 将0、1序列划分为具有意义的数据帧传送给对端(数据帧的生成与接收)。

  • 物理层

负责0、1比特流(0、1序列)与电压的高低、光的闪灭之间的互换。

1.2 OSI参与模型通信处理举例

七层通信

发送方从第7层、第6层到第1层由上至下按照顺 序传输数据,而接收端则从第1层、第2层到第7层由下至上向每个上一级分层传输数据。每个分层上,在处 理由上一层传过来的数据时可以附上当前分层的协议所必须的“首部”信息。然后接收端对收到的数据进行 数据“首部”与“内容”的分离,再转发给上一分层,并最终将发送端的数据恢复为原状。

1.3 传输方式的分类

1.3.1 面向有连接型与面向无连接型

通过网络发送数据,大致可以分为面向有连接面向无连接两种类型(面向无连接型包括以太网、 IP、UDP等协议。面向有连接型包括ATM、帧中继、TCP等协议。) 

面向有连接型

面向有连接型中,在发送数据之前,需要在收发主机之间连接一条通信线路 (在不同的分层协议中,连接的具体含义可能有所不同。在数据链路层中的连接,就是指物理的、通信线 路的连接。而传输层则负责创建与管理逻辑上的连接。) 

面向无连接型

因此,在面向无连接的通信中,不需要确认对端是否存在。即使接收端不存在或无法接收数据,发送 端也能将数据发送出去。

面向无连接型则不要求建立和断开连接。发送端可于任何时候自由发送数据,反之,接收端也永远不知道自己会在何时从哪里收到数据。因此,在面向无连接的情况下,接收端需要时常确认是否收到了数据。

1.3.2 电路交换和分组交换

目前,网络通信方式大致分为两种——电路交换和分组交换。

电路交换

在电路交换中,交换机主要负责数据的中转处理。计算机首先被连接到交换机上,而交换机与交换机之间则由众多通信线路再继续连接。因此计算机之间在发送数据时,需要通过交换机与目标主机建立通信电路。我们将连接电路称为建立连接。建立好连接以后,用户就可以一直使用这条电路,直到该连接被断开为止。

分组交换

让连接到通信电路的计算机将所要发送的数据分成多个数据包, 按照一定的顺序排列之后分别发送。这就是分组交换。有了分组交换,数据被细分后,所有的计算机就可以一齐收发数据,这样也就提高了通信线路的利用率。由于在分组的过程中,已经在每个分组的首部写入 了发送端和接收端的地址,所以即使同一条线路同时为多个用户提供服务,也可以明确区分每个分组数据 发往的目的地,以及它是与哪台计算机进行的通信。

在分组交换中,由分组交换机(路由器)连接通信线路。分组交换的大致处理过程是:发送端计算机将数据分组发送给路由器,路由器收到这些分组数据以后,缓存到自己的缓冲区,然后再转发给目标计算机。

1.3.3 接收端数量分量

网络通信当中,也可以根据目标地址的个数及其后续的行为对通信进行分类。如广播、多播等就是这种分类的产物。 

  • 单播

组合起来就是指1对1通信。早先的固定电话就是单播通信的一个典型例子。 

  • 广播

它指是将消息从1台主机发送给与之相连的所有其他主机。将电视信号一齐发送给非特定

的多个接收对象。 

  • 多播

多播与广播类似,也是将消息发给多个接收主机。不同之处在于多播要限定某一组主机作为接收端。多播通信最典型的例子就是电视会议,这是由多组人在不同的地方参加的一种远程会议。在这种形式下,会由一台主机发送消息给特定的多台主机。电视会议通常不能使用广播方式。否则将无从掌握是谁在哪儿参与电视会议。 

  • 任播

任播是指在特定的多台主机中选出一台作为接收端的一种通信方式。虽然,这种方式与多播有相似之处,都是面向特定的一群主机,但是它的行为却与多播不同。任播通信从目标主机群中选择一台最符合网络条件的主机作为目标主机发送消息。通常,所被选中的那台特定主机将返回一个单播信号,随后发送端主机会只跟这台主机进行通信。

TCP/IP基础知识

2.1 TCP/IP的具体含义

从字面意义上讲,有人可能会认为TCP/IP是指TCP与IP两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用IP进行通信时所必须用到的协议群的统称。具体来说,IP或 ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP的协议。它们与TCP或IP的关系紧密,是互联网必不可少的组成部分。

TCP/IP一词泛指这些协议,因此,有时也称TCP/IP为网际协议族(网际协议 族(Internet Protocol Suite):组成网际协议的一组协议。) 。

2.2 TCP/IP与OSI参考模型

2.2.1 硬件【物理层】

TCP/IP的最底层是负责数据传输的硬件。这种硬件就相当于以太网或电话线路等物理层的设备。关于它的内容一直无法统一定义。因为只要人们在物理层面上所使用的传输媒介不同(如使用网线或无线), 网络的带宽、可靠性、安全性、延迟等都会有所不同,而在这些方面又没有一个既定的指标。总之, TCP/IP是在网络互连的设备之间能够通信的前提下才被提出的协议。

2.2.2 网络接口层【数据链路层】

网络接口层(有时人们也将网络接口层与硬件层合并起来称作网络通信层。) 利用以太网中的数据链路层进行通信,因此属于接口层。也就是说,把它当做让NIC起作用的“驱动程序”也无妨。

驱动程序是在操作系统与硬件之间起桥梁作用的软件。计算机的外围附加设备或扩展卡,不是直接插到电脑上或电脑的扩展槽上就能马上使用的,还需要有相应驱动程序的支持。例如换了一个新的NIC网卡,不仅需要硬件,还需要软件才能真正投入使用。因此,人们常常还需要在操作系统的基础上安装一些驱动软件以便使用这些附加硬件

2.2.3 互联网层【网络层】

互联网层使用IP协议,它相当于OSI模型中的第3层网络层。IP协议基于IP地址转发分包数据。 

TCP/IP分层中的互联网层与传输层的功能通常由操作系统提供。尤其是路由器,它必须得实现通过互 联网层转发分组数据包的功能。

  • IP

IP是跨越网络传送数据包,使整个互联网都能收到数据的协议。IP协议使数据能够发送到地球的另一 端,这期间它使用IP地址作为主机的标识【连接IP网络的所有设备必须有自己唯一的识别号以便识别具体 的设备。分组数据在IP地址的基础上被发送到对端。】

IP还隐含着数据链路层的功能。通过IP,相互通信的主机之间不论经过怎样的底层数据链路都能够实现通信。

虽然IP也是分组交换的一种协议,但是它不具有重发机制。即使分组数据包未能到达对端主机也不会重发。因此,属于非可靠性传输协议。

  •  ICMP

IP数据包在发送途中一旦发生异常导致无法到达对端目标地址时,需要给发送端发送一个发生异常的通知。ICMP就是为这一功能而制定的。它有时也被用来诊断网络的健康状况。

  • ARP

从分组数据包的IP地址中解析出物理地址(MAC地址)的一种协议。

2.2.4 传输层

TCP/IP的传输层有两个具有代表性的协议。该层的功能本身与OSI参考模型中的传输层类似。

传输层最主要的功能就是能够让应用程序之间实现通信。计算机内部,通常同一时间运行着多个程序。为此,必须分清是哪些程序与哪些程序在进行通信。识别这些应用程序的是端口号。 

  • TCP

TCP是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外,TCP还能够有效利用带宽,缓解网络拥堵。然而,为了建立与断开连接,有时它需要至少7次的发包收包,导致网络流量的浪费。此外,为了提高网络的利用率,TCP协议中定义了各种各样复杂的规范,因此不利于视频会议(音频、视频的数据量既定)等场合使用。 

  • UDP

UDP有别于TCP,它是一种面向无连接的传输层协议。UDP不会关注对端是否真的收到了传送过去的 数据,如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。 

UDP常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。

2..2.5 应用层【会话层以上的分层】

TCP/IP的分层中,将OSI参考模型中的会话层、表示层和应用层的功能都集中到了应用程序中实现。这 些功能有时由一个单一的程序实现,有时也可能会由多个程序实现。因此,细看TCP/IP的应用程序功能会 发现,它不仅实现OSI模型中应用层的内容,还要实现会话层与表示层的功能。

TCP/IP应用的架构绝大多数属于客户端/服务端模型。提供服务的程序叫服务端,接受服务的程序叫客 户端。在这种通信模式中,提供服务的程序会预先被部署到主机上,等待接收任何时刻客户可能发送的请求。

2.3 TCP/IP分层模型

2.3.1 数据报首部

每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。

每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。

2.3.2 发送数据包

假设甲给乙发送电子邮件,内容为:“早上好”。而从TCP/IP通信上看,是从一台计算机A向另一台计算机B发送电子邮件。我们就通过这个例子来讲解一下TCP/IP通信的过程。 

1). 应用程序管理

启动应用程序新建邮件,将收件人邮箱填好,再由键盘输入邮件内容“早上好”,鼠标点击“发送”按钮就可以开始TCP/IP的通信了。 

首先,应用程序中会进行编码处理。例如,日文电子邮件使用ISO-2022-JP或UTF-8进行编码。这些编码相当于OSI的表示层功能。编码转化后,实际邮件不一定会马上被发送出去,因为有些邮件的软件有一次同时发送多个邮件的功能,也可能会有用户点击“收信”按钮以后才一并接收新邮件的功能。像这种何时建立通信连接何时发送数据的管理功能,从某种宽泛的意义上看属于OSI参考模型中会话层的功能。

应用在发送邮件的那一刻建立TCP连接,从而利用这个TCP连接发送数据。它的过程首先是将应用的数据发送给下一层的TCP,再做实际的转发处理。 

2).TCP模块的处理

TCP根据应用的指示(这种关于连接的指示相当于OSI参考模型中的会话层。) ,负责建立连接、发送 数据以及断开连接。TCP提供将应用层发来的数据顺利发送至对端的可靠传输。

 为了实现TCP的这一功能,需要在应用层数据的前端附加一个TCP首部。TCP首部中包括源端口号和目 标端口号(用以识别发送主机跟接收主机上的应用)、序号(用以发送的包中哪部分是数据)以及校验和 (Check Sum,用来检验数据的读取是否正常进行的方法。) (用以判断数据是否被损坏)。随后将附加了 TCP首部的包再发送给IP。

3).IP模块的处理

IP将TCP传过来的TCP首部和TCP数据合起来当做自己的数据,并在TCP首部的前端在加上自己的IP首 部。因此,IP数据包中IP首部后面紧跟着TCP首部,然后才是应用的数据首部和数据本身。IP首部中包含接收端IP地址以及发送端IP地址。紧随IP首部的还有用来判断其后面数据是TCP还是UDP的信息。 

IP包生成后,参考路由控制表决定接受此IP包的路由或主机。随后,IP包将被发送给连接这些路由器或 主机网络接口的驱动程序,以实现真正发送数据。 

如果尚不知道接收端的MAC地址,可以利用ARP【Address Resolution Protocol】查找。只要知道了对端 的MAC地址,就可以将MAC地址和IP地址交给以太网的驱动程序,实现数据传输。

4).网络接口【以太网驱动】的处理

从IP传过来的IP包,对于以太网驱动来说不过就是数据。给这数据附加上以太网首部并进行发送处理。 以太网首部中包含接收端MAC地址、发送端MAC地址以及标志以太网类型的以太网数据的协议。根据上述 信息产生的以太网数据包将通过物理层传输给接收端。发送处理中的FCS(Frame Check Sequence) 由硬 件计算,添加到包的最后。设置FCS的目的是为了判断数据包是否由于噪声而被破坏。

2.3.3 经过数据链路的包

包流动时,从前往后依此被附加了以太网包首部、IP包首部、TCP包首部(或者UDP包首部)以及应用自己的包首部和数据。而包的最后则追加了以太网包尾。

每个包首部中至少都会包含两个信息:一个是发送端和接收端地址,另一个是上一层的协议类型。

经过每个协议分层时,都必须有识别包发送端和接收端的信息。以太网会用MAC地址,IP会用IP地址,而TCP/UDP则会用端口号作为识别两端主机的地址。即使是在应用程序中,像电子邮件地址这样的信息也是一种地址标识。这些地址信息都在每个包经由各个分层时,附加到协议对应的包首部里边。

此外,每个分层的包首部中还包含一个识别位,它是用来标识上一层协议的种类信息。例如以太网的包首部中的以太网类型,IP中的协议类型以及TCP/UDP中两个端口的端口号等都起着识别协议类型的作用。就是在应用的首部信息中,有时也会包含一个用来识别其数据类型的标签。

2.3.4 数据包接收处理

包的接收流程是发送流程的逆序过程。 

数据链路层

3.1 数据链路的作用

数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范。通信媒介包括双绞线电缆、同轴 电缆、光纤、电波以及红外线等介质。此外,各个设备之间有时也会通过交换机、网桥、中继器等中转数据。

实际上,各个设备之间在数据传输时,数据链路层和物理层都是必不可少的。众所周知,计算机以二 进制0、1来表示信息,然而实际的通信媒介之间处理的却是电压的高低、光的闪灭以及电波的强弱等信 号。把这些信号与二进制的0、1进行转换正是物理层的责任。数据链路层处理的数据也不是 单纯的0、1序列,该层把它们集合为一个叫做“帧”的块,然后再进行传输。

3.2 数据链路相关技术

3.2.1 MAC地址

MAC地址用于识别数据链路中互连的节点。

MAC地址长48比特,在使用网卡(NIC)的情况下,MAC地址一般会被烧入到ROM中。因此,任何一个网卡的MAC地址都是唯一的,在全世界都不会有重复。

拓展:MAC地址不一定是唯一的
在全世界,MAC地址也并不总是唯一的。实际上,即使MAC地址相同,只要不是同属一个数据链路 就不会出现问题。

3.2.2 共享介质型网络

共享介质型网络指由多个设备共享一个通信介质的一种网络。最早的以太网和FDDI就是介质共享型网络。在这种方式下,设备之间使用同一个载波信道进行发送和接收。为此,基本上采用半双工通信方式,并有必要对介质进行访问控制。

共享介质型网络中有两种介质访问控制方式:一种是争用方式,另一种是令牌传递方式

  • 争用方式

争用方式(Contention)是指争夺获取数据传输的权力,也叫CSMA(载波监听多路访问)。这种方法 通常令网络中的各个站(数据链路中很多情况下称节点为“站”。) 采用先到先得的方式占用信道发送数据,如果多个站同时发送帧,则会产生冲突现象。也因此会导致网络拥堵与性能下降。

在一部分以太网当中,采用了改良CSMA的另一种方式——CSMA/CD,。CSMA/CD要求每个站提前检查冲突,一旦发生冲突,则尽早释放信道。其具体工作原理如下: 

  • 如果载波信道上没有数据流动,则任何站都可以发送数据。 

  • 检查是否会发生冲突。一旦发生冲突时,放弃发送数据【实际上会发送一个32位特别的信号,在阻塞 报文以后再停止发送。接收端通过发生冲突时帧的FCS,判断出该帧不正确从而丢弃帧。 】同时立即释放载波信道。 

  • 放弃发送以后,随机延时一段时间,再重新争用介质,重新发送帧。

CSMA/CD具体工作原理:

  • 令牌传递方式

令牌传递方式是沿着令牌环发送一种叫做“令牌”的特殊报文,是控制传输的一种方式。只有获得令牌的站才能发送数据。这种方式有两个特点:一是不会有冲突,二是每个站都有通过平等循环获得令牌的机会。因此,即使网络拥堵也不会导致性能下降。 

3.2.3 非共享介质网络

非共享介质网络是指不共享介质,是对介质采取专用的一种传输控制方式。

在这种方式下,网络中的每个站直连交换机,由交换机负责转发数据帧。此方式下,发送端与接收端并不共享通信介质,因此很多情况下采用全双工通信方式。

不仅ATM采用这种传输控制方式,最近它也成为了以太网的主流方式。通过以太网交换机构建网络,从而使计算机与交换机端口之间形成一对一的连接,即可实现全双工通信。在这种一对一连接全双工通信的方式下不会发生冲突,因此不需要CSMA/CD的机制就可以实现更高效的通信。 

3.3 以太网

在众多数据链路中最为著名、使用最为广泛的莫过于以太网,以太网已成为最具兼容性与未来发展性的一种数据链路。

3.3.1 以太网连接形式

在以太网普及之初,一般采用多台终端使用同一根同轴电缆的共享介质型连接方式。

而现在,随着互连设备的处理能力以及传输速度的提高,一般都采用终端与交换机之间独占电缆的方式实现以太网通信。

3.3.2 以太网分类

以太网因通信电缆的不同及通信速度的差异,衍生出了众多不同的以太网类型。

10BASE中的“10”、100BASE中的“100”、1000BASE中的“1000”以及10GBASE中的“10G”分别指 10Mbps、100Mbps、1Gbps以及10Gbps的传输速度。而追加于后面的“5”、“2”、“T”、“F”等字符表示的是传 输介质。在传输速度相同而传输所用电缆不同的情况下,可以连接那些允许更换传输介质的中继器或集线 器。而在传输速度不同的情况下,则必须采用那些允许变更速度的设备如网桥、交换集线器或路由器。

传输速度与计算机内部的表现值:计算机内部采用二进制,因此以2的10次方 表示最接近于1000的值。于是有如下等式。

1K=1024 1M=1024K 1G=1024M 
复制代码

 而以太网中以时钟频率决定传输速度。以下等式请不要与上面混淆。

1K=1000 1M=1000K 1G=1000M
复制代码

3.3.3 以太网帧格式

以太网帧前端有一个叫做前导码(Preamble)的部分,它由0、1数字交替组合而成,表示一个以太网帧 的开始,也是对端网卡能够确保与其同步的标志。

以太网帧本体的前端是以太网的首部,它总共占14个字节。分别是6个字节的目标MAC地址、6个字节的源MAC地址以及2个字节的上层协议类型。 

IP协议

IP作为整个TCP/IP中至关重要的协议,主要负 责将数据包发送给最终的目标计算机。因此,IP能够让世界上任何两台计算机之间进行通信。

4.1 IP基础知识

4.1.1 路由控制

路由控制【Routing】是指将分组数据发送到最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能“迷失”,无法到 达目标地址。因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。

发送数据至最终目标地址:

Hop译为中文叫“跳”。它是指网络中的一个区间。IP包正是在网络中一个个跳间被转发。因此IP路由也叫做多跳路由。在每一个区间内决定着包在下一跳被转发的路径。 

多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址 为止的所有通路全都指定出来。因为每一个区间(跳)在转发IP数据包时会分别指定下一跳的操作,直至 包达到最终的目标地址。

4.1.2 IP属于面向无连接型

IP面向无连接。即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送给IP的 数据,该数据会立即被压缩成IP包发送出去。

在面向有连接的情况下,需要事先建立连接。如果对端主机关机或不存在,也就不可能建立连接。反之,一个没有建立连接的主机也不可能发送数据过来。

而面向无连接的情况则不同。即使对端主机关机或不存在,数据包还是会被发送出去。反之,对于一台主机来说,它会何时从哪里收到数据也是不得而知的。通常应该进行网络监控,让主机只接收发给自己的数据包。若没有做好准备很有可能会错过一些该收的包。因此,在面向无连接的方式下可能会有很多冗余的通信。

下面拓展一下: 为什么IP要采用面向无连接呢?

主要有两点原因:一是为了简化,二是为了提速。面向连接比起面向无连接处理相对复杂。甚至管理每个连接本身就是一个相当繁琐的事情。此外,每次通信之前都要事先建立连接,又会降低处理速度。需要有连接时,可以委托上一层提供此项服务。因此,IP为了实现简单化与高速化采用面向无连接的方式。 

4.2 IP地址的基础知识

4.2.1 IP地址由网络和主机两部分标识组成

IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。【192.168.128.10/24中 的“/24”表示从第1位开始到多少位属于网络标识】

网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现。 由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相 互重叠。即IP地址具有了唯一性。

4.2.2 IP地址的分类

IP地址分为四个级别,分别为A类、B类、C类、D类(还有一个一直未使用的E类。) 。它根据IP地址 中从第1位到第4位的比特列对其网络标识和主机标识进行区分。

  • A类地址

A类IP地址是首位以“0”开头的地址。从第1位到第8位【去掉分类位剩下7位】 是它的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0是A类的网络地址。A类地址的后24位相当于主机标识。因此,一个网段 内可容纳的主机地址上限为16,777,214个。

  • B类地址

B类IP地址是前两位为“10”的地址。从第1位到第16位【去掉分类位剩下14位】 是它的网络标识。用十进制表示的话,128.0.0.1~191.255.0.0是B类的网络地址。B类地址的后16位相当于主机标识。因此,一 个网段内可容纳的主机地址上限为65,534个。

  • C类地址

C类IP地址是前三位为“110”的地址。从第1位到第24位【去掉分类位剩下21位】 是它的网络标识。用十进制表示的话,192.168.0.0~239.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识。因此, 一个网段内可容纳的主机地址上限为254个。

  • D类地址

D类IP地址是前四位为“1110”的地址。从第1位到第32位【去掉分类位剩下28位】 是它的网络标识。 用十进制表示的话,224.0.0.0~239.255.255.255是D类的网络地址。D类地址没有主机标识,常被用于多播。

4.2.3 广播地址

广播地址用于在同一个链路中相互连接的主机之间发送数据包。将IP地址中的主机地址部分全部设置为1,就成为了广播地址。

4.2.4 子网掩码

一个IP地址只要确定了其分类,也就确定了它的网络标识和主机标识。例如A类地址前8位【除首 位“0”还有7位】、B类地址前16位【除首位“10”还有14位】、C类地址前24位【除首位“110”还有21位】分别 是它们各自的网络标识部分。

4.3 IPv6

IPv6【IP version 6】是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特【因此IPv6的地址空间是IPv4的296 =7.923×1028 倍】 ,一般写成8个16位字节。

IPv6的特点

而IPv6则将这些通通作为必要的功能,减轻了管理员的负担:

  • IP地址的扩大与路由控制表的聚合

IP地址依然适应互联网分层构造。分配与其地址结构相适应的IP地址,尽可能避免路由表膨大。

  •  性能提升

包首部长度采用固定的值【40字节】,不再采用首部检验码。简化首部结构,减轻路由器负荷。路由器不再做分片处理【通过路径MTU发现只由发送端主机进行分片处理】

  • 支持即插即用功能

即使没有DHCP服务器也可以实现自动分配IP地址。

  • 采用认证与加密功能

应对伪造IP地址的网络安全功能以及防止线路窃听的功能(IPsec)。

4.4 IPv4首部 

IP首部中包含着用于IP协议进行发包控制时所有的必要信息。

  • 版本【Version】

由4比特构成,表示标识IP首部的版本号。IPv4的版本号即为4,因此在这个字段上的值也是“4”。

  • 首部长度

由4比特构成,表明IP首部的大小,单位为4字节(32比特)。对于没有可选项的IP包,首部长度则设置为“5”。也就是说,当没有可选项时,IP首部的长度为20字节【4×5=20】 

  • 区分服务

由8比特构成,用来表明服务质量。

  • DSCP段与ECN段

  • 总长度(Total Length)

表示IP首部与数据部分合起来的总字节数。该字段长16比特。因此IP包的最大长度为65535(=216 )字节。 

  • 标识

由16比特构成,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。通常,每发送一 个IP包,它的值也逐渐递增。此外,即使ID相同,如果目标地址、源地址或协议不同的话,也会被认为是 不同的分片。

  • 标志【Flag】

由3比特构成,表示包被分片的相关信息。每一位的具体含义请参考下表。

  • 片偏移

由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0。由于 由3比特构成,表示包被分片的相关信息。 FO域占13位,因此最多可以表示8192【2的13次方 】个相对位置。单位为8字节,因此最大可表示原始数据 8×8192=65536字节的位置。

  • 生存时间【TTL Time To live】

 由8比特构成,它最初的意思是以秒为单位记录当前包在网络上应该生存的期限。然而,在实际中它是 指可以中转多少个路由器的意思。每经过一个路由器,TTL会减少1,直到变成0则丢弃该包【TTL占8位, 因此可以表示0~255的数字。因此一个包的中转路由的次数不会超过28 =256个。由此可以避免IP包在网络 内无限传递的问题。】

  • 首部校验和【Header Checksum】 

由16比特(2个字节)构成,也叫IP首部校验和。该字段只校验数据报的首部,不校验数据部分。它主 要用来确保IP数据报不被破坏。校验和的计算过程,首先要将该校验和的所有位置设置为0,然后以16比特 为单位划分IP首部,并用1补数【1补数 通常计算机中对整数运算采用2补数的方式。但在校验和的计算中 采用1补数运算方法。这样做的优点在于即使产生进位也可以回到第1位,可以防止信息缺失并且可以用2个 0区分使用。】 计算所有16位字的和。最后将所得到这个和的1补数赋给首部校验和字段。

  • 源地址

由32比特(4个字节)构成,表示发送端IP地址。

  • 目标地址

由32比特(4个字节)构成,表示接收端IP地址。

  • 可选项

长度可变,通常只在进行实验或诊断时使用。

  • 填充

也称作填补物。在有可选项的情况下,首部长度可能不是32比特的整数倍。为此,通过向字段填充0,调整为32比特的整数倍。

  • 数据

存入数据。将IP上层协议的首部也作为数据进行处理。

4.5 IPv6首部格式

IPv6中为了减轻路由器的负担,省略了首部校验和字段【因为TCP和UDP在做校验和计算的时候使用伪 首部,所以可以验证IP地址或协议是否正确。因此,即使在IP层无法提供可靠传输,在TCP或UDP层也可以 提供可靠传输的服务】 。因此路由器不再需要计算校验和,从而也提高了包的转发效率。

为了让64位CPU的计算机处理起来更方便,IPv6的首部及可选项都由8字节构成。

  • 版本

与IPv4一样,由4比特构成。IPv6其版本号为6,因此在这个字段上的值为“6”。

  •  通信量类

相当于IPv4的TOS(Type Of Service)字段,也由8比特构成。由于TOS在IPv4中几乎没有什么建树,未能成为卓有成效的技术,本来计划在IPv6中删掉这个字段。不过,出于今后研究的考虑还是保留了该字段。

  • 流标号

由20比特构成,准备用于服务质量控制。

  • 有效载荷长度【payload Length】

有效载荷是指包的数据部分。IPv4的TL(Total Length)是指包括首部在内的所有长度。然而IPv6中的 这个Playload Length不包括首部,只表示数据部分的长度。由于IPv6的可选项是指连接IPv6首部的数据,因 此当有可选项时,此处包含可选项数据的所有长度就是Playload Length。

  • 下一个首部

相当于IPv4中的协议字段。由8比特构成。通常表示IP的上一层协议是TCP或UDP。不过在有IPv6扩展 首部的情况下,该字段表示后面第一个扩展首部的协议类型。

  • 跳数限制

由8比特构成。与IPv4中的TTL意思相同。为了强调“可通过路由器个数”这个概念,才将名字改成了“Hop Limit”。数据每经过一次路由器就减1,减到0则丢弃数据。 

  • 源地址

由128比特(8个16位字节)构成。表示发送端IP地址。

  •  目标地址

由128比特(8个16位字节)构成。表示接收端IP地址。

IP协议相关技术 

5.1 DNS

我们平常在访问某个网站时不使用IP地址,而是用一串由罗马字和点号组成的字符串。而一般用户在 使用TCP/IP进行通信时也不使用IP地址。能够这样做是因为有了DNS【Domain Name System】功能的支持。DNS可以将那串字符串自动转换为具体的IP地址。 这种DNS不仅适用于IPv4,还适用于IPv6。

DNS查询

那么DNS查询【也叫做query】 的机制是什么呢?图中kusa.co.jp域中 的计算机想要访问网站www.ietf.org,此时的DNS查询流程如图所示。

解析器为了调查IP地址,向域名服务器【该图中,不仅可以访问同一域中的域名服务器,还可以访问 其他域的域名服务器。】进行查询处理。接收这个查询请求的域名服务器首先会在自己的数据库进行查找。如果有该域名所对应的IP地址就返回。如果没有,则域名服务器再向上一层根域名服务器进行查询处 理。因此,如图所示,从根开始对这棵树按照顺序进行遍历,直到找到指定的域名服务器,并由这个域名 服务器返回想要的数据。 解析器和域名服务器将最新了解到的信息暂时保存在缓存里(缓存的时限可以在提供信息的域名服务上进行设置。) 这样,可以减少每次查询时的性能消耗。

5.2 ARP

只要确定了IP地址,就可以向这个目标地址发送IP数据报。然而,在底层数据链路层,进行实际通信时 却有必要了解每个IP地址所对应的MAC地址。

5.2.1 ARP概要

ARP【Address Resolution Protocol】 是一种解决地址问题的协议。以目标IP地址为线索,用来定位 下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一个链路上时,可以通过ARP 查找下一跳路由器的MAC地址。不过ARP只适用于IPv4,不能用于IPv6。IPv6中可以用ICMPv6替代ARP发送邻居探索消息

5.2.2 ARP的工作机制

那么ARP又是如何知道MAC地址的呢?简单地说,ARP是借助ARP请求与ARP响应两种类型的包确定 MAC地址的。

假定主机A向同一链路上的主机B发送IP包,主机A的IP地址为172.20.1.1,主机B的IP地

址为172.20.1.2,它们互不知道对方的MAC地址。

主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其 MAC地址的主机IP地址。也就是说,ARP请求包中已经包含了主机B的IP地址172.20.1.2。由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包也就会被这同一个链路上所有的主机和路 由器进行解析。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址 塞入ARP响应包返回给主机A。

5.2.3 RARP

RARP【Reverse Address Resolution Protocol】是将ARP反过来,从MAC地址定位IP地址的一种协议。

5.3 DHCP

5.3.1 DHCP实现即插即用

于是,为了实现自动设置IP地址、统一管理IP地址分配,就产生了DHCP【Dynamic Host Configuration Protocol】协议。有了DHCP,计算机只要连接到网络,就可以进行TCP/IP通信。也就是说,DHCP让即插即 用【指只要物理上一连通,无需专门设置就可以直接使用这个物理设备】 变得可能。而DHCP不仅在 IPv4中,在IPv6中也可以使用。

5.3.2 DHCP的工作机制

使用DHCP之前,首先要架设一台DHCP服务器【很多时候用该网段的路由器充当DHCP服务器】。然 后将DHCP所要分配的IP地址设置到服务器上。此外,还需要将相应的子网掩码、路由控制信息以及DNS服 务器的地址等设置到服务器上。

TCP和UDP【重点重点💖💖】

6.1 传输层的作用

使用DHCP之前,首先要架设一台DHCP服务器【很多时候用该网段的路由器充当DHCP服务器】 。然 后将DHCP所要分配的IP地址设置到服务器上。此外,还需要将相应的子网掩码、路由控制信息以及DNS服 务器的地址等设置到服务器上。

6.1.1 通信处理

TCP/IP的众多应用协议大多以客户端/服务端的形式运行。客户端【具有客户的意 思。在计算机网络中是提供服务和使用服务的一方】 类似于客户的意思,是请求的发起端。而服务端 【在计算机网络中则意味着提供服务的程序或计算机】 则表示提供服务的意思,是请 求的处理端。另外,作为服务端的程序有必要提前启动,准备接收客户端的请求。否则即使有客户端的请 求发过来,也无法做到相应的处理。

6.1.2 两种传输层协议TCP和UDP

  • TCP

TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管道中的水 流。当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送 给接收端

TCP为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥 塞控制”、提高网络利用率等众多功能。

  • UDP

UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然 可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。 

6.2 端口号

6.2.1 根据端口号识别应用

一台计算机上同时可以运行多个程序。例如接受WWW服务的Web 浏览器、电邮客户端、远程登录用 的ssh客户端等程序都可同时运行。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序, 并准确地将数据传输。

6.2.2 端口号如何确定

在实际进行通信时,要事先确定端口号。确定端口号的方法分为两种:

  •  标准既定的端口号

这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一 个端口号。每个端口号都有其对应的使用目的

  • 时序分配法

第二种方法也叫时序(或动态的)分配法。此时,服务端有必要确定监听端口号,但是接受服务的客 户端没必要确定端口号。 在这种方法下,客户端应用程序可以完全不用自己设置端口号,而全权交给操作系统进行分配。操作 系统可以为每个应用程序分配互不冲突的端口号。例如,每需要一个新的端口号时,就在之前分配号码的 基础上加1。这样,操作系统就可以动态地管理端口号了。 根据这种动态分配端口号的机制,即使是同一个客户端程序发起的多个TCP连接,识别这些通信连接 的5部分数字也不会全部相同。 动态分配的端口号取值范围在49152到65535之间。

6.3 UDP

UDP是User Datagram Protocol的缩写。UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。

即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中即 使出现丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节 控制,那么不得不交由采用UDP的应用程序去处理。

UDP有点类似于用户 说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。因此,也可以说, UDP按照“制作程序的那些用户的指示行事”。

由于UDP面向无连接,它可以随时发送数据。再加上UDP本身的处理既简单又高效,因此经常用于以 下几个方面:

  • 包总量较少的通信(DNS、SNMP等)

  • 视频、音频等多媒体通信(即时通信) 

  • 限定于LAN等特定网络中的应用通信 

  • 广播通信(广播、多播)

6.4 TCP

TCP与UDP的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制, 还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协 议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费【由于UDP没有连接控制,所 以即使对端从一开始就不存在或中途退出网络,数据包还是能够发送出去】 

6.4.1 TCP的特点及其目的

TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

6.4.2 通过序列号与确认应答提高可靠性

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答ACK【ACK(Positive Acknowled-gement)意指已经接收】

TCP通过肯定的确认应答【ACK】实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认 应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。

在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。由 此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。

未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端因没有收到确认应答,而认为数据没有到达目的地,从而进行重新发送。

此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也履 见不鲜。此时,源发送主机只要按照机制重发数据即可。但是对于目标主机来说,这简直是一种“灾难”。 它会反复收到相同的数据。而为了对上层应用提供可靠的传输,必须得放弃重复的数据包。为此,就必须引入一种机制,它能够识别是否已经接收数据,又能够判断是否需要接收。

上述这些确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现。序列号是按顺序给发 送数据的每一个字节【8位字节】都标上号码的编号【序列号的初始值并非为0。而是在建立连接以后由随机数生成。而后面的计算则是对每一字节加一】。接收端查询接收数据TCP首部中的序列号和数据的长 度,将自己下一步应该接收的序号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。

6.4.3 重发超时如何确定

重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍未收 到确认应答,发送端将进行数据重发。那么这个重发超时的具体时间长度又是如何确定的呢?

最理想的是,找到一个最小时间,它能保证“确认应答一定能在这个时间内返回”。然而这个时间长短 随着数据包途径的网络环境的不同而有所变化。例如在高速的LAN中时间相对较短,而在长距离的通信当 中应该比LAN要长一些。即使是在同一个网络中,根据不同时段的网络拥堵程度时间的长短也会发生变化。

TCP要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间【Round Trip Time也叫RTT。是指报文段的往 返时间】 及其偏差【RTT时间波动的值、方差。有时也叫抖动】。将这个往返时间和偏差相加重发超 时的时间,就是比这个总和要稍大一点的值。 

重发超时的计算既要考虑往返时间又要考虑偏差是有其原因。如图6.所示,根据网络环境的不同往返 时间可能会产生大幅度的摇摆,之所以发生这种情况是因为数据包的分段是经过不同线路到达的。TCP/IP 的目的是即使在这种环境下也要进行控制,尽量不要浪费网络流量。

在BSD的Unix以及Windows系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍 【偏差的最小值也是0.5秒。因此最小的重发时间至少是1秒】 。不过,由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。 

数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4 倍的指数函数延长。 

此外,数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就 会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。

6.4.4 连接管理

TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。

UDP是一种面向无连接的通信协议,因此不检查对端是否可以通信,直接将UDP包发送出去。TCP与 此相反,它会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答(TCP中发 送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端。) 。如果对端发来确认应答,则认为可以 进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连 接的处理(FIN包)。 

可以使用TCP首部用于控制的字段来管理TCP连接【也叫控制域】 。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成【建立一个TCP连接需要发送3个包。这个过程 也称作“三次握手”】

6.4.5 TCP以段为单位发送数据

在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”【MSS: Maximum Segment Size】。最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。 

TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。 MSS是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在 TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小。

6.4.6 利用窗口控制提高速度

TCP以1个段为单位,每发一个段进行一次确认应答的处理。这样的传输方式有一个缺点。 那就是,包的往返时间越长通信性能就越低。

为解决这个问题,TCP引入了窗口这个概念。即使在往返时间较长的情况下,它也能控制网络性能的下降。确认应答不再是以每个分段,而是以更大的单位进行确认时,转发时间将会被大幅度的缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。

窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。窗口大小为4个段。

这个机制实现了使用大量的缓冲区【Buffer】在此处表示临时保存收发数据的场所。通常是 在计算机内存中开辟的一部分空间 ,通过对多个段同时进行确认应答的功能。

发送数据中高亮圈起的部分正是前面所提到的窗口。在这个窗口内的数据即便没有收到 确认应答也可以发送出去。此外,从该窗口中能看到的数据因其某种数据已在传输中丢失,所以发送端才 能收到确认应答,这种情况也需进行重发。为此,发送端主机在等到确认应答返回之前,必须在缓冲区中 保留这部分数据。 

在滑动窗口以外的部分包括尚未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收 到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。

 收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也被称为滑动窗口控制。

6.4.7 窗口控制与重发控制

在使用窗口控制中,如果出现段丢失该怎么办? 

首先,我们先考虑确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重 发的。然而,在没有使用窗口控制的时候,没有收到确认应答的数据都会被重发。而使用了窗口控制,某些确认应答即便丢失也无需重发。

当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,这个确认应答好像在提醒发送端“我想接收的是从1001开始的数据”。因此,在窗口比较大,又出现报文段丢失的情况下,同一 个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答【之所以连续收 到3次而不是两次的理由是因为,即使数据段的序号被替换两次也不会触发重发机制】 ,就会将其所对应 的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称作高速重发控制。

6.4.8 流控制

发送端根据自己的实际情况发送数据。但是,接收端可能收到的是一个毫无关系的数据包又可能会在 处理其他问题上花费一些时间。因此在为这个数据包做其他处理时会耗费一些时间,甚至在高负荷的情况 下无法接收任何数据。如此一来,如果接收端将本应该接收的数据丢弃的话,就又会触发重发机制,从而 导致网络流量的无端浪费。 

为了防止这种现象的发生,TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是所谓的流控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小, 于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。 

TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字 段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。 

不过,接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知 给发送端,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行 控制。这也就形成了一个完整的TCP流控制【流量控制】。

当接收端收到从3001号开始的数据段后其缓冲区即满,不得不暂时停止接收数据。之 后,在收到发送窗口更新通知后通信才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会 导致无法继续通信。为避免此类问题的发生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此 数据段仅含一个字节以获取最新的窗口大小信息。

6.4.9 拥塞控制

有了TCP的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大 量数据包。然而,如果在通信刚开始时就发送大量数据,也可能会引发其他问题。 

一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥 堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。 

TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数 据量进行控制。

首先,为了在发送端调节所要发送数据的量,定义了一个叫做“拥塞窗口”的概念。于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1MSS)(连接建立以后即刻从1MSS开始进行慢启动的话, 通过卫星通信等手段提高通信吞吐量所耗的时间会比较长。为此,有时也会将慢启动的初始值设置大于 1MSS的值。具体来说,MSS的值小于1095字节时最大为4MSS,小于2190字节时最大为4390字节,超过2190字 节时最大值大于2MSS。以太网的标准MSS值为1460字节,因此慢启动的初始值从4380字节【3MSS】开始就可 以。) 发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗 口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小那个值,发送比其还要小的数据 量。

如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。有了上述这些机 制,就可以有效地减少通信开始时连续发包【连续发包的情况也叫“爆发”【Burst】慢启动正是减少爆 发等网络拥堵情况的一种机制】 导致的网络拥堵,还可以避免网络拥塞情况的发生。 不过,随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥 塞的发生。为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超出这个阀值,在每收到一次确 认应答时,只允许以下面这种比例放大拥塞窗口:

拥塞窗口越大,确认应答的数目也会增加。不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过比一个数据段还要小的字节数。因此,拥塞窗口的大小会呈直线上升的趋势。 

TCP的通信开始时,并没有设置相应的慢启动阀值【与窗口的最大值相同】 。而是在超时重发时, 才会设置为当时拥塞窗口一半的大小。 

由重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同。因为前者要求至少3次的确认 应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。 

而由重复确认应答进行高速重发控制时,慢启动阀值的大小被设置为当时窗口大小的一半(严格来 说,是设置为“实际已发送但未收到确认应答的数据量”的一半。) 。然后将窗口的大小设置为该慢启动 阀值+3个数据段的大小。 

有了这样一种控制,TCP的拥塞窗口如图6.21所示发生变化。由于窗口的大小会直接影响数据被转发时 的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。 

当TCP通信开始以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降。于是 会再次进入吞吐量慢慢上升的过程。因此所谓TCP的吞吐量的特点就好像是在逐步占领网络带宽的感觉。

6.5 UDP首部的格式

数据的部分正是UDP的首部。UDP首部由源端口号,目标端口号,包长和校验和组成。

  • 源端口号

表示发送端端口号,字段长16位。该字段是可选项,有时可能不会设置源端口号。没有源端口号的时候该字段的值设置为0。可用于不需要返回的通信中

  • 目标端口号

表示接收端端口,字段长度16位。 

  • 包长度

该字段保存了UDP首部的长度跟数据的长度之和

  • 校验和

校验和是为了提供可靠的UDP首部和数据而设计。在计算校验和时,附加在UDP伪首部 与UDP数据报之前。通过在最后一位增加一个“0”将全长增加16倍。此时将UDP首部的校验和字段设置 为“0”。然后以16比特为单位进行1的补码【通常在计算机的整数计算中常用2的补码形式。而在校验和计算 中之所以使用1的补码形式,是因为即使有一位溢出会回到第1位,也不会造成信息丢失。而且在这种形式 下0可以有两种表示方式,因此有用0表示两种不同意思的优点, 并将所得到的1的补码和写入校验和字段。

6.6 TCP首部格式

TCP首部相比UDP首部要复杂得多。

  • 源端口号

表示发送端端口号,字段长16位。

  • 目标端口号

表示接收端端口号,字段长度16位。

  • 序列号

字段长32位。序列号【有时也叫序号】是指发送数据的位置。每发送一次数据,就累加一次该数据字 节数的大小。 

序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接 收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接 时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

  • 确认应答号

确认应答号字段长度32位。是指下一次应该收到的数据的序列号。实际上,它是指已收到确认应答号减一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。

  • 数据偏移

该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看作TCP首部的长 度。该字段长4位,单位为4字节(即32位)。不包括选项字段的话,TCP的首部为20字节长, 因此数据偏移字段可以设置为5。反之,如果该字段的值为5,那说明从TCP包的最一开始到20字节为止都 是TCP首部,余下的部分为TCP数据。

  • 保留

该字段主要是为了以后扩展时使用,其长度为4位。一般设置为0,但即使收到的包在该字段不为0,此包也不会被丢弃。

  • 控制位

字段长为8位,每一位从左至右分别为CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制 标志也叫做控制位。当它们对应位上的值为1时。

  • CWR

CWR标志与后面的ECE标志都用于IP首部的ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小。 

  • ECE

ECE标志表示ECN-Echo。置为1会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1。

  • URG

该位为1时,表示包中有需要紧急处理的数据。

  • ACK

该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为 1。

  • PSH

该位为1时,表示需要将受到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。

  • RST

该位为1时表示TCP连接中出现异常必须强制断开连接。例如,一个没有被使用的端口即使发来连接请 求,也无法进行通信。此时就可以返回一个RST设置为1的包。此外,程序宕掉或切断电源等原因导致主机 重启的情况下,由于所有的连接信息将全部被初始化,所以原有的TCP通信也将不能继续进行。这种情况 下,如果通信对方发送一个设置为1的RST包,就会使通信强制断开连接。

  • SYN

用于建立连接。SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定 【Synchronize本身有同步的意思。也就意味着建立连接的双方,序列号和确认应答号要保持同步】

  • FIN

该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主 机之间就可以相互交换FIN位置为1的TCP段。每个主机又对对方的FIN包进行确认应答以后就可以断开连 接。不过,主机收到FIN设置为1的TCP段以后不必马上回复一个FIN包,而是可以等到缓冲区中的所有数据 都因已成功发送而被自动删除之后再发。

  • 窗口大小

该字段长为16位。用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小【8位字节】。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解 最新的窗口大小。但这个数据必须是1个字节。

  • 校验和

TCP的校验和与UDP相似,区别在于TCP的校验和无法关闭。

  • 紧急指针

该字段长为16位。只有在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。正确 来讲,从数据部分的首位到紧急指针所指示的位置为止为紧急数据。因此也可以说紧急指针指出了紧急数 据的末尾在报文段中的位置。 如何处理紧急数据属于应用的问题。一般在暂时中断通信,或中断通信的情况下使用。例如在Web浏 览器中点击停止按钮,或者使用TELNET输入Ctrl + C时都会有URG为1的包。此外,紧急指针也用作表示数据流分段的标志。

  • 选项

选项字段用于提高TCP的传输性能。因为根据数据偏移【首部长度】进行控制,所以其长度最大为40 字节。

应用协议和网络安全

本模块介绍是的OSI参考模型中的第五层、第六层、第七层上半部分协议。

8.1 远程登录

远程登录是为了实现TSS 环境,是将主机和终端的关系应用到计算机网络上的一个结果。TSS中通常有一个处理能力非常强的主 机,围绕着这台主机的是处理能力没有那么强的多个终端机器。这些终端通过专线与主机相连。 类似地,实现从自己的本地计算机登录到网络另一端计算功能的应用就叫做远程登录。通过远程登录 到通用计算机或UNIX工作站以后,不仅可以直接使用这些主机上的应用,还可以对这些计算机进行参数设 置。远程登录主要使用TELNET和SSH【Secure SHell】 两种协议。

8.1.1 TELNET

TELNET利用TCP的一条连接,通过这一条连接向主机发送文字命令并在主机上执行。本地用户好像直 接与远端主机内部的Shell【Shell是操作系统提供给用户的、便于使用该系统中各种功能的一种用户接口。 它可以解释用户从键盘或鼠标输入的内容,并让操作系统执行。UNIX中的sh、csh、bash和Windows中的 Expolorer以及MAC OS的Finder等都属于同一范畴】相连着似的,直接在本地进行操作。

8.1.2 SSH

SSH是加密的远程登录系统。TELNET中登录时无需输入密码就可以发送,容易造成通信窃听和非法入 侵的危险。使用SSH后可以加密通信内容。即使信息被窃听也无法破解所发送的密码、具体命令以及命令返回的结果是什么。

SSH还包括很多非常方便的功能:

  • 可以使用更强的认证机制。 

  • 可以转发文件【UNIX中可以使用scp、sftp等命令 】

  • 可以使用端口转发功能【可以通过X Window System串口展现】

端口转发是指将特定端口号所收到的消息转发到特定的IP地址和端口号码的一种机制。由于经过SSH连 接的那部分内容被加密,确保了信息安全,提供了更为灵活的通信。

 8.2 文件传输

FTP是在两个相连的计算机之间进行文件传输时使用的协议。

FTP的工作机制概要

FTP是通过怎样的机制才得以实现文件传输的呢?它使用两条TCP连接:一条用来控制,另一条用于数据【文件】的传输。

用于控制的TCP连接主要在FTP的控制部分使用。例如登录用户名和密码的验证、发送文件的名称、发 送方式的设置。利用这个连接,可以通过ASCII码字符串发送请求和接收应答。在 这个连接上无法发送数据,数据需要一个专门的TCP进行连接。 

FTP控制用的连接使用的是TCP21号端口。在TCP21号端口上进行文件GET(RETR)、 PUT(STOR)、以及文件一览(LIST)等操作时,每次都会建立一个用于数据传输的TCP连接。数据的传 输和文件一览表的传输正是在这个新建的连接上进行。当数据传送完毕之后,传输数据的这条连接也会被 断开,然后会在控制用的连接上继续进行命令或应答的处理。 

通常,用于数据传输的TCP连接是按照与控制用的连接相反的方向建立的。因此,在通过NAT连接外 部FTP服务器的时候,无法直接建立传输数据时使用的TCP连接。此时,必须使用PASV命令修改建立连接 的方向才行。 

控制用的连接,在用户要求断开之前会一直保持连接状态。不过,绝大多数FTP服务器都会对长时间没 有任何新命令输入的用户的连接强制断开。

数据传输用的TCP连接通常使用端口20。不过可以用PORT命令修改为其他的值。最近,出于安全的考虑,普遍在数据传输用的端口号中使用随机数进行分配。 

8.3 电子邮件

电子邮件,顾名思义,就是指网络上的邮政。通过电子邮件人们可以发送编写的文字内容、数码相片,还可以发送各种报表计算得出的数据等所有计算机可以存储的信息。 

电子邮件的发送距离不受限,可以在全世界互联网中的任何两方之间进行收发。如果没有电子邮件, 出差时也就无法接收最新的邮件信息。电子邮件还可以提供邮件组的服务。它是指向邮件组中的所有用户 同时发送邮件的功能。邮件组现在被广泛用于公司或学校下达通知、不同国度的人们讨论共同的话题等场 景。出于以上这些优点,电子邮件已经成为当前人们普遍使用的一种服务。

电子邮件的工作机制

提供电子邮件服务的协议叫做SMTP(Simple Mail Transfer Protocol)。SMTP为了实现高效发送邮件内 容,在其传输层使用了TCP协议。 

早期电子邮件是在发送端主机与接收端主机之间直接建立TCP连接进行邮件传输。发送人编写好邮件 以后,其内容会保存在发送端主机的硬盘中。然后与对端主机建立TCP连接,将邮件发送到对端主机的硬盘。当发送正常结束后,再从本地硬盘中删除邮件。而在发送过程中一旦发现对端计算机因没有插电等原 因没有收到邮件时,发送端将等待一定时间后重发。 

这种方法,在提高电子邮件的可靠性传输上非常有效。但是,互联网应用逐渐变得越发复杂,这种机 制也将无法正常工作。例如,使用者的计算机时而关机时而开机的情况下,只有发送端和接收端都处于插 电并且开机的状态时才可能实现电子邮件的收发。由于日本属于东九时区,和美国之间存在时差。日本的 白天相当于美国的夜晚。如果大家都是只在白天开机,那么日本跟美国之间就根本无法实现收发邮件。由 于互联网是一个连接全世界所有人进行通信的网络,所以这种时差问题就不得不考虑在内。

8.4 WWW

万维网【WWW,World Wide Web】是将互联网中的信息以超文本【超文本用以显示文本及与文本相 关的内容】 形式展现的系统。也叫做Web。可以显示WWW信息的客户端软件叫做Web浏览器(Web浏览 器(Web Browser),有时也简称为浏览器。) 。目前人们常用的Web浏览器包括微软的Internet Explorer、 Mozilla基金会的Firefox、Google公司的Google Chrome、Opera 软件公司的Opera以及Apple公司的Safari等。

8.5 HTTP

当用户在浏览器的地址栏里输入所要访问Web页的URI以后,HTTP的处理即会开始。HTTP中默认使用 80端口。它的工作机制,首先是客户端向服务器的80端口建立一个TCP连接,然后在这个TCP连接上进行请 求和应答以及数据报文的发送。

总结

本篇博客主要讲述了TCP/IP的内容,大家可以去参考它的姊妹篇,应该对网络知识有个很清楚的认识,对于这些常识又是面试经常遇到的问题和底层,建议大家收藏起来,以备不时之需。

感谢大家

  1. 大家可以去阅读它的姊妹篇【图解HTTP与HTTPS】

  2. 如果你觉得这篇内容对你挺有有帮助的话: 点赞支持下吧,让更多的人也能看到这篇内容,本人会不断更新优质博客内容。

  3. 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。

  4. 觉得不错的话,也可以关注本人其他的有关iOS底层、Flutter及小程序方面的文章(感谢掘友的鼓励与支持🌹🌹🌹)

分类:
iOS
标签: