前面我们提到过OSI七层模型, 首先来看一下TCP/IP四层模型与OSI七层模型之间的大致对应关系以及各层对应的部分网络协议.
下面我们就TCP/IP每层的功能以及每层的重要协议做一个简单了解.
根据TCP/IP模型与OSI模型的对应关系我们可以看出, TCP/IP里面的数据链路层包含了OSI里面的数据链路层与物理层.
OSI的物理层是负责数据传输的硬件, 比如双绞线电缆/无线/光纤等, 主要进行比特流的传输.
OSI的数据链路层主要负责物理寻址, 同时将原始比特流变为逻辑传输线路.
而TCP/IP中的数据链路层就包括了物理层和链路层. 物理层部分是计算机硬件, 比如网络接口卡等; 而链路层部分就相当于驱动程序. 链路层在计算机硬件和操作系统之间的一个桥梁.
网络层负责地址管理和路由选择.
网络层主要使用的协议为IP协议. IP协议基于IP地址转发分包数据.
前面提到的数据链路层是设备驱动程序和网络接口层面的, 那么网络层和传输层的功能就是由操作系统提供的.
下面来具体看一下网络层的一些重要协议:
IP是跨越网络传送分组数据包, 使整个互联网都能收到数据的协议, 这期间它使用IP地址作为主机的标识.
IP还隐含着数据链路层的功能, 通过IP, 相互通信的主机之间无论经过怎样的底层数据链路都能够实现通信.
但是, 虽然IP是分组交换的一种协议, 但是它不具有重发机制, 所以是非可靠性传输协议. 即使分组数据包未能到达对端主机也不会重发.
连接互联网的所有主机跟路由器都必须实现IP的功能, 即通过网络层转发分组数据包. 尤其是路由器.
虽然IP不提供可靠的传输服务, 但是如果在IP协议传输数据包时出错了, 可以通过ICMP报告, ICMP在IP模块中实现.
ICMP, Internet控制报文协议(IP协议的小弟). 当IP数据包在发送途中一旦发生异常导致无法到达对端目标地址时, 需要给发送端发送一个异常的通知, ICMP就是为这一功能制定的, 它有时也被用来诊断网络的健康状况.
ARP协议就是将分组数据包中的IP地址解析为MAC地址的协议, 因为数据链路层通信采用的是MAC地址.
相对应的还有一个RARP协议, RARP协议就是将MAC地址解析为IP地址的协议.
传输层最主要的功能就是能够让应用程序之间实现通信. 也就是为两台主机提供端对端的通信.
计算机内部通常运行着多个应用程序, 为了区分是哪些程序和哪些程序在进行通信, 计算机采用端口号来进行识别和管理.
传输层最重要的两个协议就是TCP协议和UDP协议了.
TCP是一种面向有连接的传输层协议. 它可以保证两端通信主机之间的通信可达.
TCP能够正确处理在传输过程中的丢包/传输顺序错乱等异常情况. 此外, TCP还能够有效利用带宽, 缓解网络拥堵.
然而, TCP如此可靠的通信时需要付出代价的, 有时它需要至少7次的发包和收包, 导致网络流量的浪费. 关于它如何能保证通信可达, 我们在后面的博客中将详细介绍.
UDP是一种面向无连接的传输层协议. UDP不会关注对端是否收到了传送的数据. 如果需要检查对端是否收到了分组数据包, 或者对端是否连接到网络, 则需要我们自己在应用程序中实现.
应用层主要负责处理特定的应用程序细节.
TCP/IP分层模型中将OSI中的应用层/表示层/会话层全都集中到了应用层中实现. 比如TCP/IP模型中的应用层要进行数据格式的处理, 要对通信进行管理, 确定连接方式等.
鉴于如此纷繁复杂的功能, 应用层有很多协议, 比如HTTP, SMTP等, 下面我们来大概了解一下常用的应用层协议.
发送电子邮件时用到的协议叫做SMTP协议(简单邮件传输协议). 但是早期的电子邮件只能发送文本格式的电子邮件, 而现在, 电子邮件的格式由MIME(多用途互联网邮件扩展类型)协议扩展之后, 就能发送声音/图片/视频等多种类型的数据.
MIME: 在互联网上广泛使用的/用来定义邮件数据格式的一种规定.
文件传输是指将保存在本机磁盘上的文件转移到其它计算机硬盘上, 或将其它计算机硬盘上的文件转移到本机的磁盘上. 文件传输过程中使用的协议叫文件传输协议, 即FTP.
使用FTP进行文件传输时, 可以选择用二进制方式还是文本方式.
在FTP进行文件传输时会建立两个TCP连接, 分别是传输请求时所要用到的控制连接, 和实际传输数据时所要用到的数据连接.
像上面说到的传输格式, 这就是原来属于OSI模型中表示层的功能, 而传输时建立的两个连接以及何时建立这两个连接就是原来属于OSI模型中会话层的功能.
在TCP/IP中进行网络管理时, 使用SNMP(简单网络管理协议). 使用SNMP管理的主机/路由器/网桥等都称为SNMP代理, 而管理的那一端称为管理器.
在SNMP的代理端, 保存着网络接口的信息/通信数据量/异常数据量以及设备温度等信息.
一个网络范围越大, 结构越复杂, 就越需要对其进行嗯有效的管理, 而SNMP可以让管理员即是检查网络的拥堵情况, 及早发现故障, 也可以为以后扩大网络收集必要的信息.
我们先来看一下一个数据包在TCP/IP通信过程中的变化过程:
在每个分层中, 都会对所发送的数据附加一个首部. 在这个首部中, 包含了该层的必要信息, 如发送的目标地址以及协议相关的信息. 在下一层的角度来看, 从一层收到的包全部都被认为是本层的数据.
在TCP/IP传输数据的过程中, 有几个专有名词, 包/帧/数据报/段/消息.
数据包的首部结构是由协议的具体规范详细定义, 例如, 识别上一层协议的域应该从包的哪一位开始取多少个比特, 如何计算校验和并插入包的哪一位等. 在数据报的首部, 明确标明了协议应该如何读取数据.
下面我们以甲给乙发送一封”早上好”的邮件来看一下TCP/IP通信的大致过程.
当甲写好这封邮件点击发送之后, 这封邮件数据就进入到TCP/IP通信的处理流程中.
我们先来看一下这个邮件数据包的发送流程是什么样的.
当点击了”发送”之后, 应用层首先会进行编码格式处理, 比如将数据的编码转换为UTF-8或者其它编码格式.
编码转换之后, 邮件其实并不一定会被马上被发出去, 因为有的邮箱软件可能会提供一次同时发送多个邮件的功能, 也就是说在一次连接建立期间可能要发送多封邮件的数据包, 应用在发送邮件的那一刻开始建立TCP连接, 从而利用这个TCP连接发送数据, 它的过程首先是将应用的数据发送给下一层的TCP, 再做实际的转发处理.
这样分析下来, 本层进行的编码格式转化处理可以宽泛地认为是之前OSI表示层的功能, 而一次建立发送多封邮件的数据包, 即何时建立连接何时断开连接可以宽泛地认为这个之前OSI会话层的功能.
在传输层, TCP根据应用层的指示(即何时建立连接/何时断开连接), 负责建立连接/发送数据以及断开连接. TCP提供将应用层发送过来的数据顺利发送至对端的可靠传输.
为了实现TCP这一功能, 需要在数据包首部加上TCP首部. TCP首部中包含源端口号和目标端口号(用以识别发送主机跟接收主机上的应用), 序号(用以表示该包中的数据是发送端整个数据中第几字节的序列号)以及校验和(用以判断数据是否被破坏).
网络层工作的主要是IP协议. IP协议将TCP传过来的TCP首部和TCP数据合起来当作自己的数据, 并在TCP首部的前端附加上自己的IP首部信息.
IP首部中包含着发送端的IP地址和接收端的IP地址. 紧随IP首部信息之后的还有用来判断后面数据是TCP还是UDP的信息.
IP包生成之后, 参考路由控制标选定一条路由, 确定这条路由上要接收此IP包的路由器和主机. 随后, IP包将被发送给这些连接路由器或主机网络接口的驱动程序, 以实现真正的发送数据.
如果不知道接收端的MAC地址, 可以利用ARP协议解析出MAC地址, 只要知道了对端的MAC地址, 就可以将MAC地址和IP地址交给以太网的驱动程序, 实现数据传输.
从网络层传过来的IP包, 对以太网驱动来说不过就是数据. 数据链路层会给接收到的IP包首部附上自己的以太网首部信息. 以太网首部中包含发送端的MAC地址/接收端的MAC地址以及标志以太网类型的以太网数据的协议.
在数据链路层, 不仅要给包的首部附加信息, 还有在尾部附上一端帧校验序列(FCS). FCS是为了判断数据包在发送过程中是否由于噪声而被破坏.
添加了首部和尾部的以太网数据包就可以通过本层的物理层部分传输给接收端了.
包在TCP/IP分层中流动的时候, 从前往后依次被附加了以太网包首部/IP包首部/TCP包首部(或者UDP包首部)/应用自己的包首部和数据, 而在尾部则追加了以太网包尾.
每个包首部中至少都会包含两个信息: 一个是发送端和结合艘端地址, 另一个是上一层协议的类型.
经过每个协议分层时, 都必须有识别包发送端和接收端的信息. 以太网会使用MAC地址, IP会使用IP地址, TCP/UDP会使用端口号作为识别两端主机的地址, 即使时在应用程序中, 也会有像电子邮件地址这样的信息作为地址标识.
此外, 每个包的包首部中还包含一个识别位, 它是用来标识上一层协议的种类信息. 例如以太网的包首部中的以太网类型, IP中的协议类型以及TCP/UDP中两个端口的端口号都其着识别协议类型的作用. 在应用的首部信息中由是也会包含一个用来识别其数据类型的标签.
包的接收流程是发送流程的逆序过程.
当主机收到以太网包之后, 首先会从以太网的包首部找到MAC地址判断是否为发送给自己的包, 如果不是, 则丢弃.
如果是发送给自己的包, 就查找以太网包首部中的类型域从而确定以太网传送过来的数据的协议类型 当前这个例子的数据类型是IP协议包, 因此要再将数据传给处理IP协议的子程序; 如果这时候不是IP协议而是其它的协议, 比如ARP等, 就将数据传给ARP处理等.
如果以太网的首部的类型域包含了一个无法识别的协议类型, 则丢弃数据.
网络层在收到IP包之后也会进行相似的处理, 如果判断出包的首部的IP地址信息与自己的IP地址相匹配, 则接收数据并从中查找上一层的协议.
如果上一层的协议是TCP协议, 就传给TCP处理; 如果是UDP协议, 就传给UDP处理.
对于有路由器的情况下, 接收端地址往往不是自己的地址, 需要借助路由控制表, 在调查应该送达的主机或路由器以后再转发数据.
在TCP模块中首先会计算一下校验和, 判断数据是否被破坏. 然后检查是否在按照序号接收数据. 最后检查端口号, 确定具体的应用程序.
数据在接收完毕之后, 接收端会发送一个”确认回执”给发送端, 如果这个回执信息未能到达发送端, 那么发送端会认为接收端没有收到数据而一直反复发送.
数据被完整地接收之后, 会传给由端口号识别的应用程序.
接收端应用程序会直接接收发送端发送的数据.
就这个发送邮件的例子而言, 接收端通过解析数据可以获知邮件的收件人是乙的地址. 如果主机B没有乙的邮件信箱, 那么主机B将返回一个”无此收件地址”的报错信息给发送端.
如果不存在没有乙的收件地址这种情况, 那么接收端会返回一个”处理正常”的回执给发送端. 反之, 如果出现磁盘已满/邮件未能成功保存等问题, 就会发送一个”处理异常”的回执给发送端.
这样, 用户乙就可以开心地阅读甲发来的邮件啦~