# 什么是 TCP/IP 协议?
TCP/IP 传输协议(Transmission Control Protocol/Internet Protocol),即传输控制 / 网络协议,也叫作网络通讯协议,是一组网络协议,它是互联网的基础。它定义了在网络中传输数据的格式和方式,并确保数据在传输过程中不丢失、不重复、不乱序。TCP 用于确保数据传输的可靠性,而 IP 用于确定数据包在网络中的路径。TCP/IP 传输协议是一个四层的体系结构,即应用层、传输层、网络层和数据链路层。
# 历史
TCP/IP 协议的历史可以追溯到上世纪 60 年代。当时,美国国防部高级研究计划署(ARPA)开始研发一种网络系统,以实现不同类型计算机之间的通信。这个网络系统被称为 ARPANET。
当时 ARPANET 使用的是一个叫网络控制协议(Network Control Protocol,NCP)的网络协议,但随着网络的发展和用户对网络的需求不断提高,设计者们发现,NCP 协议存在着很多的缺点以至于不能充分支持 ARPANET 网络,特别是 NCP 仅能用于同构环境中(所谓同构环境是网络上的所有计算机都运行相同的操作系统),设计者就认为 “同构” 这一限制不应被加到一个分布广泛的网络上。
1973 年,温顿・瑟夫(Vinton Cerf)和鲍勃・卡恩(Bob Kahn)在 ARPA 的支持下发明了 TCP 协议和 IP 协议,前一个协议负责在不同的计算机之间传输数据,确保数据在传输过程中不丢失,不重复,不乱序。后一个协议负责确定数据在网络中的路径。
1983 年,ARPA 将 TCP/IP 作为 ARPANET 的正式协议标准。随后,1984 年,TCP/IP 协议得到美国国防部的肯定,这使得 TCP/IP 成为了互联网的基础协议。
2005 年 9 月 9 日,卡恩和瑟夫由于对美国文化的卓越贡献获总统自由勋章。
现在,TCP/IP 已经成为了全球范围内的网络通信的基础协议,几乎所有的网络都在使用它,包括互联网,局域网和个人网络。
# 通信过程及协议
在网络通信的过程中,将发出数据的主机称为源主机,接收数据的主机称为目的主机。当源主机发出数据时,数据在源主机中从上层向下层传送。源主机中的应用进程先将数据交给应用层,应用层加上必要的控制信息就成了报文流,向下传给传输层。传输层将收到的数据单元加上本层的控制信息,形成报文段、数据报,再交给网际层。网际层加上本层的控制信息,形成 IP 数据报,传给网络接口层。网络接口层将网际层交下来的 IP 数据报组装成帧,并以比特流的形式传给网络硬件(即物理层),数据就离开源主机。
# 链路层
以太网协议规定,接入网络的设备都必须安装网络适配器,即网卡,数据包必须是从一块网卡传送到另一块网卡。而网卡地址就是数据包的发送地址和接收地址,有了 MAC 地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标 MAC 地址,然后和自己的 MAC 地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。
所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。
# 网络层
# IP 协议
网络层引入了 IP 协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的 IP 地址。IP 协议将这个 32 位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。如果两个 IP 地址在同一个子网内,则网络地址一定相同。为了判断 IP 地址中的网络地址,IP 协议还引入了子网掩码,IP 地址和子网掩码通过按位与运算后就可以得到网络地址。
# ARP 协议
即地址解析协议,是根据 IP 地址获取 MAC 地址的一个网络层协议。其工作原理如下:ARP 首先会发起一个请求数据包,数据包的首部包含了目标主机的 IP 地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出包头里的 IP 地址,然后和自己的 IP 地址进行比较,如果相同就返回自己的 MAC 地址,如果不同就丢弃该数据包。ARP 接收返回消息,以此确定目标机的 MAC 地址;与此同时,ARP 还会将返回的 MAC 地址与对应的 IP 地址存入本机 ARP 缓存中并保留一定时间,下次请求时直接查询 ARP 缓存以节约资源。
# 路由协议
首先通过 IP 协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过 ARP 协议查询对应的 MAC 地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标 IP 所在的子网中,然后再通过 ARP 获取目标机 MAC,最终也是通过广播形式将数据包发送给接收方。而完成这个路由协议的物理设备就是路由器,路由器扮演着交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。
所以,网络层的主要工作是定义网络地址、区分网段、子网内 MAC 寻址、对于不同子网的数据包进行路由。
# 传输层
链路层定义了主机的身份,即 MAC 地址,而网络层定义了 IP 地址,明确了主机所在的网段,有了这两个地址,数据包就可以从一个主机发送到另一台主机。但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。而每台电脑都有可能同时运行着很多个应用程序,所以当数据包被发送到主机上以后,是无法确定哪个应用程序要接收这个包。因此传输层引入了 UDP 协议来解决这个问题,为了给每个应用程序标识身份。
# UDP 协议
UDP 协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP 协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP 协议就诞生了。
# TCP 协议
TCP 即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说 TCP 就是有确认机制的 UDP 协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。为了保证传输的可靠性,TCP 协议在 UDP 基础之上建立了三次对话的确认机制,即在正式收发数据前,必须和对方建立可靠的连接。TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。
传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP 协议可以保证数据传输的可靠性。
# 应用层
理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差,因此,应用层定义了各种各样的协议来规范数据格式,常见的有 http,ftp,smtp 等,在请求 Header 中,分别定义了请求数据格式 Accept 和响应数据格式 Content-Type,有了这个规范以后,当对方接收到请求以后就知道该用什么格式来解析,然后对请求进行处理,最后按照请求方要求的格式将数据返回,请求端接收到响应后,就按照规定的格式进行解读。
所以应用层的主要工作就是定义数据格式并按照对应的格式解读数据。
# 安全问题
# 链路层上的攻击
在 TCP/IP 网络中,链路层这一层次的复杂程度是最高的。其中最常见的攻击方式通常是网络嗅探组成的 TCP/IP 协议的以太网。当前,我国应用较为广泛的局域网是以太网,且其共享信道利用率非常高。以太网卡有两种主要的工作方式,一种是一般工作方式,另一种是较特殊的混杂方式。这一情况下,很可能由于被攻击的原因而造成信息丢失情况,且攻击者可以通过数据分析来获取账户、密码等多方面的关键数据信息。
# 网络层上的攻击
# ARP 欺骗
ARP(地址解析协议)是根据 IP 地址获取物理地址的一个 TCP/IP 协议。通常情况下,在 IP 数据包发送过程中会存在一个子网或者多个子网主机利用网络级别第一层,而 ARP 则充当源主机第一个查询工具,在未找到 IP 地址相对应的物理地址时,将主机和 IP 地址相关的物理地址信息发送给主机。与此同时,源主机将包括自身 IP 地址和 ARP 检测的应答发送给目的主机。如果 ARP 识别链接错误,这样的话 ARP 直接应用可疑信息,那么可疑信息就会很容易进入目标主机当中。ARP 协议没有状态,不管有没有收到请求,主机会将任何受到的 ARP 相应自动缓存。如果信息中带有病毒,采用 ARP 欺骗就会导致网络信息安全泄露。因此,在 ARP 识别环节,应加大保护,建立更多的识别关卡,不能只简单通过 IP 名进行识别,还需充分参考 IP 相关性质等。
# ICMP 欺骗
ICMP 协议也是因特网控制报文协议,主要用在主机与路由器之间进行控制信息传递。通过这一协议可对网络是否通畅、主机是否可达、路由是否可用等信息进行控制。一旦出现差错,数据包会利用主机进行即时发送,并自动返回描述错误的信息。该协议在网络安全当中是十分重要的协议。但由于自身特点的原因,其极易受到入侵,通常而言,目标主机在长期发送大量 ICMP 数据包的情况下,会造成目标主机占用大量 CPU 资源,最终造成系统瘫痪。
# 传输层上的攻击
在传输层还存在网络安全问题。如在网络安全领域中,IP 欺骗就是隐藏自己的有效手段,主要是通过将自身 IP 地址进行伪造,并向目标主机发送恶意的请求,攻击主机,而主机却因为 IP 地址被隐藏而无法准确确认攻击源。或者通过获取目标主机信任而趁机窃取相关的机密信息。在 DOS 攻击中往往会使用 IP 欺骗,这是因为数据包地址来源较广泛,无法进行有效过滤,从而使 IP 基本防御的有效性大幅度下降。此外,在 ICMP 传输通道,由于 ICMP 是 IP 层的组成部分之一,在 IP 软件中任何端口向 ICMP 发送一个 PING 文件,借此用作申请,申请文件传输是否被允许,而 ICMP 会做出应答,这一命令可检测消息的合法性。所有申请传输的数据基本上传输层都会同意,造成这一情况的原因主要是 PING 软件编程无法智能识别出恶意信息,一般网络安全防护系统与防火墙会自动默认 PING 存在,从而忽视其可能带来的安全风险。
# 应用层上的攻击
对于因特网而言,IP 地址与域名均是一一对应的,这两者之间的转换工作,被称为域名解析。而 DNS 就是域名解析的服务器。DNS 欺骗指的是攻击方冒充域名服务器的行为,使用 DNS 欺骗能将错误 DNS 信息提供给目标主机。所以说,通过 DNS 欺骗可误导用户进入非法服务器,让用户相信诈骗 IP。另外,PTP 网络上接口接受到不属于主机的数据,这也是应用层存在的安全问题,一些木马病毒可趁机入侵,造成数据泄露,从而引发网络安全问题。