图解TCP IP第五版 第二章 TCP IP基础知识 - yiyixiaozhi/readingNotes GitHub Wiki
title: 图解TCP/IP第五版 - 第二章 date: 2020-2-23 description: 第二章 TCP/IP基础知识 categories: - 工具 tags: - TCP/IP
实践出真知
关键字:
- RFC
- TCP/IP协议分层模型
- 数据包
20世纪60年代,很多大学和研究机构都开始着力于新的通信技术。为了实现分布式传输,保证通信不中断,分组交换技术便应运而生。这种技术可以使多个用户同一时间共享一条通信线路进行通信,从而提高了线路的使用效率,也降低了搭建线路的成本。
1969年,为验证分组交换技术的实用性,研究人员搭建了一套网络。该网络被人们称作ARPANET,也是全球互联网的鼻祖。在20世纪70年代前半叶,ARPANET中的一个研究机构研发出了TCP/IP。
20世纪80年代是UNIX工作站迅速普及的时代,BSD UNIX实现了TCP/IP协议,大学和研究机构也逐渐开始将ARPANET连接到了NSFnet网络。此后,基于TCP/IP而形成的世界性范围的网络--互联网(The Internet)便诞生了。
TCP/IP的标准化中有其他协议的标准化没有的要求。这一点就是让TCP/IP想比较OSI协议更迅速地普及。
IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP的协议。它们与TCP或IP的关系紧密,是互联网必不可少的组成部分。TCP/IP一词泛指这些协议,因此,有时也称TCP/IP为网际协议族。
TCP/IP的协议由IETF讨论制定。那些需要标准化的协议,被人们列入RFC(Request For Comment)文档并在互联网上公布。RFC不仅记录了协议规范内容,还包含了协议的实现和运用的相关信息,以及实验方面的信息。
TCP/IP协议的标准化流程大致分为以下几个阶段:首先是互联网草案阶段;其次,如果认为可以进行标准化,就记入RFC提议标准阶段;第三,是草案标准阶段;最后,才进入真正的标准阶段。
互联网进行通信时,需要相应的网络协议,TCP/IP原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是TCP/IP,TCP/IP就是互联网的协议。
互联网中的每个网络都是由骨干网(BackBone)和末端网(Stub)组成的。每个网络之间通过NOC相连。如果网络的运营商不同,它的网络连接方式和使用方法也会不同。连接这种异构网络需要有IX的支持。总之,互联网就是众多异构的网络通过IX互连的一个巨型网络。
图:互联网的结构
ISP:Internet Service Provider,互联网服务提供商 IX:Internet Exchange,网络交换中心 NOC:Network Operation Center,网络操作中心
连接互联网需要向ISP或区域网提出申请。公司企业或一般家庭申请入网只要联系ISP签约即可。
图:OSI参考模型与TCP/IP的关系
上图列出了TCP/IP与OSI分层之间的大致关系。TCP/IP与OSI在分层模块上稍有区别。OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调”在计算机上实现协议应该开发哪种程序”。
TCP/IP是在网络互连的设备之间能够通信的前提下才被提出的协议。所以针对物理层没有明确定义。
网络接口层利用以太网中的数据链路层进行通信,因此属于接口层。也就是说,把它当做让NIC起作用的“驱动程序”也无妨。**驱动程序是在操作系统与硬件之间起桥梁作用的软件。**计算机的外围附加设备或扩展卡,不是直接插到电脑上或电脑的扩展槽上就能马上使用的,还需要有相应驱动程序的支持。现在也有很多是即插即拔的设备,那是因为计算机的操作系统中早已经内置安装好了对应网卡的驱动程序,而并非不需驱动。
互联网层与传输层的功能通常由操作系统提供。尤其是路由器,它必须得实现通过互联网层转发分组数据包的功能。
- IP(网际互连协议) IP是跨越网络传送数据包,使用IP地址作为主机的标识。
- ICMP(Internet控制报文协议) IP数据包在发送途中一旦发生异常导致无法到达对端目标地址时,需要给发送端发送一个发生异常的通知。
- ARP(地址解析协议) 从分组数据包的IP地址中解析出物理地址(MAC地址)的一种协议。
- TCP TCP是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外,TCP还能够有效利用带宽,缓解网络拥堵。 为了建立与断开连接,有时它需要至少7次的发包收包,导致网络流量的浪费。此外,为了提高网络的利用率,TCP协议中定义了备种各样复杂的规范,因此不利于视频会议(音频、视频的数据量既定)等场合使用。
- UDP UDP有别于TCP,它是一种面向无连接的传输层协议。UDP不会关注对端是否真的收到了传送过去的数据,如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。 UDP常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。
TCP/IP的分层中,将OSI参考模型中的会话层、表示层和应用层的功能都集中到了应用程序中实现。这些功能有时由一个单一的程序实现,有时也可能会由多个程序实现。
WWW万维网、Email电子邮件、FTP文件传输、TELNET/SSH远程登录、SNMP网络管理。
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。如下图,在下一层的角度看,从上一分层收到的包全部都被认为是本层的数据。
图:数据包首部的层次化
以发送邮件为例:
应用层、表示层:
首先,应用程序中会进行编码处理。
会话层:
编码转化后,实际邮件不一定会马上被发送出去,对于何时建立通信连接何时发送数据的管理功能,从某种宽泛的意义上看属于OSI参考模型中会话层的功能。应用在发送邮件的那一刻建立TCP连接,从而利用这个TCP 连接发送数据。它的过程首先是将应用的数据发送给下一层的TCP,再做实际的转发处理。
传输层:
TCP根据应用的指示,负责建立连接、发送数据以及断开连接。TCP提供将应用层发来的数据顺利发送至对端的可靠传输。
为了实现TCP的这一功能,需要在应用层数据的前端附加一个TCP首部。TCP首部中包括源端口号和目标端口号(用以识别发送主机跟接收主机上的应用)、序号(用以发送的包中哪部分是数据)以及校验和(用以判断数据是否被损坏)。随后将附加了TCP首部的包再发送给IP。
网络层:
IP将TCP传过来的TCP首部和TCP数据合起来当做自己的数据,并在TCP首部的前端在加上自己的IP首部,生成IP包,IP包生成后,参考路由控制表决定接受此IP包的路由或主机。随后,IP包将被发送给连接这些路由器或主机网络接口的驱动程序,以实现真正发送数据。
如果尚不知道接收端的MAC地址,可以利用ARP(Address Resolution Protocol)查找。只要知道了对端的MAC地址,就可以将MAC地址和IP地址交给以太网的驱动程序,实现数据传输。
数据链路层:
从IP传过来的IP包,对于以太网驱动来说不过就是数据。给这数据附加上以太网首部并进行发送处理。以太网首部中包含接收端MAC地址、发送端MAC地址以及标志以太网类型的以太网数据的协议。根据上述信息产生的以太网数据包将通过物理层传输给接收端。发送处理中的FCS(Frame Check Sequence,帧检验序列)由硬件计算,添加到包的最后。设置FCS的目的是为了判断数据包是否由于噪声而被破坏。
图:分层中包的结构
分组数据包经过以太网的数据链路时的大致流程如上图所示。
包流动时,从前往后依此被附加了以太网包首部、IP包首部、TCP包首部(或者UDP包首部)以及应用自己的包首部和数据。而包的最后则追加了以太网包尾(Ethernet Trailer)。
每个包首部中至少都会包含两个信息:一个是发送端和接收端地址,另一个是上一层的协议类型。
经过每个协议分层时,都必须有识别包发送端和接收端的信息。以太网会用MAC地址,IP会用IP地址,而TCP/UDP则会用端口号作为识别两端主机的地址。即使是在应用程序中,像电子邮件地址这样的信息也是一种地址标识。这些地址信息都在每个包经由各个分层时,附加到协议对应的包首部里边。
此外,每个分层的包首部中还包含一个识别位,它是用来标识上一层协议的种类信息。例如以太网的包首部中的以太网类型,IP中的协议类型以及TCP/UDP中两个端口的端口号等都起着识别协议类型的作用。就是在应用的首部信息中,有时也会包含一个用来识别其数据类型的标签。
- 网络接口(以太网驱动)的处理 主机收到以太网包以后,首先从以太网的包首部找到MAC地址判断是否为发给自己的包。如果不是发给自己的包则丢弃数据。 如果这时不是IP而是其他诸如ARP的协议,就把数据传给ARP处理。
- IP模块的处理 如果判断得出包首部中的IP地址与自己的IP地址匹配,则可接收数据并从中查找上一层的协议。如果上一层是TCP就将IP包首部之后的部分传给TCP处理;如果是UDP则将IP包首部后面的部分传给UDP处理。对于有路由器的情况下,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送达的主机或路由器以后再转发数据。
- TCP模块的处理 在TCP模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定县体的应用程序。 数据接收完毕后,接收端则发送一个“确认回执”给发送端。如果这个回执信息未能达到发送端,那么发送端会认为接收端没有接收到数据而一直反复发送。 数据被完整地接收以后,会传给由端口号识别的应用程序。
- 应用程序的处理 接收端应用程序会直接接收发送端发送的数据。