TCP/IP协议是一系列网络协议的总和,是构成网络通信的核心骨架。
TCP/IP的工作原理通俗的讲就是一个主机的数据要经过哪些过程才能发送到对方的主机上。
TCP/IP协议采用四层结构,分别为应用层,传输层,网络层和链路层。每一层都有特定的协议和对方通信,而协议之间的通信最终都要转化为0和1的电信号,通过物理介质进行传输才能到达对方的电脑,因此物理介质就是网络通信的基石。
我们先通过一张图来了解一下TCP/IP协议的基本框架:
网络通信就好比是送快递,一般情况下快递是不能直接送达的,需要先转发到对应的配送站,然后由配送站再进行派件。
派送车就是物理介质,派送站就是网关,快递员就是路由器,收货地址就是IP地址,联系方式就是MAC地址。
当通过Http发起一个请求时,应用层,传输层,网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包,通过物理介质传输给对方主机,收到数据包后,再一层一层采用对应的协议进行拆包,最后把应用层数据交给对应的应用程序处理。
1. 链路层
完整的数据包如下:
整个数据帧由首部,数据和尾部组成。
首部固定为14个字节,包含了目标MAC地址,源MAC地址和类型。尾部固定为4个字节,表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。
因此,以太网通过对电信号进行分组并形成数据帧,然后通过物理介质把数据帧发送给接受方,那么以太网是如何来识别接受方的身份呢?
以太网协议规定,接入网络的设备都必须安装网络适配器,,即网卡,数据包必须从一块网卡传送到另一块网卡,而网卡地址就是数据包的发送和接收地址,也就是帧首部包含的MAC地址,MAC地址就是每块网卡的身份标识,如同我们的身份证号,具有全球唯一性。MAC地址采用十六进制标识,共6个字节(48位),前三个字节是厂商编号,后三个是网卡流水号,如4A-0F-6D-32-B2-18。
有了MAC地址,以太网就以广播的形式把数据包发送给该子网内的所有主机,子网内的每台主机在接受到这个包以后,都会读取首部里的目标MAC地址。然后和自己的MAC地址进行对比,如果相同就进行下一步处理,不同就丢弃。
2. 网络层
对于上面的过程,有几个细节需要注意:
(1) 发送者如何知道接收者的MAC地址?
(2) 发送者如何知道接收者和自己同属一个子网?
(3) 如果接收者和自己不在同一个子网,数据包如何发送给对方?
为了解决以上问题,下面我们来看看网络层的三个协议,分别是IP协议,ARP协议,路由协议。
IP协议(互联网协议地址)
如果两个IP地址同在一个子网内,则网络地址一定相同。
为了判断IP地址中的网络地址,IP协议还引入了子网掩码,IP地址和子网掩码通过按位与运算就可以得到网络地址。
由于发送者和接收者的IP地址是已知的(应用层的协议会传入),因此我们只要通过子网掩码对两个IP地址进行AND运算就可以判断双方是不是同一个子网了。
IP地址的子网掩码的作用:子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
子网掩码的设定必须遵循一定的规则。与二进制IP地址相同,子网掩码由1和0组成,且1和0分别连续。子网掩码的长度也是32位,左边是网络位,用二进制数字"1"表示,1的数目等于网络位的长度;右边是主机位,用二进制数字"0"表示,0的数目等于主机位的长度。这样做的目的是为了让掩码与ip地址做按位与运算时用0遮住原主机数,而不改变原网络段数字,而且很容易通过0的位数确定子网的主机数(2的主机位数次方-2,因为主机号全为1时表示该网络广播地址,全为0时表示该网络的网络号,这是两个特殊地址)。只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。
ARP协议
即地址解析协议,通过IP地址获取MAC地址的一个网络层协议。
路由协议
ARP的MAC寻址还是局限在同一个子网中,路由协议是处理两个主机不在同一个子网中,如果不在同一子网中,以太网会将该数据包转发给本子网的网关进行路由。网关是子网与子网之间的桥梁,所以网关会进行多次转发,最终将数据包转发到目标IP所在的子网中。
3. 传输层
链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。而每台电脑都有可能同时运行着很多个应用程序,所以当数据包被发送到主机上以后,是无法确定哪个应用程序要接收这个包。
因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份,UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息。 这样,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP定义的数据包就叫做UDP数据包,结构如下所示:
UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。
UDP协议比较简单,实现容易,但它没有确认机制, 数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了,TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。
为了保证传输的可靠性,TCP 协议在 UDP 基础之上建立了三次对话的确认机制,也就是说,在正式收发数据前,必须和对方建立可靠的连接。由于建立过程较为复杂,我们在这里做一个形象的描述:
主机A:我想发数据给你,可以么?
主机B:可以,你什么时候发?
主机A:我马上发,你接着!
经过三次对话之后,主机A才会向主机B发送正式数据,而UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发过去了。所以 TCP 能够保证数据包在传输过程中不被丢失,但美好的事物必然是要付出代价的,相比 UDP,TCP 实现过程复杂,消耗连接资源多,传输速度慢。
TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过IP数据包的长度,以确保单个 TCP 数据包不必再分割。
传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。
4. 应用层
理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等,HTTP 是一种比较常用的应用层协议。
有了这个规范以后,服务端收到请求以后,就能正确的解析客户端发来的数据,当请求处理完以后,再按照客户端要求的格式返回,客户端收到结果后,按照服务端返回的格式进行解析。
所以应用层的主要工作就是定义数据格式并按照对应的格式解读数据。
总结
当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络层协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。